したがって、RabbitMQ dead-letteringは、negative acknowledgementと同じではありませんが、関連付けることはできます。
あなたは(私はそれはあなたの説明は非常に抽象的であるcorrectly-理解していることを仮定して)記述されているシナリオは、かなり一般的な状況で、次の一連のイベントによって説明することができます。
- プロセッサからのメッセージを受け取りキュー
- プロセッサがメッセージを処理しようとしました
- プロセッサがメッセージ処理に失敗しました
- ?
質問は手順4で行うことです。多くのアプリケーションでは、手順4でメッセージを削除します。しかし、RabbitMQでは、この状況で否定応答を使用することができます。これは、メッセージを処理できなかったことをブローカに通知します。ブローカは、メッセージをキューの先頭に戻すことができます。同じプロセッサがメッセージを再度受け取って処理しないようにすることはできません。したがって、エラー状態が一時的な場合(つまりメッセージ自体ではなくプロセッサの問題)に使用する必要があります。
アプリケーションの処理ロジックは、メッセージをキューから取り出して処理しようとするときに決定する必要があります。たとえば、あらかじめ決められた時間待機することは理にかなっているかもしれません。また、サードパーティのAPIをポーリングしてバックアップが取れるまで賢明かもしれません。ここであなたがするのはあなた次第です。
デッドレタリング
メッセージ(basic.nackを)拒否したときに今、あなたはrequeue=false
を指定することにより、RabbitMQのデッド文字かどうかのメッセージを制御することができます。 requeueがfalseの場合、メッセージはデッドレターになります(デッドレターエクスチェンジが設定されていない場合はドロップされます)。
デッドレターのキューはまさにそれです。メッセージが消える場所です。基本的に、通常のプロセッサーをこのキューに接続するのは理にかなってはなりません。なぜなら、定義上、最初にメッセージが処理された理由は処理できないからです。そのため、条件を一時的にする(つまりサーバーがダウンする)場合は、メッセージを再キューし、条件が解決されるまでさらにメッセージの処理を停止します。一方、メッセージに問題がある場合は、すべての手段でデッドレターにしてください。
あなたの2つのオプションは相互に排他的ではなく、オプション2は実際に意味をなさない。うまくいけば、私の答えは混乱をなくしてくれるはずです。 – theMayer