イベント

メルペイが語る「マイクロサービス開発・運用で気を付けていること」

OpenStack Days Tokyo 2019 / CloudNative Days Tokyo 2019

 クラウド技術に関する年次カンファレンスイベント「OpenStack Days Tokyo 2019 / CloudNative Days Tokyo 2019」が、7月22日~23日に開催された。

 ブレークアウトセッションでも、大規模なものを含む企業事例が紹介されており、本稿では、2つのセッションの模様をお届けする。

ヤフーのCaaSはどこまで進んだか

 「ヤフーのクラウドネイティブへの取り組みとそれを支えるシステム開発」では、Yahoo! JAPANのプラットフォームについて語られた。なお、同様の話が昨年も発表されており、そのアップデートにもなっている。

 セッションでは、プラットフォームを使う側をヤフーの吉岡圭氏が、プラットフォームを作った側をゼットラボの河宜成氏が話した。

 吉岡氏は、ヤフーでは技術(テクノロジー)だけでなく開発手法(プロセス)や文化(カルチャー)にわたってモダナイゼーションすることを、約3年前から全社において最重要案件の1つとして取り組んでいると語った。

 カルチャーにおいては、複雑なプラットフォーム領域で、加速するテクノロジーの変化に対応するために、Scrum開発を半ば強制的に進めたという。

 プロセスにおいては、Scrumに則した組織作りを進めた。中でも、プロダクト単体でなく1つのプラットフォームとして、というマインド向上を目指したという。そのほか、CI/CDを全社的に推進した。

 テクノロジーにおいては、CaaS(Container as a Service)を整備してアプリケーションをコンテナ化し、サービスレイヤとインフラレイヤをできるだけ疎結合にした。現在、約50のサービスがKubernetesに乗っているという。

 これらの効果としては、デプロイ回数が月1~2回が月4回に、週1回が週2~3回(1日複数回も含む)になった。変更リードタイムも、1日が1時間になった。「こうして開発に使える時間を増やしたい」と吉岡氏。

 課題としては、モダン化への理解とスキルチェンジがあった。そこにおいて特に効果的だったのは、モダナイゼーションなプラットフォームアーキテクチャ図、それを構成するサービスカタログ、モダナイゼーションへのクックブックだったという。

 吉岡氏は今後について、リーンXP、マイクロサービス、サービスメッシュを挙げ、「モダナイゼーションは終わりがないと考えている」と語った。

ヤフーの吉岡圭氏
カルチャー:Scrum開発を進める
プロセス:Scrumに則した組織作り
コンテナ化を進める
効果

 続いて、ヤフーの子会社でインフラ開発をするゼットラボの河氏が、ヤフーのKaaS(Kubernetes as a Service)について説明した。昨年の講演で発表して以来、クラスタ数が50から400に急増したという。

 利用者が増えると問題も増えるという。具体的には、全社共通の認証認可、スケーラブルなモニタリング、安定しスケールするCI/CD、全社共通のシークレットがある。また、同時接続の多いWebサービスや、1000VM規模のクラスタ、CPU固定化、長時間バッチなど、要件も多様化してくる。

 こうしたプラットフォームは、基本的にはヤフーに納品してヤフー側で運用する。ただし、KaaSの利用者サポートについては、Kubernetesに詳しいゼットラボと、社内事情に詳しいヤフーで共同であたる。

 ヤフーのKaaSの特徴としては、常に最新のKubernetesを提供しているという。2019年7月の時点で、400クラスタがすべてv1.13~1.14で動いているという。こうした最新環境は、ゼットラボにおいて1カ月で検証し、その後1カ月でヤフーに受け渡しているという。

 ゼットラボではこうした保守をしながらR&Dを継続する必要がある。toil(日常的な労苦)を減らして開発時間を増やすために、例えばバージョンアップに伴う各作業をbotにまかせるなどしているという。また、不要なミーティングを減らし、チームメンバーを最小にしたり、issue管理したりなど、大規模なOSS開発コミュニティの手法に学んだという。

 またテストを毎日実行。KaaS自身も壊して作り直すのを繰り返すことにより、対障害性の確認にもつながるという。

 そのほか新しい課題として、ステートフルなアプリを動かしたいという要件や、より簡単に使えるサーバーレスかつマネージドなアプリケーションプラットフォーム、GPU利用、セキュアなシークレット引き渡しなどが語られた。

ゼットラボの河氏
ヤフーのKaaS利用が1年で急増
常に最新のKubernetesを提供
ゼットラボの開発のtoilを減らす
テストを毎日実行し、KaaSも壊して作り直す

最初からマイクロサービスで構築したメルペイの事例

 メルペイの高木潤一郎氏によるブレークアウトセッション「メルペイのマイクロサービスの構築と運用」では、メルカリの決済サービスであるメルペイでマイクロサービスを実践したことについて解説された。

 メルペイは2019年2月にスタート。40以上のマイクロサービスからなり、200万人以上の利用者、2019年第3四半期で1444億円以上を取り扱うという。

メルペイの高木潤一郎氏
メルペイのサービス規模

 セオリーとしては、最初はモノリシックで始めて後からマイクロサービスに分割すると言われる。それに対し、メルペイでは最初からマイクロサービスを採用した。複数のサービスを短期間で立ち上げるためで、そのために人材もどんどん採用しているという。

 そのほか、マイクロサービスではそれぞれ言語やデータベースなどを自由に選択できると言われるが、メルペイでは共通の言語やライブラリを使うことで、情報共有し、品質向上につなげているという。さらに、チーム間の人の移動も可能になるという。

 さて、メルペイのマイクロサービスはすべてGoogle Cloud Platform上のGKEで動いている。選択当時はKubernetesプラットフォームとしてGKEが進んでいたからだという。

 すべてのサービスが同じGKEクラスタに乗り、チームごとにNamespaceで分かれる。クラスタの面倒はプラットフォームチームが見て、各チームはNamespaceの中を運用することになる。1つのマイクロサービスが1つのGCP Projectになっており、TerraFormで管理しているとのことだ。

マイクロサービスのアーキテクチャ
チームごとにNamespaceで分かれる

 メルペイのマイクロサービス開発では、金融サービスなので、一貫性と信頼性に気をつけているという。マイクロサービスのような分散システムのデータの一貫性の担保は難しいが、そこを工夫している。また、信頼性については、マイクロサービスのテンプレートを用意し、社内で開発した共通のGoライブラリを整備することで、必要な機能を漏れなく盛り込むとした。そのほか、最初の設計段階と最後の本番リリース前でレビューを行っている。

 マイクロサービスの運用で気をつけていることには、SLO(Service Level Objective)を設定して、何を優先して直すかをサービスごとに決めることがある。また、メトリクス、トレース、ログというObservabilityをサービス横断して見られるようにすることで、問題の特定をスムーズにするという。

 最後には、「デプロイ時にサービスが上がりきっていなくてリクエストの一部がエラーになる」「GKEのバグでIngressの再作成に失敗する」など、細かいトラブル事例とその対応が、時間いっぱいまで紹介された。

マイクロサービス開発で気をつけていること
マイクロサービス運用で気をつけていること