[rabbitmq-discuss] Form Submission - Add A Question
Sean Treadway
sean at soundcloud.com
Mon Nov 24 13:09:04 GMT 2008
Ben,
On Nov 22, 2008, at 00: 54, Ben Hood wrote:
>> I don't believe I can control any socket options with the library
>> I'm using.
>
> Exactly my point. If you don't what your client is doing under the
> covers, you are not in a good position to reason with the behavior of
> the broker :-(
If I could control the consumer's channel's socket to minimize the
number of mid-flight messages, what socket options should I set?
>> The test case that I'm basing my observations on is zipped up with
>> instructions in the README. The tests require the EventMachine
>> gem, and
>> amqp 0.5.9 or source to be installed.
>
> OK, I'll try to have a look at this.
Matthias answered the question that this test case covered, so there's
no need to check the code here.
I understand better how the socket, channel and consumer behave in
terms of what I'm thinking of as a "client". Quite a bit more
involved than a simple FIFO buffer ;)
I had assumed that since these mid-flight, un-acked messages would
still exist in the broker, ready to be retried or persisted if they
were published with delivery-mode=2, they should should be counted
towards the 'message count'. I assumed that only when the persistence
rules would remove the message from the queue the message count would
also decrement.
This makes it clearer: http://lettuce.squarespace.com/faq/queues/when-declaring-a-queue-what-does-the-message-count-field-mea.html
But on a practical level, I think it's important to remind
explicitly that mid-flight messages for a consumer with no_ack=false
are not included in this count. And the maximum number of messages
sent to a consumer is determined by the basic.qos branch which is
currently pending QA, so at the moment, it's only limited by the
number of bytes buffered by the transport layer.
On small scale testing (0-10 messages like I was using) it wasn't
obvious that the message count was 0 because the 10 published, un-
acked messages lived in my consumer's socket buffer. Whereas for
larger tests, where the number of mid-flight messages are a smaller
proportion of the total messages, this statistic becomes more obvious
(and useful).
One our use cases, parallelizing long running jobs, emphasizes
reliability and accountability over throughput, so we would like to
measure all unacknowledged messages in a queue or limit the number of
messages consumed to one at a time. Our goal is to keep the queue
depth around 0-20 un-ack'd messages by controlling the number
consumers..
It looks like branch 19684 (rabbitmqctl list_queues messages_ready)
gives us the statistic we can use to tune our consumer pools. Are
there any plans of also exposing the 'messages_ready' statistic over
AMQP?
Or would branch 18577 (basic.qos) with pre-fetch set to 1 give us the
count of un-acknowledged messages we're looking for from a passive
queue.declare?
>> I'm sure that Basic.Get can be used, but in my rough tests, I
>> couldn't get
>> un-ack'd messages redelivered. I believe I was failing to close my
>> channel
>> to get them redelivered. I'll also take another look at Basic.Get
>> with
>> no_ack=true.
>
> http://lettuce.squarespace.com/faq/flow-control/how-long-does-it-take-to-redeliver-an-un-acknowledged-messag.html
:) A question about this answer... When you say "this can be done
_manually_ with basic.get", does this imply that the redelivered
message will be prioritized to the channel that issued the basic.get
over a channel with a consumer?
Thanks,
Sean
More information about the rabbitmq-discuss
mailing list