【らびっとえむきゅー】

RabbitMQ とは?

最終更新:
💡 メッセージを預かって「振り分けて届ける」郵便局のような仲介役

AMQPなどのプロトコルに対応したオープンソースのメッセージブローカー。送り手と受け手の間でメッセージを預かり、システム間の非同期通信を実現する。

📌 このページのポイント
RabbitMQ — メッセージブローカーの構造 Producer A Producer B Exchange 振り分け Queue 1 Queue 2 Consumer X Consumer Y 送信者 ルーティング 待ち行列 受信者 非同期処理 送受信を分離 信頼性 ackで未処理分を再配信 スケーラブル Consumer追加で負荷分散 メッセージをキューで仲介し、送受信を非同期に
RabbitMQのメッセージブローカー構造
ひよこ ひよこ
Kafkaとどう使い分けるの?
ペンギン先生 ペンギン先生
RabbitMQはExchangeでメッセージを柔軟に振り分けて、受け手が処理したらキューから消えるのが基本の動き。注文処理やタスクキューのように「誰かが1回処理すればいい仕事」に向いているよ。Kafkaはイベントを追記型のログとして保存して、複数の受け手があとから何度でも読む用途が得意だね。ただRabbitMQにもStreamsというログ型の機能があるから、要件で比べるのが大事だよ
ひよこ ひよこ
Exchange って何?
ペンギン先生 ペンギン先生
ProducerはキューではなくExchangeにメッセージを送り、Exchangeがバインディングのルールに従ってキューに振り分けるんだ。代表的な種類は、ルーティングキーの完全一致で送るDirect、つながっている全キューにコピーを送るFanout、パターンで一致させるTopic、ヘッダーの値で決めるHeadersだよ。ほかにも特殊な種類やプラグインで追加できるものがあるんだ
ひよこ ひよこ
メッセージは消えないの?
ペンギン先生 ペンギン先生
設定と使い方しだいだね。Consumerが処理を終えてからack(確認応答)を返し、送り手もパブリッシャー確認で受け取りを確かめれば「少なくとも1回」の配信になる。逆にackを使わないと、途中で失われる可能性があるよ。受け手が再投入なしで拒否したメッセージや期限切れのメッセージは、設定によってデッドレター用の宛先に送ることもできるんだ
ひよこ ひよこ
少なくとも1回ってことは、2回届くこともあるの?
ペンギン先生 ペンギン先生
そうなんだ。たとえばブローカーは受け取ったのに、その確認がネットワークの障害で送り手に届かないと、送り手は再送する。すると同じメッセージが2回入ることがあるよ。だから受け手は、同じメッセージを2回処理しても結果が変わらない(冪等な)作りにしたり、IDで重複を除いたりする必要があるんだ
もっと詳しく知りたい人へ

古い記事にある「Lazy Queueを使う」という設定は、今も必要なの?

現在のRabbitMQでは不要です。公式ドキュメントによると、lazyモードは3.12で廃止され、現在のクラシックキューは既定でメッセージをディスクに書きつつ、少量だけをメモリに置いて配信する動きになっています。lazyのページは過去の参考情報として残されています。キューに大量のメッセージがたまる用途では、クォーラムキューやStreamsが選択肢として案内されています。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「RabbitMQ」って出てきたら「メッセージを預かって受け手に振り分けるオープンソースのメッセージブローカー」と思えればだいたいOK!
📖 おまけ:英語の意味
「RabbitMQ」 = Rabbit(ウサギ)+ MQ(Message Queue)
💬 MQはメッセージキュー(Message Queue)の略だよ。Rabbitという名前を選んだ理由は、公式ドキュメントでは確認できなかったんだ

参考資料

← 用語集にもどる