Slide 1

Slide 1 text

メルカリの Microservices 化について Backend Engineer at UX team @vkgtaro

Slide 2

Slide 2 text

お前、誰よ? ● @vkgtaro ● 元劇団員 ● Backend Engineer ● Tech Lead at JP-UX team ● 入社9ヶ月くらい ● メルチャン/メルカリボックス(Web) ● らくらく/ゆうゆう/大型 ● Offer Microservice

Slide 3

Slide 3 text

色んな話を詰め込んだので ぜひぜひご質問ください。

Slide 4

Slide 4 text

現在メルカリでは Microservice 化を 進めています

Slide 5

Slide 5 text

Why

Slide 6

Slide 6 text

スケーラブルな 開発組織を作るため

Slide 7

Slide 7 text

Free Vector Art by www.vecteezy.com Monolithic Microservices

Slide 8

Slide 8 text

スケーラブルな開発組織 ● 明確な責任分界点で自分の仕事に集中 ● 決断できる権限を持って、オーナーシップを発揮 ● 自分のサービスは自分で守る

Slide 9

Slide 9 text

オファーとは

Slide 10

Slide 10 text

オファー機能 ● コメントで行われていた「値下げしてください」というのを機能と して提供 ● 気に入った商品に対して、希望の値段をオファーすることがで きます ● 今は「インテリア・住まい・小物」カテゴリで使えます。

Slide 11

Slide 11 text

オファー機能 購入者がお願いして 出品者が承諾すると オファーした金額で買 える!!

Slide 12

Slide 12 text

Microservice 化への先駆け ● 今までどおりモノリシックな API へ追加することも考えました が、Offer は Microservice Platform 上での機能として開発、リ リースしました ● Microservice Platform チームと slack や github issue を使っ て相談しつつ開発を進めました ● リリース前には Platform チームからリリース前にはやっておく リストを Github issue でもらってチェックを付けながら進めまし た ○ CloudSQL のインスタンスサイズ決める ○ SLO を決めるとか

Slide 13

Slide 13 text

全体像 Offer

Slide 14

Slide 14 text

循環参照しないようにする ● Offer から mercari-api へのアクセスはしているが、 mercari-api から Offer へ のアクセスはしない ● Offer は buyer/seller の user_id, item_id は持っているが詳細は持っていない ので都度 mercari-api に問い合わせしている ● mercari-api で変更があった場合に通知したいときは PubSub を使用する方針 ○ (今はないけど、リアルタイムに情報がほしいところがあるので実装したい) Offer Mercari API PubSub publish subscription

Slide 15

Slide 15 text

deploy

Slide 16

Slide 16 text

deploy ● Circle CI で docker image をビルドして GCR へプッ シュすると Spinnaker 側に作ってある PIPELINE の trigger が働いて deploy します。 特定の tag の image を trigger に指定

Slide 17

Slide 17 text

deploy ● Spinaker 側には develop / production の2系統をを用意 ● この設定はエンジニア全員見ることができる ● 自分たちも他のプロジェクト参考にするために参照しまし た。

Slide 18

Slide 18 text

deploy ● github で stage/development にマージしたら Circle CI が develop 用の image を GCR に push ○ Spinnaker が受けて develop 環境へ deploy ● 同じように production も stage/production へマージした ら image を作って push されますが…… ○ Spinnaker の production 環境への trigger は有効に しておらず、手動で deploy するようにしてます

Slide 19

Slide 19 text

DB Migration ● DB マイグレーションも同様にツールを作ってあって、 migration する SQL を含めて migrate/(development|production) にマージしたら、 Spinnaker がマイグレーション実行するようにしてます。

Slide 20

Slide 20 text

Offer の Pod 構成 ● Offer は CloudSQL を使っているので、サイドカーパター ンで CloudSQL Proxy も一緒に deploy してます Offer CloudS QL Proxy Offer CloudS QL Proxy Offer CloudS QL Proxy CloudSQL

Slide 21

Slide 21 text

API Gateway にぶら下がっ た初めてのサービス

Slide 22

Slide 22 text

Protocol Buffers over HTTP ● Offer は API Gateway とは gRPC で通信していて、iOS / Android は protbuf を HTTP で通信しています。 API Gateway Offer Microservice Protobuf + HTTP gRPC

Slide 23

Slide 23 text

Authority Service ● API GW は Authority Service と連携して、Mercari API に確認した上で Private Access Token という独自のトークンを渡してくるので、 Offer 側では それを持って access token を取得してます API Gateway Offer Authority MercariAPI 1 2 5 6 3 4 Authority SDK

Slide 24

Slide 24 text

Interface は proto ファイルで管理 ● API の Interface は Proto ファイルで管理しています ● このリポジトリに proto ファイルを上げると自動で各言語の protbuf モジュール が自動で作成されます ● Offer はインターフェイス決定した後、 proto ファイルをここに上げて自動生成 されたパッケージを組み込み開発してる ● 当時 iOS と Android は Swift, Java の自動生成の仕組みが間に合わなかっ たので、この protobuf から生成してもらって使ってる ● Offer のバックエンド開発中は、これで生成された PHP モジュールを使用して モックを作り iOS, Android の開発に使用してもらった

Slide 25

Slide 25 text

Infrastructure as a Code ● GCP は Terraform を使ってコントロール ● 変更したい内容を PR にあげて、マージしてもらうと自動で 適用される ●   各チームの設定が Terraform の設定ファイルとして可 視化されていて、みんなどうしてるんだろうというのがわか りやすい

Slide 26

Slide 26 text

CloudSQL のインスタンスサイズを変える ● Offer は Internal Release で社内の一部の人のみに向け てリリースしていた ● その時 CloudSQL のインスタンスサイズは小さいのを使っ てた ● カテゴリを絞ってリリースする際に見積もりをして instance size を決めました ● Terraform で instance size を変えて apply してもらったら DB が消えた!

Slide 27

Slide 27 text

CloudSQL の failover を試す ● CloudSQL は failover の仕組みがあるので事前に試した ● failover replica を作って同期完了したあと、admin console から failover させて、master 昇格した方に application が接 続しているか確認しました ● 安心!

Slide 28

Slide 28 text

CSTool つなぎ込み

Slide 29

Slide 29 text

CSTool のつなぎ込み ● お客さまと商品ベースでオファーの状態をみるために CSTool から Offer MS へつ なぎこんでいます ● MS Platform チームとの話し合いで、 API Gateway を通して接続することに ● CSTool 用の Google Service Account を用意して、 Google OAuth を通して JWT トークンを作成 ● JWT トークンを Authority ヘッダに含めることでどの Service Account から着てい るのかを特定して Offer はレスポンスするようにしています API Gateway Offer CSTool Google

Slide 30

Slide 30 text

プラットフォーム側は 整ってきた

Slide 31

Slide 31 text

現在

Slide 32

Slide 32 text

既存のモノリシックな API を Micoroservice に 切り出し始めてます

Slide 33

Slide 33 text

まだまだこれから……!

Slide 34

Slide 34 text

ぜひこのあと ご質問ください!