2012-04-14 5 views
8

私の消費者は基本的に生産者です。最初のデータセットが取得され、キューに送信されます。消費者は、アイテムを取り、それを処理し、3つの可能性があります、その時点から:ユニークなメッセージをrabbitmqキューに確実に入れることは可能ですか?

  1. データは良好であり、
  2. データが不良であるストレージに「良い」キューを入れて
  3. データを破棄します良いではありません(まだ)または悪い(まだ)ので、データはより小さな部分に分割され、さらに処理するためにキューに戻されます。

私の問題は、キューが非常に迅速に成長し、キューに複製されたパーツにデータが分割され、コンシューマが処理を続ける可能性があるためです無限ループ

私はこれを防止する方法は、重複がキューに入るのを防ぐことだと思います。私はクライアント側でこれを行うことはできません。なぜなら、1時間かけて、数十億のデータポイントを扱うコアがたくさんあるからです(各クライアントがそれをスキャンしてあまりにも遅くなってしまいます)。私はこれをサーバー側で行う必要があると思いますが、前述したようにデータはかなり大きく、効率的に重複がないようにする方法はわかりません。

私は不可能と尋ねているかもしれませんが、私はそれを撃つと思っていました。どんなアイデアでも大歓迎です。

"...its possible that a piece of data is broken down into a part that's 
duplicated in the queue and the consumers continue to process it and 
end up in a infinite loop." 

あなたのキューに入れられた項目の一意であなたが望むすべてを集中することができますが、IMO、あなたの努力を集中すべきところ、上記の問題がある:

答えて

2

コアの問題は、このように思われます。無限ループを防ぐ1つの方法は、破損したアイテムを再キューに入れる前に、消費者が設定したメッセージペイロードに「visited」ビットを置くことです。

もう1つの選択肢は、コンシューマが無限ループを防ぐために若干異なる扱いをする特別なキューに再キューし直すことです。いずれにしても、メッセージングシステムの機能を使用してアプリケーションの戦略の中核をなすのではなく、メッセージングシステムの機能を使用することで、この問題を解決する必要があります。

+0

私はそれを正確にやろうとしています(私は思っています)。過去のアイテムの重複がないことを保証することによって、同じデータが複数回処理されないことを保証しています。私は単にrabbitmqの実装について確信しています。単純にメッセージIDを送信し、rabbitmqで重複を破棄するか、フィルタを設定する必要がありますか(rabbitmqとはどのように動作しますか)。 –

+0

これを行う方法はありません、AFAIK。ウサギはあなたのメッセージの内容やあなたの待ち行列にあるものを気にしないので、これを世話するのはあなたのアプリケーションに任されます。 –

+0

私のメッセージIDがユニーク(私の実際のデータのハッシュコード)であれば、それらをDBなどに保存し、それに対して質問する必要があります。私はそれを考えていましたが、メッセージサーバーが待機している間にクライアントがいくつかのクエリを実行する必要があります(メッセージサーバー自体にこの作業をプッシュできるかどうかを確認しようとしていました) –

8

私はあなたがキューに重複を送っていないという問題を解決できたとしても、あなたは遅かれ早かれ、この問題にヒットすると思う:

RabbitMQのドキュメントから:「障害からの回復:イベントでのことクライアントが接続されたノードに障害が発生したためにクライアントがブローカから切断された場合、クライアントがパブリッシングクライアントであった場合、クライアントからのメッセージを受信して​​クライアントに渡すことができます同様に消費側では、クライアントがメッセージの確認応答を発行し、その確認応答がブローカに送信されたかどうか、またブローカに処理されたかどうかは分かりません発生した。要するに、あなたはまだ消費するクライアントが特定し、重複したメッセージに対処できることを確認する必要があります。」

基本的には、次のようになり、あなたがRabbitMQのための要求を送信、RabbitMQのはACKで応答しますが1つの理由のためにRabbitmqはackが受信されていないことを知る方法がなく、プロデューサは決してackを受信して​​いないメッセージを再送することになります。

特にメッセージングがRPCの一種として使用されるアプリで重複メッセージを処理するのは苦痛ですが、この種のメッセージングアーキテクチャを使用する場合は避けられないように見えます。

関連する問題