Mercari Engineering Blog

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

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 まで気軽にご連絡ください。