Merpay Microservices on Microservices Platform

この記事は MERPAY TECH OPENNESS MONTH の14日目の記事です。

メルペイSREの @tjun です。Engineering Managerをやっています。
先月行われた Mercari Meetup for Microservices Platform #2で、 Merpay Microservices on Microservices Platformというタイトルで、メルペイのマイクロサービスがどのようにMicroservices Platformを利用してサービスを開発・運用しているかを発表しました。
本記事は、そこでの発表内容をblogとして記事にしたものになります。

その他の発表については @masartz の記事 Mercari Meetup for Microservices Platform #2 を開催しました - Mercari Engineering Blog を参考にしてください。

メルペイのマイクロサービス

メルペイは、2019年2月にサービスがリリースされました。メルペイの各機能はマイクロサービスとして実装されていて、ほとんど全てがGoogle Cloud Platform(以下GCP)のKubernetesクラスタ(Google Kubernetes Engine)上で動いています。

アーキテクチャをざっくり書くと次のような形になります。

f:id:taka-jun:20190605155327p:plain
merpay system architecture

一番先頭に、merpay-gatewayと呼ばれるマイクロサービスがあり、その後ろにはAPIを実現するマイクロサービスやWebページを表示するマイクロサービスがあり、さらにその後ろにさまざまな機能を実現するためのマイクロサービスがいます。
例えば、以下のようなマイクロサービスがあります。

  • NFC決済をするためのAPIを実現するnfc-apiサービス、その裏の処理を行うnfcサービス、さらにその後ろの決済を管理するPaymentサービス
  • クーポン機能を実現するためのクーポンWebサービスと、クーポンの発行管理をするクーポンサービス

ほとんどのマイクロサービスはGoで書かれていますが、Webページを実現するためのサービスなどNode.jsで書かれているものもあります。
メルカリもマイクロサービス化を進めていますが、メルペイのマイクロサービスには以下のような特徴があります。

  • バッチ処理が多い
    • 金融サービスですので、日次の処理、月単位の処理などさまざまな単位の処理が各マイクロサービスで動いています
  • 外部との接続が多い
    • さまざまなパートナーと連携しながらサービスを実現しているため、外との接続が多くなっています

参考: iD決済を支える技術 / #merpay_techtalk - Speaker Deck

すでにメルペイだけでも数十のマイクロサービスがあり、これらはMicroservices Platformの上で開発・運用されています。

Microservices Platformとは

Microservices Platformは、メルカリのMicroservices Platform Teamが構築・運用しているマイクロサービスを動かすための基盤です。
Platformには、Kubernetesのクラスタやその周りのCI/CD、Infrastracture as a Codeのための仕組み、ログや監視など運用のための仕組みも含まれています。
これらは日々運用・改善されていて、メルペイの開発・運用の仕組みもこの1年で大きく改善されてきました。

Microservices Platformの取り組みは以下の発表資料などが参考になります。

以下では、そのMicroservices Platformの上でメルペイのマイクロサービスをどのように開発・運用しているかを紹介します。

メルペイのMicroservicesの開発

まず、新たなマイクロサービスを作ることが決まって名前などが決まったら、 microservices-terraform というレポジトリで新たなマイクロサービスを作成します。
そのためのスクリプトがあるので、サービス名などを入力するだけで新たなマイクロサービスを作成できます。

PullRequestがマージされると、そのマイクロサービス専用のGCPプロジェクト、共通GCPプロジェクトにあるKubernetes上に専用のnamespaceが自動的に生成され、Service AccountやKubernetes Secretなども合わせて生成されます。
また、合わせてそのマイクロサービスの担当Developerを設定すると、必要な各種の権限が付与されます。

f:id:taka-jun:20190605190620p:plain
GCP プロジェクトとKubernetes namespace

microservices-terraform レポジトリでは、GCPのリソースがTerraformで管理されており、各Developerは必要なGCPリソースを必ずTerraform経由で作成することになります。
メルペイの場合は、Cloud SpannerやCloud Pub/Subなどのリソース、また必要なIAMを作成します。

microservices-terraform については、この資料が参考になります

コードを書いたら、次はアプリケーションを動かすためのKubernetesの設定を行います。
microservices-kubernetes というレポジトリで、各DeveloperはKubernetesのDeployment, Service, ConfigMap, CronJobなど必要なyamlを作成します。
これらはマージしてCI経由で自動反映するものもあれば、Spinnaker経由でデプロイするものもあります。

microservices-kubernetes については、この資料が参考になります

コードをデプロイするためのプロセスはCloudBuildでDocker Imageを作成して、Container RegistryへPush、そのイメージをSpinnakerを使ってリリースする、という流れになります。
このCI/CDパイプラインも以前に比べて整備され、SpinnakerのUIで設定していた部分がDeploymentのyamlとして管理できるようになったり、デプロイの速度が改善したり、よりセキュアな仕組みになってきました。
- 参考: Securing microservices continuous delivery using grafeas and kritis

メルペイのMicroservicesの運用

リリースしたマイクロサービスは、各Developerが責任を持って運用をしていくことになります。
具体的にはDatadogでTimeboardやSLO Boardを作成したり、APMでtracingしたりすることで各サービスをモニタリングし、アラートのためのMonitorを設定して問題に気づく仕組みを作っています。

Datadogを使った運用に関して、詳しくは以下の記事で紹介されています。

メルカリ・メルペイではGoの共通middlewareライブラリが共有されており、このライブラリを利用することで各サービスが比較的簡単に、共通の仕組みでmonitoring/tracingできるようになっています。

また、何か問題が起きた際には、DatadogのAlertがSlackやPagerDutyへ送られ、当番のDeveloperとSREが連携して対応しています。

マイクロサービスの運用まわりはまだまだ課題があり、より信頼できるサービスを目指してSRE、Developer、 Microservice Platform Teamが連携しながら改善を続けています。

おわりに

前述したように、メルペイではBackendやFrontendエンジニアもTerraformの設定を書いたりKubernetesのyamlを書いたりしています。
また、SREはそのマイクロサービスを支える仕組みをMicroservices Platform Teamと一緒に作り、その上のサービスを運用するさまざまな技術的チャレンジができる職場です。
各職種採用しておりますので、興味がある方は @tjun まで気軽にご連絡ください。