MSA(Microservices Architecture) マイクロサービスアーキテクチャ

MSAとは?

  • Microservices Architecture。
  • すべてのシステム構成要素が1つのプロジェクトに統合されているMonolithic Architecture(モノリシックアーキテクチャ)の限界を克服するために登場した。
  • 小さく、独立してデプロイ可能な、それぞれ特定の機能を担うサービスで構成されたフレームワークである。
  • MSAは1つのシステムを完全に独立してデプロイ可能な個別サービスに分割する。
  • 各サービスはRESTful APIを通じてデータをやり取りし、1つの大きなサービスを構成する。
  • 異なる技術スタック(開発言語、データベースなど)を利用できる単一の事業領域に焦点を当てる。

MSAの特徴

  • APIを通じてのみ相互作用できる。
  • サービスのend-point(接点)をAPIの形で外部に公開する。
  • 実際の詳細はすべて抽象化する。
  • 内部の実装ロジック、アーキテクチャ、プログラミング言語、データベース、品質維持体系のような技術的事項は、サービスAPIによって徹底的に隠蔽される。

MSAのメリット

  • 各サービスはモジュール化されており、これらのモジュール同士はRPCまたはMessage-driven APIなどを利用して通信する。
  • 個々のサービス開発を速くし、保守もしやすくする。
  • サービスごとに適切な水準の技術スタックを変えて採用できる。
  • サービスごとに独立してデプロイできる。
    • 継続的デプロイ(CD)もモノリシックに比べて軽く行える。
  • 各サービスの負荷に応じて個別にScale-outできる。
    • これはメモリやCPUの面で大きな利点になる。
  • 一部のサービスで障害が発生しても、サービス全体の障害にはならない。
  • 各サービスは異なる言語やフレームワークで構成できる。
  • サービスの拡張が容易である。

MSAのデメリット

  • モノリシックに比べて相対的にかなり複雑である。
  • サービス間でRESTful APIを使って通信するため、そのコストが発生する。
  • サービスが分離されているため、テストやトランザクション処理などが難しい。
    • 通信障害やサーバー負荷がある場合、どのようにtransactionを維持するかを決定し、実装しなければならない。
  • サービス間の呼び出しが連続するため、デバッグや統合テストが難しい。
  • 実際の運用環境へデプロイすることが容易ではない。

MSAサーバー構成

サービスディスカバリサーバー

  • Spring: Netflix Eureka

Webサービスクライアント

  • Spring: Netflix Feign

クライアントサイドロードバランサー

  • Spring: Netflix Ribbon

サーキットブレーカー(Circuit Breaker)

  • Spring: Netflix Hystrix
  • クライアントからリモートサーバーへ送信したリクエストの失敗率が特定のしきい値(threshold)を超えると、サーバーに問題があると判断し、それ以上無意味なリクエストを送らず、すばやくエラーを発生させる方法(fail fast)である。

APIゲートウェイ(Gateway)

  • Spring: Netflix Zuul, Gateway
  • リバースプロキシサーバー。

参考