My External Storage

Aug 12, 2018 - 10 minute read - Comments - report go

mercari.go #2 参加メモ #mercarigo

mercari.go #2に参加してきた。今回はGoの話だけでなく、GraphQLについても勉強することができた。
次回は9月開催にGopherCon2018の参加報告を予定しているとのこと。

イベント名 mercari.go #2
URL https://mercari.connpass.com/event/95665/
会場 株式会社メルカリ 東京都港区六本木6-10-1(六本木ヒルズ森タワー18F)
日時 2018/08/10(金) 19:30 〜 22:00
ハッシュタグ #mercarigo
Tweetまとめ mercari.go #2 ツイートまとめ

所感

今回はQAやインフラよりの部分でGoがどのように使われているか、使うことができるかの紹介が多かった。
サービス自体のコードだけでなく、開発の効率化にもしっかりと開発工数をあけて問題解決に取り組んでいるのを聞くことができてさすがだなという感じだった。
インフラまわりのミドルウェアやツールでもGoの1バイナリになる成果物、高い平行性などの特徴を活かして課題解決を行なっているということだった。
開発中にある日常的な悩みをGoでどんどん解決できているのは羨ましい(と言っていないで自分もやらないといけない)。
また、GraphQLの発表もあり、実装で考慮すべき点など非常にわかりやすかった。
GraphQLを遊ぶにはGitHub API v4 APIのExplorerがインタラクティブな補完・仕様の参照ができて良いらしい。これはGraphQLに限らずAPI仕様を公開するときはこのようなUXを提供できるとみんなに興味を持ってもらえるんだろうなと思った。
How to GraphQLは会社の先輩もわかりやすいと言っていたので機会があったら触ってみたいと思う。

以下、メモ

メルカリにおける開発環境/QA環境と、そこで使われるGoのツールについて

@masudak

Software Engineer in Test(SET)とは

  • テストが作りやすい環境を作る
  • 他社ではSDET, SWET, SETIなどの呼び方をしている

SET設立の背景

  • SETチームの設立背景と次世代のSETに向けて
  • UK向けサービスを作ることになった
  • 当時QAは4人日くらいでマニュアルテストをしていた
  • このままの状態でサービスのリージョンが増えるとスケールしないので効率化が必要だった

当時の開発フローと開発環境

  • PM(プロダクトマネージャー?)が要求出す
  • エンジニア/デザイナーがローカルに開発環境を構築して開発
  • QAエンジニアがマニュアルでテストしている
  • PMが確認してリリース
  • ローカル開発環境
    • Jenkinsで作ったDockerコンテナをレジストリにおいてある
    • make init, make startするとローカルでdocker composeが立つ。IPもふられる
  • QAチームのテスト
    • Web UIでトピックブランチを指定すると自動的にQA環境をGCP上に作ってくれる

ここまでの話はPHPのモノリシックなサービス開発環境向けの開発フローと環境

マイクロサービス開発初期の開発環境

mercariは2017年からマイクロサービス開発に移行を始めている。 マイクロサービス開発では以下の仕組みを使って開発環境を構築していた。

  • PRのCircleCIでビルドした結果を用いてKubernetes(k8s)上のserviceとdeploymentを作成
  • k8sはもろもろの設定をPR名で置換できるテンプレートを持っている
  • デプロイされたPR別の開発中の環境にはリバースプロキシで接続できる
    • クライアントのHTTPヘッダーで指定されたPR番号に接続できるようになっている
    • Goならばリバースプロキシ簡単に作れた。

ただし、この仕組では利用が終わったPR用の開発環境を消す仕組みがちゃんとなかった。

現在のマイクロサービス開発の開発環境

  • PR replication controllerを自作した(k8sのカスタムコントローラを作った
  • Kubernetes Controller for Pull Request Based Environment
  • 事前にリポジトリをアノテーションとしてReplicaSetにつけておく
  • 対象のリポジトリのPRを定期的に監視し、OpenなPRがあったサービスを立ち上げる
    • リポジトリのPRの状態をDesiredとして、k8s上にデプロイメントを展開する
    • これなら閉じたPRがあればそのままk8s上のデプロイメントもなくなる
  • OSS化するかもしれない
  • grpc-translator

PRから開発環境をつくる詳細はcrash.academyさんの動画でも聞くことができる

GoでGraphQLサーバを立てるぞ!

@vvakame

GraphQLって何?

  • https://graphql.org/
  • Facebookが2015年に公開した仕様
  • グラフ構造に対するQuery Language
    • 深さ2で友達の友達のデータがほしいとか
  • RESTだと複数回コールが必要でもGraphQLなら一回でとれる
  • とは言え
    • N+1対策とかちゃんとやらないと
      • APIコールが一回でも内部的なDBアクセスが最適化されるわけではない
    • RESTの上位互換ではない
  • メルカリでは一部プロダクションでも使っている

Clientの流れ

サーバ側の原理

GraphQLのどこがよい?

GitHub v4 APIを触ってみる

ベストプラクティス

Software Engineer, Infrastructure

@cubicdaiya

Software Engineer, Infrstructureとは

  • ソフトウェアエンジニアリングによってインフラの問題解決やミドルウェアの開発
  • SREとの違いは運用よりも開発の比重が多いロール
  • 今は3人(一人はSREと兼任)
  • Go言語が中心
  • ネットワークやシステムプロウグラミング寄りの知識やスキルが必要な感じ
  • パフォーマンスチューニングとかボトルネックの解決とか(をソフトウェアエンジニアリングで)

mercariとGo

  • 最近メルカリはPHPなモノリシックなサービスをGoのマイクロサービスにしているが。。。
  • 2014年からすでにGoを使っている
  • 裏側のツールでGo(やNode.js)を使い始めていた
  • 1000万超えるプッシュ通知の高速実現とか
  • パフォーマンスやスケーラビリティからみたPHPとは
    • PHPも7になってだいぶ速くなった
    • ただ単体性能が向上しただけでシングルスレッドなどはそのまま。ウィークポイント
  • パフォーマンスやスケーラビリティからみたGo
    • 数千req/secさばいても全然CPU使用率などが余裕
    • レスポンスタイムもavgで4ms
    • 非同期や平行性の高さを実現できる
  • ツール開発言語としてのGo
    • 1バイナリで楽
    • RPMで配布している。
  • DockerとMakeによるRPMパッケージのビルドシステム
    • makeすると簡単に複数のディストリビューション向けにビルドできるようにしてある
    • 複数のOS向けのRPMをMacOS上でもできる
  • 実際にyum installできるようになるまでの流れ
    • Travis CIでビルドする
    • ビルド結果のオブジェクトがS3にアップロードされる
    • それが各リージョンのyum repoが配布される

メルカリの裏側で動いているGoによるツールやミドルウェアの紹介

slackboard

  • https://github.com/cubicdaiya/slackboard
  • Incoming Webhoookプロキシ兼クライアント
  • Slackへの通知処理や必要な情報を一元管理化
  • クライアントプログラムを統一することでメンテナビリティも向上した
  • TOMLでURLとか設定することができる
  • バッチとかcronjobで終了コードが1のときにSlackに通知するときなどに利用している
  • 各リージョンごとにGCPのインスタンスを立てて運用している(GLBがいい感じにリージョンが近いboardを選んでくれる
  • (実際に使われてるクライアントツールはperl)

pvpool

  • pvpool〜メルカリの商品閲覧数カウントアップの裏側〜
  • 商品閲覧数をカウントアップする仕組み
  • 商品閲覧数のカウントアップのワークロードと技術的な要件
    • 商品閲覧に関するリクエストは全APIのTOP3に入る
    • 数秒以内にリアルタイム閲覧数を表示したい

go-htttpstat

  • https://github.com/tcnksm/go-httpstat
  • 小規模なHTTPサーバ向けのメトリクス取得ライブリ
  • ちょうどいい感じのなかったので自作し
  • リクエストカウントとかステータスカウント、速度とか
  • percentileの計算はそこそこ重たい
  • 最終的にはmackerelに流してグラフ化している

Mackerelプラグイン

  • mackerelプラグインもGoで開発
  • 公式ヘルパーがあるのでそれを使う

mfc

  • fastly使っている
  • 毎回curl叩くのめんどくさくなってきたのでCLIを作った
  • 欲しくなった機能追加するようなゆるふわで作ってる
  • API KEYを毎回curlに含めるのはめんどくさいのでiniファイル読んだりとか
  • 機能領域ごとにサブコマンドを定義してる
  • awsコマンドとかgcloudコマンドみたいなイメージ

imageflux-cli

その他のGo製ツール

その他

  • 次回のmercari.goは9月を予定していて、GopherCon 2018の参加報告になる予定とのこと
  • また、10月にはmercari Tech Confも開催予定とのこと

関連

関連記事