【マイクロサービス】サービス間通信の代表的パターンまとめ

# はじめに

こんにちは！
普段AWSを用いたインフラ構築に携わっているインフラエンジニアです。
この記事では、マイクロサービスにおけるサービス間通信のパターンと通信を実現するサービスを紹介させて頂きます！

# サービス間通信

マイクロサービスではモノリスとは違い、サービスが分割されているためサービス間で通信を行う必要があります。

<img width="300" alt="qiita_microservice_com-intro.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/841955dc-4198-ff3c-93f2-85fce140f59d.png">

以下、サービス間通信を設計・構築する際の代表的なパターンを説明します。

## メッセージブローカー

メッセージ・ブローカーは、アプリケーション、システム、サービスが相互に通信し、情報を交換することを可能にするソフトウェアです。

<img width="550" alt="qiita_microservice_com-mb.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/1d8dfb7b-e8c9-f867-96b9-94600ce0f744.png">

メッセージブローカーを用いることで、サービス間の通信を非同期に行うことができます。
これにより以下のようなメリットが得られます。

- サービス間が疎結合になる
- 送信先のサービス障害時でもメッセージブローカーにメッセージを送信することが可能

### メッセージング方式

メッセージブローカーのメッセージング方式として Pull型 と Pub/Sub型 があります。

【Pull型】

Pull型は送信者(プロデューサー)がメッセージブローカーにメッセージを送信し、受信者(コンシューマー)がそのメッセージを取りに行く方式となります。

![qiita_microservice_com-mb-pull.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/f213ca8c-c5bf-c659-41b7-294c40b44d67.png)

【Pub/Sub型】

Pub/Sub型は送信者(プロデューサー)がメッセージブローカーにメッセージを送信し、メッセージブローカーが受信者(コンシューマー)にメッセージをプッシュする方式となります。

![qiita_microservice_com-mb-push.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/f48c8fb3-12a8-fb19-16c8-8463341dfa37.png)

### 代表的なメッセージブローカー

|製品|提供|特徴|
|---|---|---|
|Apache Kafka|Apache|Pull型で高スループットで低レイテンシー。|
|Apache ActiveMQ|Apache|Pub/Sub型のJavaベースのメッセージブローカー。柔軟なルーティングが可能。|
|RabbitMQ|Pivotal Software|柔軟なルーティング機能を持ち、複数のプロトコル(AMQP, MQTT, STOMPなど)に対応。|
|MQ|AWS|ActiveMQおよびRabbitMQのフルマネージドサービス。|
|MSK|AWS|Apache Kafkaのフルマネージドサービス。|
|SQS|AWS|シンプルなメッセージングを提供するフルマネージドサービス。|
|Service Bus|Azure|トランザクションやメッセージの順序保証などの機能を持つフルマネージドサービス。|
|Pub/Sub|Google Cloud|Pub/Sub型で高スループットなフルマネージドサービス。|

## サーキットブレーカー

サーキットブレーカーとは、サービスの障害を検知した際に通信を遮断する仕組みになります。

<img width="600" alt="qiita_microservice_com-circuit-breaker.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/255db18e-7c61-76d2-fc30-a750269289c5.png">

サーキットブレーカーを導入すると以下メリットが得られます。
- サービス障害時のタイムアウト処理を待たないため、UXが向上する
- 障害の拡大を防ぐ (カスケード障害)

### 代表的なサーキットブレーカー

|製品|提供|特徴|
|---|---|---|
|Istio|Istio|OSSのサービスメッシュ。サーキットブレーカー以外にも多数の機能を持つ。|
|Resilience4f|Resilience4f|Javaで実装されたOSS。Netflix OSSのHystrixの後継。|
|App Mesh|AWS|サーキットブレーカー以外にも多数の機能を持つ。|

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

サービスディスカバリは、動的に変化するサービスの情報(IPアドレスやポート番号)を管理し、自動的に検出する仕組みです。
これを用いることで、マイクロサービスがスケールアウトしたり再配置された際にも、動的にサービスを見つけ出すことが可能になります。

<img width="500" alt="qiita_microservice_com-service-discovery.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/70ffce42-82b5-2b1e-d064-9c9908d2124e.png">

### 代表的なサービスディスカバリ

|製品|提供|特徴|
|---|---|---|
|Consul|HashiCorp|HashiCorpが提供するOSS。サービス監視やトラフィック管理などの機能も持つ。|
|Eureka|Netflix|Netflix OSSの1つ。負荷分散とフェイルオーバーも行う。|
|Zookeeper|Apache|Apacheが提供。JavaとCに公式ライブラリを持つ。|
|etcd|CNCF|kubernetesでネイティブサポートされている。|
|Cloud Map|AWS|AWSのリソース検出サービス。サービスにカスタム名をつけることが可能。|

## サービスメッシュ

サービスメッシュは、サービス間の様々な通信を制御できるようにする技術となります。
サービスメッシュを導入することで、サービス間の通信をインフラストラクチャ層で制御できるようになるため、アプリケーション開発者の負担を軽減ことが可能です。

<img width="400" alt="qiita_microservice_com-service-mesh.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/d7274cf3-4dcc-2f9f-da2d-5758334e74e8.png">

またサービスメッシュには通信制御以外にも、以下の様な機能を持ちます。
- トラフィック管理
- 通信の暗号化
- 負荷分散
- リトライやサーキットブレーカー
- カナリアリリースなどのリリース機能
- モニタリング

### サービスメッシュの仕組み

通信にはプロキシを用いてサービス間の通信・ルーティングを行います。

プロキシはサービスとは別の外付け機能 (**サイドカー**) として実装します。
以下の様にサービスのトラフィックをプロキシに送ることで、プロキシがゲートウェイとして通信を制御する仕組みとなっております。

![service-mesh-work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836297/7ea8a97b-6122-5686-aa35-1e83f10ecf42.png)

### 代表的なサービスメッシュ

|製品|提供|特徴|
|---|---|---|
|Istio|Istio|高機能なオープンソースのサービスメッシュ。プロキシにはenvoyが用いられており、高度な機能を実現できる。|
|Linkerd|Buoyant|Kubernetes向けでオープンソースの軽量サービスメッシュ。シンプルで軽量な環境に最適。|
|Consul|HashiCorp|サービスメッシュの他、サービスディスカバリ機能も持つ。|
|App Mesh|AWS|AWSサービスとの連携がしやすく、AWSネイティブ環境に強力。|

# 参考文献

- メッセージ・ブローカーとは (https://www.ibm.com/jp-ja/topics/message-brokers)
- マイクロサービスのサービス間通信の設計 (https://learn.microsoft.com/ja-jp/azure/architecture/microservices/design/interservice-communication)
- What is a Service Mesh? (https://aws.amazon.com/what-is/service-mesh/?nc1=h_ls)