Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

Microservice で実現するメルカリオファー機能

こんにちは、 Backend Engineer の @vkgtaro です。

メルカリでは今まで PHP で開発されたモノリシックな API に対して機能を追加してきたのですが、今後メルカリのシステムを Microservices 化していくその先駆けとして、Offer という新機能を Microservices Platform 上で開発・リリースしました。Offer は今までコメント欄でなされていた値下げ要求を機能としてできるようにしたもので、出品者から承諾が得られれば Offer した金額で購入できるというものです。受け取った人はもちろん断ることもできます。

2018/07/10 現在、「インテリア・住まい・小物」カテゴリーにて使用可能になっています。

f:id:vkgtaro:20180710175615p:plain

今回はこの機能を実装するにあたってやったことをいろいろ振り返ってみようと思います。

ざっくり全体像はこんな感じになってます。

f:id:vkgtaro:20180711160147p:plain

端末とつなげたはじめてのサービス

これまでにもメルカリ API から独立したサービスはいくつかあったのですが、 API Gateway から直接ぶら下がっているサービスとしては今回の Offer がはじめてのサービスとなります。 API Gateway については先日の mercari.go の資料を参照してください。

Offer と API Gateway 間は gRPC で接続されており、 API Gateway と iOS / Android 間は Protocol Buffers を HTTP で通信するようになっています。

iOS / Android から /services/hoge/v1/echo へ Protocol Buffers でシリアライズしたデータをリクエストすると API Gataway を通じて、gRPC で EchoRequest が呼び出されるという具合です。

API Gateway 側の設定

   "/services/hoge/v1/echo": &gateway.GRPCMethod{
        Name: "Echo",

        RequestMessage:  &hoge_pb.HogeEchoRequest{},
        ResponseMessage: &hoge_pb.HogeEchoResponse{},
    },

Interface は proto ファイルで管理

Protocol Buffers なので proto ファイルを用いてインターフェイスの管理をしています。

proto ファイルは一つの GitHub リポジトリ上で管理していて、他のサービスのものも一元管理されています。 proto ファイル用のリポジトリに PR を作成し、push されたら各種言語の protbuf モジュールが生成される仕組みになっています。

Offer では golang, PHP のモジュールをこれで生成して使用していました。 Java, Swift は開発中は仕組みが間に合っていなかったのですが、もとは同じ proto ファイルをもとに作っています。 これによりクライアントとバックエンドの開発時の話し合いは proto ファイルをもとに会話ができました。

また、インターフェイスはバージョンを区切って作っており、将来大きな変更が入る場合には v1 を v2 にして行く予定です。

platform-proto/proto/offer-jp/v1/offer.proto

deploy

development / production 環境への deploy については、 Spinnaker を使ってデプロイしています。(SpinnakerによるContinuous Delivery - Mercari Engineering Blog

GitHub で stage/development へマージすると Circle CI が docker image を作って GCR へプッシュするので、 Spinnaker 側では、 GCR を trigger にした PIPELINE を用意しておいてそのまま Spinnaker が deploy するようにしています。

f:id:vkgtaro:20180710202633p:plain

Offer は CloudSQL を使っていて、マイグレーションツール作ってあるので Spinnaker を通じて実行しています。

Pod の構成

Spinnaker でデプロイされるのは次のような構成の Pod です。

f:id:vkgtaro:20180711155721p:plain

CloudSQL を使っているので CloudSQL Proxy を載せたサイドカーパターンの Pod をデプロイしています。

インフラのコントロールは Terraform

Microservice は開発者が自分たちでインフラもある程度コントロールするんですが、 GCP のコンソールで直接扱うようなことはせずに Terraform 使ってコントロールしています。 Terraform も Microservice Platform チームによってリポジトリが用意されており、PR を作ってマージしてもらうと自動で適用されるようになっています。 また、GCP に限らず PagerDuty や DataDog など関連サービスのコントロールも Terraform で行っています。

メルカリ Microservices Team による Terraform 運用とその中で開発したOSSの紹介 - Mercari Engineering Blog

Terraform のリポジトリは各チームの設定が可視化されていて、「あのサービスの CloudSQL のインスタンスサイズはどのくらいなんだろ、参考にしたい」とか行ったときに grep して探せるのがいいです。そのままナレッジとして集積されています。

カスタマーサポート管理ツールへのつなぎ込み

新たになにか作ると必ずいるのが CSTool と呼ばれるカスタマーサポート用の管理画面です。お客さまからのお問い合わせに対し、オファーされた状態などを確認できるようにするため、CSTool へのつなぎこみを行いました。 CSTool からのつなぎこみは、直接 gRPC で各 Microservice へつなぎこもうという話もありましたが、GCP の Service Account を用意して、API Gateway を通じて接続しようということになりました。

f:id:vkgtaro:20180710205856p:plain

Google の OAuth を通じて JWT トークンを取得して、Authentication ヘッダに含めてアクセスすることで、どの service account から来ているのかを判断しています。

まとめ

メルカリでの Microservice Platform 上での開発について広く浅く紹介してみました。少しでもメルカリの Microservice Platform について伝われば幸いです。今後は今あるモノリシックな API を Microservice に分割していき、開発者が自分の仕事に専念できる状況を作っていきます。

そして、急速な進化を遂げるためにももっと沢山の仲間を必要としています! ご興味のある方はぜひご連絡ください!

ソフトウェアエンジニア(Backend) / メルカリ

Backend Engineer Drink Meetup #1

また、2018/07/17(火) 19:00 〜 バックエンドエンジニアの Drink meetup やります! この記事で紹介したことを話す予定です。詳しく聞いてみたいという方はぜひ、エントリーお願いします!

mercari.connpass.com