web-dev-qa-db-ja.com

RabbitMQ:カウンターでメッセージを再キューイングする方法

手動でジョブを再キューイングせずに、ジョブが(RejectまたはNakを介して)再キューイングされた回数をカウントする方法はありますか? 'n'時間ジョブを再試行し、 'n'時間後にドロップする必要があります。

ps:現在、ジョブを手動で再キューイングしています(古いジョブを削除し、正確なコンテンツと追加のCounterヘッダーを使用して新しいジョブを作成します(カウンターがない場合、または値が 'n'未満の場合))

15
fzerorubigd

メッセージが1回以上再配信されたときにtrueに設定されるredeliveredメッセージプロパティがあります。

再配信数または左再配信数(別名ホップ制限またはIPスタックのttl)を追跡する場合は、その値をメッセージ本文またはヘッダーに格納する必要があります(文字通り-メッセージを消費し、変更してから、変更してブローカーに公開します)。

あなたを助けるかもしれない答えのある同様の質問もあります: RabbitMQで再試行の回数を設定するにはどうすればよいですか?

15
pinepain

メッセージが実際にデッドレターであった場合は、x-deathメッセージヘッダーの内容を確認できます。

これは、たとえば、reject/nackrequeue = falseがあり、キューにデッドレター交換が関連付けられている場合に当てはまります。

その場合、このヘッダーの内容は配列です。各要素は、失敗した配信試行を記述し、配信が試行された時刻、ルーティング情報などの情報を含みます。

これはRabbitMQで機能します-一般的にAMQPに適用できるかどうかはわかりません。

[〜#〜]編集[〜#〜]

私が最初にこの回答を書いたので、x-deathヘッダー構造が変更されました。

ヘッダーの形式が変わるのは一般的に非常に悪いことですが、この特定のケースでは、メッセージが継続的にデッドレターされた場合、メッセージサイズが無期限に大きくなるためです。

したがって、メッセージの死亡数を取得するためにここにあったコードを削除しました。

新しいヘッダー形式から死亡数を取得することは引き続き可能です。

5
Pete