マイクロサービス間通信方式の選定事例

こんにちは、ALTURA X株式会社でLIFELOGおよびCHECKUPのPDMを努めている山下です。
今回は弊社で採用したマイクロサービス間の通信方式と選定について記事を作成しました。
 

はじめに

サービス規模拡大を考慮して、そろそろマイクロサービス化を行っていきたいと思っています。現状はモノリシックアプリケーションですが、今後開発する新機能をマイクロサービスとして開発を進めていき徐々にマイクロサービス化していく作戦です。マイクロサービス化を検討する場合、サービス間通信を検討する必要があり、サービス間通信は規模や用途によって検討が必要です。一般的にはREST, gRPC, メッセージングサービスなどが利用されますがSPAとの通信に利用されるGraphQLも含めて検討したいと思います。

gRPC

Pros(メリット)

  • GraphQLに比べて高速な処理が実現できる
    • シリアライズ化されたバイナリデータ
  • 型が明確で型付け言語との親和性が高い
  • ストリーミングが可能

Cons(デメリット)

  • HTTP/2をサポートするLBが少ない(ただし、AWS ALBは対応)
  • Javascriptからは実質扱えない(Nodejsなどは対応)
  • シリアライズ化されたデータのデバッグが困難

参考

GraphQL

Pros

  • 実装言語を選ばない(主要な言語にはほぼライブラリが揃っている)
  • 広く利用されているJSONベースのデータ構造のためデバッグが容易
  • 必要なデータのみ取得することが可能なためペイロードを小さくできる

Cons

  • サーバ側の実装が複雑になるケースがある(クエリ内容に応じて処理を分岐する必要が発生)
  • GraphQL特有の脆弱性が存在するため対策が必要となる
  • gRPCに比べて遅い(そもそもテキスト処理は負荷)
  • サーバ側のエラー応答の仕組みが独特であり、クライアント側の作り込みが複雑になる

RESTAPI

Pros

  • 学習コストが低い(すでに利用事例が多いことから使用経験のあるエンジニアがいることや、HTTPのメソッドに沿って実装するため)
  • 言語を選ばず実装が簡単

Cons

  • GraphQLに比べてオーバーフェッチが発生する
  • フロントとバックエンドの共通認識となる設計を作るのが難しい(GraphQL、gRPCはSchemaやProtobufがある)
  • GraphQLに比べてエンドポイント数が増えるため、フロントの構成によってはクエリを複数回送信する必要がある

メッセージングサービス

Pros

  • それぞれのサービスが冗長構成になっており、複数のサービスが存在するマイクロサービスでの最適な連携が可能
  • 大量のリクエストをメッセージングサービスが一時的に貯めることができ、負荷の低いサービスがメッセージを取得することで効率的な処理が可能

Cons

  • gRPCやGraphQLによるサービス間の直接通信に比べて遅い
  • 障害発生時に障害箇所を見つけることが難しい
 

参考

 

それぞれのメリットデメリットを整理

ここまでは各方式のメリットデメリットを列挙してきたので表にまとめ直します。
gRPCGraphQLREST APIメッセージングサービス
型定義YesYesNoNo(不可能ではない)
処理速度HighLowMiddleLow
通信速度HighMiddleMiddleLow
設計複雑度MiddleHightLowMiddle
運用難易度LowLowLowHigh
実装難易度MiddleHighLowMiddle
学習コストHighHighLowMiddle
その他特徴シリアライズ化されたデータのデバッグが困難サーバ側のエラー応答の仕組みが独特であり、クライアント側の作り込みが複雑になる。また、GraphQL特有の脆弱性が存在するため対策が必要となる。GraphQLに比べてエンドポイント数が増えるため、フロントの構成によってはクエリを複数回送信する必要があるマイクロサービスごとに冗長化しており、それぞれが独立して動く場合にメリットが大きくなる。 AWSがマネージドサービスを提供している。

マイクロサービスで採用する通信方式

メリットとデメリットを整理した結果、今回はgRPCを採用します。
gRPCのメリットはマイクロサービスにおいて有利に働く(型定義、処理速度、通信速度、運用難易度)一方で、弊社のサービスの開発においてデメリットの影響(学習コスト、実装難易度)が少ないことが理由です。

おわりに

マイクロサービスを構築する際にサービス間通信方式の選定は非常に重要です。利用するサービスや通信方式ごとのメリットとデメリットを比較検討して決定するのが大切であると考えています。本記事がみなさまの参考になれば幸いです。