2016-07-07 5 views
1

私はrabbitmqがどのようにバッチ謝辞を扱うかについて質問をしました。 Prefetch値は、制限に達する前にキューに入れられるメッセージの最大数です。しかし、回答者が自分自身を管理しているのか、これをコードで管理しなければならないのかはわかりませんでした。RabbitMQバッチAck

どの方法が正しいですか?

10個のACKが送信し、最後のものだけを送信することになっていたとAMQPは自動的にキュー内のすべての以前に送信されますまで、真

または

に複数設定して待機を各basicAckを送信します。 (複数の値をtrueに設定)

答えて

1

最初の修正はPrefetch value is the max number of messages that will get queued before reaching its limit.です。これはプリフェッチ値とは異なります。 prefetch valueは、コンシューマがキューから取得するUN-ACKedメッセージの数です。したがって、彼らは消費者に割り当てられていますが、承認されるまで待ち行列にとどまります。引用プリフェッチこれは 時に労働者に複数のメッセージを与えることはないのRabbitMQを告げる1

あるhere、から。つまり、以前のメッセージを処理して確認するまで、新しいメッセージをワーカー に送信しないでください。

そして、あなたの質問には:

私は、ACKのが自分自身を管理するかどうかわからなかったか、私はコードで にこれを管理する必要がある場合。

あなたがtrueに自動ACKフラグを設定することができ、その後、あなたがthe ack's manage themselves

+0

私はmultipleをtrueに設定すると、一度にいつ、どれだけ多くの時間を知ることができますか?それはapiだけが管理しているのでしょうか?それとも、その時点で準備が整っていることを確認していますか?それが事実なら、実際にはいくつかの反応を待たせたい場合、第2のケースは適切ではないでしょうか? – JeremyK

+0

基本的な質問を申し訳ありません。私はAMQPの経験がなく、突然私はそれのパフォーマンスを向上させる必要があります:) – JeremyK

+0

@JeremyK私は複数についてはわかりません、それは適切なユースケースを持っていたことはありません。これが本当に必要なものであることは確かですか?あなたは自動でACKを受け取ることはできませんか?処理を完了したらただちに1つずつACKを送ることはできませんか? – cantSleepNow

1

TLと言うことができ; DRは、複数の=真がいくつかのケースでは高速ですが、要件のような多くの慎重な簿記とバッチが必要です

消費者は、その消費者固有の単調増加IDを持つメッセージを取得します。 idは64ビットの数字です(実際には符号なし32ビットかもしれませんが、Javaでは長さがないため配信タグと呼ばれます)。プリフェッチは、コンシューマが受け取ったメッセージの中で、最も重要なメッセージです。

trueが複数ある最高の納品書をお受け取りになった時点で、消費者が未処理の納品書が少ない(小さい番号の)梱包されていないメッセージはすべて了承されます。明らかに、高いプリフェッチがある場合、これは各メッセージを確認するよりも高速です。

ここで、RabbitMQはコンシューマがメッセージ(受信していないメッセージ)を受信したことを知っていますが、すべてのメッセージが正しく消費されたかどうかはわかりません。したがって、以前のすべてのメッセージが消費されたことを確認することは、開発者の負担です。コンシューマはメッセージを順番に配信します(内部的にはクライアントがBlockingQueueを使用すると信じていますが)下流のライブラリ/クライアントによっては、メッセージが正しくない可能性があります。

これは実際には、メッセージを一度にまとめて(トランザクションやメッセージのグループを他のシステムに送信する)、確実にバッファリングする場合にのみ有効です。多くの場合、これはブロッキングキューを使用して行われ、キューを定期的に排除して一連のメッセージをダウンストリームシステムに送信します。

一方、各メッセージをリアルタイムでストリーミングする場合、実際にはこれを行うことはできません(つまりmultiple = false)。

グループ内のメッセージが悪い場合(たとえば、内部キューから削除されています...ウサギキューではない場合)、その悪いものを無効にしません。その場合、倍数= trueのいずれかを使用することはできません。

最後に、(時間の代わりに)一定量のメッセージをプリフェッチよりも待っていたら、無期限に待っています....良い考えではありません。あなたは時間を待つ必要があり、メッセージの数は<=プリフェッチでなければなりません。

正しく見ると分かりますが、正しく使用するには、倍数= trueを正しく使用してください。

関連する問題