コンテンツにスキップ

メッセージング系ミドルウェア

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. 送信元と宛先の対応関係

プロデュース/コンシュームパターン

▼ プロデュース/コンシュームパターンとは

送信元から単一の宛先に非同期的に単方向で通信する。

▼ プル型

双方向通信 (クライアント → サーバー → クライアント) である。

  • AWS SQS

▼ プッシュ型

単方向通信 (サーバー → クライアント) である。


パブリッシュ/サブスクライブパターン

▼ パブリッシュ/サブスクライブパターンとは

送信元から複数の宛先に非同期的に単方向で通信する。

送信元と宛先で通信処理が独立して実行されるため、メッセージ中継システムを経由した非同期通信を実行することになる。

送信元はメッセージ中継システムにメッセージをパブリッシュする。

プル型のサブスクライブの場合、サブスクライバーはメッセージ中継システムにポーリングを実行し、メッセージを取得する。

プッシュ型のサブスクライブの場合、メッセージ中継システムはメッセージをサブスクライバーに送信する。

▼ プル型

双方向通信 (クライアント → サーバー → クライアント) である。

  • RabbitMQ (プル型だけでなく、プッシュ型も選べる)
  • Apache Kafka

▼ プッシュ型

単方向通信 (サーバー → クライアント) である。

  • RabbitMQ (プッシュ型だけでなく、プル型も選べる)
  • AWS SNS
  • AWS EventBridge


ストリーミングパターン

▼ ストリーミングパターンとは

プル型の場合、宛先はメッセージ中継システムにポーリングを実行し、メッセージをストリーミングする。

プッシュ型の場合、メッセージ中継システムは、メッセージをサブスクライバーにストリーミングする。

▼ プル型

  • Apache Kafka
  • AWS Kinesis (プル型だけでなく、プッシュ型も選べる)

▼ プッシュ型

  • AWS Kinesis (プッシュ型だけでなく、プル型も選べる)


02. 宛先のメッセージ受信方式

プル型

メッセージの宛先は、メッセージ中継システムにポーリングを実行し、メッセージを受信する。

宛先で障害が起こっていても、障害の回復後にメッセージを処理すればよいため、耐障害性が高い。


プッシュ型

メッセージ中継システムはサブスクライバーにメッセージを送信する。

宛先で障害が起こっていると、メッセージが損失する可能性があるため、耐障害性が低い。

これに対処するために、メッセージ中継システムで、リトライやデッドレターキューが必要になる。


03. メッセージ中継システム

メッセージブローカー

  • Apache Kafka
  • AWS SNS
  • Google Cloud Pub/Sub
  • RabbitMQ


メッセージキュー

  • AWS SQS
  • EMQX


イベントバス

  • AWS EventBridge
  • CloudEvents


04. メッセージに使用するプロトコル

プロトコル 通信方式 対応するメッセージ中継システム例 一般的
AMQP バイナリ RabbitMQ、Apache Qpid
MQTT バイナリ EMQX
Kafka Protocol (Kafka独自プロトコル) バイナリ Apache Kafka
STOMP テキスト RabbitMQ
HTTP/1.1、Webhook テキスト (例:JSON、XMLなど) AWS SQS、AWS SNS、Google Cloud Pub/Sub
HTTP/2 (例:gRPC、GraphQLなど) バイナリ (例:Protocolbuf) 調査中...
WebSocket テキスト、バイナリ 調査中...