[rabbitmq-discuss] AMQP message publishing - I wish it was synchronous

Chris Duncan celldee at gmail.com
Mon Jan 4 21:26:31 GMT 2010


Before I begin let me state for the record that I have read the 0-8  
and 0-9 AMQP specs and realise that they will not change just because  
I believe that it might be a good idea. Neither do I advocate  
deviation from the specs for the sake of expedience.

OK, I've been looking at including Channel.Flow method processing in  
the Bunny client (again) and have come to the conclusion that  
publishing should be synchronous in AMQP terms. My reasoning is as  
follows -

The AMQP Channel.Flow method is a device to try to prevent servers  
getting swamped by message producing clients. The server sends a  
Channel.Flow method with :active argument set to false to a producer  
in order to get the producer to stop sending messages when server  
memory is getting critically low.

When a client application publishes a message it passes that message  
into the care of the server. If something goes wrong the client  
application needs to be notified, but it is equally important for the  
client to know that the server has the message and will do its level  
best to deliver it to an appropriate destination queue. It seems to  
me that the second piece of information, namely a "yes I have your  
message", is missing. This absence of information means that the  
client has to make a judgement on the success of the publish  
operation based on what it does not receive, rather than what is does  
receive.

If, after issuing a Basic.Publish method, a client does not receive  
an error indication or Channel.Flow method, it has to assume that a  
publish has succeeded. For a simple single-threaded synchronous  
client like Bunny, the lack of a publish-ok method means that it has  
to wait to see whether a message arrives that indicates a problem. So  
in the case of Basic.Publish, the client could do a blocking read  
that times out if no message is received. However, even if I could  
rely on the timeout to work without fail (which my current testing is  
suggesting may not be the case), I don't like that solution at all.

With a publish-ok method things become much more straightforward. If  
the client receives a publish-ok then everything is rosy in the  
garden. If not, the client handles the issue. There could be  
a :nowait flag as there are for other methods for asynchronous  
processing.

If anyone has any ideas as to how I can get around this issue using  
Ruby without additional threads, fibers, eventmachine etc. I would be  
very pleased to hear from them.

Regards,

Chris




More information about the rabbitmq-discuss mailing list