3

私はいくつかのキューを持っています、などのために:

online_queue = self._channel.queue_declare(
                                   durable = True,
                                   queue = 'online'
                                   )

現時点では、このキュー内のすべてのコンテンツをフラッシュする必要があります。ただし、現時点では、おそらく別のプロセスがこのキューに公開される可能性があります。channel.queue_purge(queue ='online')を使用すると、queue_purgeが機能している間に、公開されたメッセージはどうなりますか?

4

2 に答える 2

2

最終的な目標によっては、一時キューを使用してこの問題を解決できる場合があります。

物事をより明確にするために、物事にいくつかの名前を付けましょう。現在のキュー(パージするキュー)をキューAと呼び、ExchangeAに1対1でバインドされていると想定します。

新しいキュー(キューB)を作成し、キューAがバインドされるのと同じ方法でExchange Aにバインドすると、キューBはキューAが取得するすべてのメッセージ(バインド時から)を取得するようになります。

これで、キューBがバインドされた後に送信されたメッセージを失うことなく、キューAを安全にパージできます。

キューAをExchangeAに再バインドすると、バックアップが実行されます。

その後、必要に応じて、キューBの「中間」メッセージを処理できます。

これには、動作が非常に明確に定義されているという利点があり、キューAを完全に吹き飛ばして、パージする代わりに再作成できるため、競合状態に陥ることはありません。

于 2012-02-14T15:12:01.437 に答える
0

あなたは競合状態を説明しています。キューに残っているものもあれば、パージされるものもあります。または、それらのすべてがパージされます。または、それらのどれもパージされません。

時期によって違うのでなんとも言えません。まだアクティブなキューをパージする必要性を再検討するか、接続先のキューにメッセージが存在する可能性があるという事実に対応できるより堅牢なコンシューマーを構築する必要があります (これは基本的にコンシューマーが対処しなければならないことです) 、 とりあえず)。

于 2011-11-25T23:57:26.940 に答える