Architecture🛠️ 開発体験(DX)⚡ パフォーマンス・速度

メルカリ (Mercari)

メルカリ、出品機能をPHPモノリスからGoマイクロサービスへ移行

PHPモノリスGoによるマイクロサービス

メルカリJPの出品機能をPHPモノリスからGCP上のGoマイクロサービスへ切り出す過程で、DB接続・トランザクション設計・例外互換性など4つの課題に直面し解決した。

課題

商品・配送情報・分析データを1トランザクションで更新する設計がサービス分割を阻んでいた

アプローチ

SQL on gRPCによる越境DB接続、整合性レベルの使い分け、PHP例外互換ライブラリで4課題を解決

効果

カナリアリリースで影響範囲を抑えながら段階的にGoマイクロサービスへ移行を推進

背景

メルカリはPHPモノリスとして運用してきた出品(Listing)機能を、初の本格的なマイクロサービス化プロジェクトとしてGo・GCP上のサービスへ移行した。既存のPHPコードでは商品情報だけでなく配送情報や分析用データまでもが1つのトランザクションで更新される設計になっており、これが単一責任の原則に基づくサービス分割を難しくしていた。

移行のプロセス

移行にあたり4つの技術的課題に直面し、それぞれに対応した。

  • 1つ目はGCP上のGoサービスからさくらのクラウド上のMySQLへ安全に接続する課題で、SQL on gRPCのようなサービスと専用のGoクライアントライブラリを開発し、gRPCの認証・認可機構でセキュリティを確保した
  • 2つ目はトランザクションの分割で、商品についてはトランザクションを維持し、画像は同期的だがトランザクション外で更新、その他のデータは非同期処理に回すという整合性レベルの使い分けを行った
  • 3つ目は移行期間中も続くPHP側の変更への追従で、元のPHPリポジトリ上に変更追跡用のブランチを作成し、Goへ移行済みのコードを削除することで新規変更を検出できる仕組みを構築した
  • 4つ目はクライアント側がハンドリングするPHPの例外名との互換性維持で、PHPの例外情報を扱うGoの共有ライブラリを開発し、gRPCのStatus.detailsを活用して例外情報を保持、HTTPエンドポイントで元の形式に変換して返す仕組みを作った

結果

記事内では具体的な定量的成果指標は示されていないが、カナリアリリースによって影響範囲を抑えながら段階的に移行を進めることで、顧客への負担を抑えつつAPI互換性を維持できているとしている。

学び

長期的な組織の課題を解決しつつ短期的な負債を生まないことを意識しながらマイクロサービス化を進めていると担当者は述べ、「正解がない中で自分が信じる設計を信じろという精神で、ひたすら正しい姿を目指して全員で開発を進めていくのはなかなか楽しいものがある」と振り返っている。

2018-10-04
他の事例も見る