[解決済み] RabbitMQで再試行回数を設定するにはどうすればよいですか?
質問
RabbitMQを使用しており、電子メールメッセージを保持するキューがあります。私のコンシューマーサービスはメッセージをキューから外し、送信を試みます。何らかの理由でコンシューマがメッセージを送信できない場合、メッセージを再キューイングして再度送信したいと思います。basicNack を実行し、requeue フラグを true に設定することはできますが、メッセージを無期限に再キューイングしたくありません(たとえば、電子メールシステムがダウンした場合、未送信のメッセージを継続的に再キューイングしたくありません)。メッセージを再送信できる回数を制限したいのです。しかし、電子メールメッセージオブジェクトにフィールドを設定することはできませんが、それをdequeueしてnackを送信すると、更新されたフィールドは、電子メールメッセージオブジェクトに存在しません。更新されたフィールドは、キュー内のメッセージに存在しません。これにアプローチできる他の方法はありますか?事前にありがとうございます。
どのように解決するのですか?
RabbitMQ(AMQPプロトコルも同様)には再試行のような機能はありません。
再試行回数制限の動作を実装するための可能なソリューションです。
-
以前に再送信されていないメッセージを再送信する(チェックする
redelivered
パラメータでbasic.deliver
メソッドにあるパラメータ(ライブラリはこのためのインターフェイスを持っているはずです)を削除し、それを デッドレター交換 でキャッチし、何らかの処理をします。 -
メッセージが処理できなくなるたびに、それを再び発行しますが、ヘッダーフィールドを設定またはインクリメント/デクリメントして、例えば
x-redelivered-count
(のようなヘッダーフィールドを設定または増減します。) この場合、再送信を制御するには、設定したフィールドがある限界に達したかどうかをチェックする必要があります (上か下か - 私が選んだのは 0 です。同じような方法です)。ttl
のように)。 -
メッセージのユニークキー(uuidと言うが、メッセージを公開するときに手動で設定する必要がある)をRedisやmemcacheなどのストレージ、あるいはmysqlに再配信回数と一緒に保存し、再配信ごとにこの値を制限値に達するまで増加/減少させるようにします。
-
(本当のギークのために) あなたが望むような動作を実装するプラグインを書く。
のプロは #3 は、再配達されたメッセージがキューの先頭に留まることです。これは、キューが長い場合やメッセージの順序が重要な場合に重要です (再配達は厳密なメッセージ順序を破ることに注意してください。詳細は公式ドキュメントまたは SOのこの質問 ).
P.S:
があります。 似たような答え がありますが、phpで書かれています。それを見て、多分それはあなたが少し役立つ(単語からそれを読み始める サイクル再配信の問題に対処するための複数のテクニックがあります" .
関連
-
[解決済み】この動詞型ではcontent-bodyを送信できない
-
[解決済み] asp.netでWebサービスのタイムアウト時間を長くする方法は?
-
[解決済み] RabbitMQ / AMQP:単一のキューで、同じメッセージに対して複数のコンシューマー?
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] パッケージのダウングレード警告を検出(dotnet core, vs 2017)
-
[解決済み] enumを列挙するには
-
[解決済み] WPFの場合、x:Name属性とName属性の違いは何ですか?
-
[解決済み] Visual Studioのコンパイルエラー "mismatch between processor architecture "を修正するにはどうしたらいいですか?
-
[解決済み] .NETで文字列から発音区分符号(アクセント)を削除するにはどうすればよいですか?
-
[解決済み】RabbitMQとチャネルとコネクションの関係
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] VB.NETでプログラムパスを取得する?
-
[解決済み] <Database> コンテキストを支えるモデルが、データベース作成後に変更されました。
-
[解決済み] EF Coreのadd-migrationのビルドに失敗しました。
-
[解決済み] Windowsイベントログで参照される「フレームワークのバージョン」とは何ですか?
-
[解決済み] VB.NETでファイル名を一意のサフィックスに変更するには?
-
[解決済み] WinSCP 応答待ちタイムアウト
-
[解決済み] app.configが作成されるタイミングとapp.exe.configが作成されるタイミング、その違いとは?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Visual Studioの「Any CPU」ターゲットはどういう意味ですか?
-
[解決済み] WCF - メッセージサイズのクォータを増加させる方法