【めっせーじぶろーかー】

メッセージブローカー とは?

💡 サービス間の「伝言メモを預かる仲介者」
📌 このページのポイント
非同期メッセージングによるサービス間の疎結合 Producer A Producer B Producer C MSG MSG MSG Message Broker キュー A キュー B トピック (Pub/Sub) Consumer X Consumer Y Consumer Z 非同期処理 - ProducerとConsumerは 独立して動作(疎結合)
メッセージブローカーの仕組み
ひよこ ひよこ

APIで直接サービスを呼べばいいのに、なんでメッセージブローカーが必要なの?

ペンギン先生 ペンギン先生

直接呼ぶと「受け取る側が落ちていたらリクエストが消える」「送り側が応答を待つ間ブロックされる」という問題がある。ブローカーがキューにメッセージを保管しておけば、受け取る側が復旧したとき処理できるし、送り側はすぐ次の処理に移れるんだよ。

ひよこ ひよこ

キューとトピックって何が違うの?

ペンギン先生 ペンギン先生

キューは1つのメッセージを1つのConsumerが処理する。トピックは1つのメッセージを複数のConsumerが受け取れる(Pub/Subパターン)。注文が来たら「在庫サービス」と「通知サービス」の両方に伝えたいなら、トピックを使うんだよ。

ひよこ ひよこ

メッセージが届いたかどうかってどうやって確認するの?

ペンギン先生 ペンギン先生

ACK(Acknowledgement:確認応答)という仕組みがあるよ。ConsumerがメッセージをACKするまで、ブローカーはそのメッセージを保持する。処理に失敗してACKを返さなかったらブローカーが再送してくれるんだ。

ひよこ ひよこ

メッセージの「冪等性」って何?同じメッセージが2回来たら2回処理されちゃうんじゃないの?

ペンギン先生 ペンギン先生

まさにメッセージブローカーで一番難しいポイントで、「At-least-once delivery(少なくとも1回は届ける)」を保証するブローカーでは、ネットワーク障害時にメッセージが重複して届くことがある。Consumer側で「同じメッセージIDを2回受け取ったら無視する」という冪等処理を実装する必要があるんだ。「Exactly-once delivery(1回だけ届ける)」を保証するKafkaのトランザクション機能もあるけど、パフォーマンストレードオフがあって使いどころを選ぶ必要があるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「メッセージブローカー」って出てきたら「サービス間の非同期メッセージを仲介・保管するミドルウェアのことだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「Message Broker」 = メッセージの「仲買人・仲介者」
💬 株式の「ブローカー(仲介業者)」と同じ語源。買い手と売り手を直接つなげず間に立って取引を仲介するイメージだよ
← 用語集にもどる