2016-03-23 6 views
5

TL; DR:もともとメッセージが拒否されていたコンシューマーコードを修正したら、デッドレターメッセージを元のキューに「再生」する必要があります。RabbitMQのデッドレターの扱い

RabbitMQのデッドレターエクスチェンジ(DLX)を設定し、拒否されたメッセージをデッドレターキューに正常にルーティングしました。しかし今、私はデッド・レター・キュー内のメッセージを見て、それぞれの処理方法を決定しようとします。問題のコンシューマコードが修正されると、これらのメッセージのいくつか(多くは?)が元のキュー(「x-death」ヘッダーで利用可能)に再生(キューイング)されます。しかし、どうやってこれを実際にやっていくのですか?デッド・レター・キューからメッセージを読み込んで、それを送信するターゲット・キューを指定できるようにする、一度限りのプログラムを書くべきでしょうか?デッド・レター・キューの検索はどうですか?メッセージ(JSONでエンコードされているもの)に、検索して再生したい特定の属性があることがわかったらどうなりますか?たとえば、Pac​​ketId:1234のメッセージで正常に処理できることがわかっている不具合を修正します。私はこれについて私は一度だけのプログラムを書くこともできます。

私は確かにこれらの問題に遭遇する最初の人になることはできません。他の誰かがすでにそれらを解決しているのだろうかと思います。この種のものにはスイスアーミーナイフがあるはずです。私はGoogleとStack Overflowでかなり広範な検索を行ったが、実際にはあまり出てこなかった。私が見つけることができる最も近いものはシャベルでしたが、それは実際に仕事のための適切なツールのようには思われません。

答えて

4

デッドレターキューからメッセージを読み込んで、送信先キューを指定できるようにする必要がありますか?

一般に、はい。

delay message exchange pluginの組み合わせを使用して、メッセージを元のキューに再送するように遅延再試行を設定することができます。

しかし、これはある間隔での再試行のみを自動化し、再試行が発生する前に問題を修正していない可能性があります。

状況によっては、外部リソースが一時的に利用できなくなったためにエラーが発生したような場合もあります。あなたのケースで

は、しかし、私は死んで文字を処理するためのアプリの作成に関するあなたの考えは、いくつかの理由のために、行くための最良の方法であると信じて:

  • あなたがメッセージを検索する必要があり、どのISN 「tは可能RMQ
  • これはあなたがDLX /キューからメッセージを引っ張っているので、あなたが確認する必要がありますDLX /キュー

からのメッセージを格納するためのデータベースが必要になります意味メッセージからすべてのヘッダー情報を取得して、tに再公開できるようにします時間が来たらキューを修正します。

私は確かにこれらの問題に遭遇する最初の人になることはできません。他の誰かがすでにそれらを解決したのかどうか疑問に思っています。

あなたはありません!

この問題には、あなたが提案した解決策に至るまで、多くの解決策があります。

いくつかのより大きい「サービスバス」実装には、このタイプの機能が組み込まれています。私はNServiceBus(またはそれのSaaSバージョン)がこれを内蔵していると信じています。例えば、私はそれを100%確信していません。

これをさらに調べたい場合は、「毒メッセージ」という用語を検索します。これは一般的にこの状況で使用される用語です。助け

希望:私はパスへあなたを助けるかもしれクイック検索とGoogleでいくつかのことを、見つけました!

+0

私は、特に有用なリンクを見つけられませんでしたが、そうでなければあなたの徹底的な答えに本当に感謝します。ありがとう! – Dan

+0

ええ、私は本当にそれらのリンクを読んでいませんでした。私はちょうど助けるかもしれない何かをすばやく見つけることを試みていた。それらを掲示する前にそれらを読んでいるはずです。 :P –

関連する問題