1. ホーム
  2. .net

[解決済み] RabbitMQで再試行回数を設定するにはどうすればよいですか?

2023-06-12 16:59:25

質問

RabbitMQを使用しており、電子メールメッセージを保持するキューがあります。私のコンシューマーサービスはメッセージをキューから外し、送信を試みます。何らかの理由でコンシューマがメッセージを送信できない場合、メッセージを再キューイングして再度送信したいと思います。basicNack を実行し、requeue フラグを true に設定することはできますが、メッセージを無期限に再キューイングしたくありません(たとえば、電子メールシステムがダウンした場合、未送信のメッセージを継続的に再キューイングしたくありません)。メッセージを再送信できる回数を制限したいのです。しかし、電子メールメッセージオブジェクトにフィールドを設定することはできませんが、それをdequeueしてnackを送信すると、更新されたフィールドは、電子メールメッセージオブジェクトに存在しません。更新されたフィールドは、キュー内のメッセージに存在しません。これにアプローチできる他の方法はありますか?事前にありがとうございます。

どのように解決するのですか?

RabbitMQ(AMQPプロトコルも同様)には再試行のような機能はありません。

再試行回数制限の動作を実装するための可能なソリューションです。

  1. 以前に再送信されていないメッセージを再送信する(チェックする redelivered パラメータで basic.deliver メソッドにあるパラメータ(ライブラリはこのためのインターフェイスを持っているはずです)を削除し、それを デッドレター交換 でキャッチし、何らかの処理をします。

  2. メッセージが処理できなくなるたびに、それを再び発行しますが、ヘッダーフィールドを設定またはインクリメント/デクリメントして、例えば x-redelivered-count (のようなヘッダーフィールドを設定または増減します。) この場合、再送信を制御するには、設定したフィールドがある限界に達したかどうかをチェックする必要があります (上か下か - 私が選んだのは 0 です。同じような方法です)。 ttl のように)。

  3. メッセージのユニークキー(uuidと言うが、メッセージを公開するときに手動で設定する必要がある)をRedisやmemcacheなどのストレージ、あるいはmysqlに再配信回数と一緒に保存し、再配信ごとにこの値を制限値に達するまで増加/減少させるようにします。

  4. (本当のギークのために) あなたが望むような動作を実装するプラグインを書く。

のプロは #3 は、再配達されたメッセージがキューの先頭に留まることです。これは、キューが長い場合やメッセージの順序が重要な場合に重要です (再配達は厳密なメッセージ順序を破ることに注意してください。詳細は公式ドキュメントまたは SOのこの質問 ).

P.S:

があります。 似たような答え がありますが、phpで書かれています。それを見て、多分それはあなたが少し役立つ(単語からそれを読み始める サイクル再配信の問題に対処するための複数のテクニックがあります" .