ドキュメント生成用のRabbitMQキューがあります。基本的に、各ドキュメントにはtype
とstate
(新規、処理中、準備完了)があるため、type.state
のようなルーティングキーを使用してトピック交換を使用します。ドキュメントが変更されるたびに、最後のドキュメントの説明を含むメッセージを取引所に送信します。これで十分に機能します。
ただし、ドキュメントを2回処理できる場合があります。
report.new
が交換に送信されます。report.new
が送信されます。今のところ、ワーカーに小さなコードを追加し、メッセージのlast_modified
ドキュメントキーをデータベースのキーと比較して、同じでない場合はメッセージを確認します。しかし、これが最善の解決策ではないと思います。
私の考えは、メッセージヘッダーにID
を追加し、同じID
を持つ古いメッセージをキューから削除するRabbitMQプラグインを用意することです。
ありがとう。
追伸たぶん、別のMQエンジンがここで役立つ可能性がありますか?例えば。多分ActiveMQはそのような機能を持っていますか?
わかりました。RabbitMQの内部アーキテクチャについて読んだところ、不可能であることがわかりました。それで、それを探している誰かのための道。
ID
のみを送信するID
値は、このID
に対して最後に実行されたワーカーのタイムスタンプです。あなたはこれをチェックすることができます プラグイン ブローカー内で公開されたメッセージを重複排除することを可能にする私が書いた。
必要に応じて、取引所またはキューで重複排除を行うことができます。パブリッシャーが行う必要があるのは、x-deduplicate-message
メッセージヘッダーをメッセージのID
で設定することだけです。
あなたが書いたように、 ActiveMQには「重複メッセージ検出」があります ですが、動作が異なります。キューから古いメッセージを削除することはありませんが、代わりに新しいメッセージを追加することはありません。したがって、 RabbitMQのプラグイン と同じように機能します。