RabbitMQによってメッセージの消失がどのように保証されるか
RabbitMQでメッセージが失われないようにするには以下の方法があります。
- メッセージをパブリッシュする前にセッティングすることで、メッセージがサーバのリスタート後も永続化され、削除されずに残せるように設定することができます。それは、メッセージの delivery mode プロパティを 2 に設定することで実現されます。
- キューを永続キューとしてマークして、RabbitMQサーバーが再起動したあともキューが存在するようにすることができます。これは、キューを宣言するときにdurableパラメータをtrueに設定することで実現できます。
- トランザクションモード:メッセージの送受信にトランザクションを使用できます。トランザクションモードでは、送信側はトランザクション内に複数の操作をまとめることができ、RabbitMQサーバーは、メッセージが確実にキューに格納されるまで、トランザクションがコミットされるまで待ちます。ただし、トランザクションモードはパフォーマンスを低下させるため、高スループットのシナリオには適さない場合があります。
- RabbitMQサーバへのメッセージ送信の成功確認のため送信確認メカニズムを使用できます。送信側はmandatoryパラメータとconfirmパラメータを設定することで送信確認を実現できます。mandatoryがtrueに設定されている場合、メッセージがキューにルーティングできなかった場合、RabbitMQサーバはbasic.returnメッセージを返します。confirmがtrueに設定されている場合、送信側は送信確認としてbasic.ackメッセージまたはbasic.nackメッセージを受信するまで待機します。
- バックアップキューとミラーキュー:バックアップキューとミラーキューの仕組みを使ってメッセージの高可用性を保ちます。バックアップキューは、メインキューにアクセスできないときにメッセージを保存する補助キューです。ミラーキューは、メインキューのメッセージを複数のミラーキューに複製することで、メッセージの冗長な保存を実現します。このように、特定のキューに障害が発生しても、バックアップキューまたはミラーキューからメッセージを取得できます。
要するに、メッセージのロストを防ぎたいのであれば、メッセージとキューを永続化し、トランザクションモードを使うか、送信確認メカニズムを使ったり、バッキングキューとミラーリングキューを使ったりして、高可用性を実現します。