メッセージが送信された後に、RabbitMQ によって確実に保存されるしくみは?

RabbitMQのメッセージ永続化とは、メッセージが送信される際に、障害や再起動時にメッセージが失われないよう、メッセージをディスクに保持することです。

メッセージの永続化の原理は以下のとおりです。

  1. 永続的なエクスチェンジ(Exchange):エクスチェンジを作成する際に、durable パラメータを true に設定すると、そのエクスチェンジは永続的になります。永続的なエクスチェンジは、エクスチェンジのタイプやバインディング関係などのメタデータをディスクに格納するため、サーバーを再起動しても失われなくなります。
  2. キューの作成時にdurableパラメータをtrueにすると、キューは永続化されます。永続化キューは、キューのメタデータ(キュー内のメッセージ数、サブスクライバーなど)をディスクに保存して、サーバーの再起動時にデータを失わないようにします。
  3. Delibarモードを2(永続)に設定してメッセージを公開すると、メッセージは永続的になります。永続メッセージはメッセージ内容をディスク上に保存し、メッセージに永続フラグを付け、サーバーの再起動後でも使用できるようにします。
  4. ディスクへの同期書き込み:RabbitMQ は永続化型エクスチェンジ、永続化型キュー、永続化型メッセージに対するすべての操作をトランザクションログファイルへ同期書き込みします。これにより、サーバー障害や再起動が発生した場合でもトランザクションログファイルを読み込むことでメッセージのステータスを回復できます。

メッセージが永続化フラグで送信されていても、メッセージの消失は完全に保障されない点と、メッセージ送信用には下記の2点にも注意が必要である。

  1. メッセージパブリッシュを確実に行うには、Confirmモードを設定して、交換機へのメッセージ送信が完了したことを通知する応答の受信を確認できます。Confirmモードのコールバック関数を監視することで、メッセージが正常に交換機に送信されたかどうかを判断できます。正常に送信されなかった場合は、処理に失敗したときの対応が必要になります。
  2. メッセージ消費確認: コンシューマがメッセージを受け取ったら、ackモードを設定することでメッセージの消費確認を取得できます。 basic.ack()メソッドを呼び出してメッセージが消費されたことを確認し、消費が確認されなかった場合は再試行するか、メッセージをデッドレターキューに送信できます。

RabbitMQによるメッセージの永続化は、永続的エクスチェンジ、永続的キュー、永続的メッセージによって担保され、同時に操作はディスクに書き込まれたトランザクションログファイルに同期されています。加えて、メッセージの信頼性を確実にするために、メッセージの送信確認と消費確認を併用することが必要です。

bannerAds