[rabbitmq-discuss] py-amqplib status messages
Dmitriy Samovskiy
dmitriy.samovskiy at cohesiveft.com
Tue Nov 25 17:08:32 GMT 2008
Matthias Radestock wrote:
>
> So unless the sender has received some application level ack - such as a
> channel/connection.close-ok, or a tx.commit-ok - there is no way for it
> to be sure that the messages it has sent have been
> processed.
>
Understood. So if I don't receive an application level ack, I can't know how many messages
that I already sent, have been received by broker. Consider:
for i in range(1000): ch.basic_publish(Message(str(i)), 'amq.fanout')
and I get socket.error exception when i==500.
This means that I either have to do buffering inside producer in order to be able to
resend them all, or I have to wrap each basic.publish in tx.
In latter case, it's a total of 5 methods (tx.select, tx.select-ok, basic.publish,
tx.commit, tx.commit-ok). *If* AMQP spec offered a synchronous publish, it would be only 2
methods (basic.publish-with-confirmation, basic.publish-ok).
I take it there must be a reason why only async version of publish method is provided in
AMQP spec? Is anyone familiar with reasoning behind this decision?
On a side note, I found that if I sleep after each send in the above loop, I get
consistently higher success rates of received vs not received messages with py-amqplib on
Linux (essentially no message loss due to being in flight).
for i in range(1000):
ch.basic_publish(Message(str(i)), 'amq.fanout')
time.sleep(0.0001)
Without sleeps, tcpdump shows multiple basic.publish methods packed in a single TCP
packet. With sleeps, there are more TCP packets that carry the same number of
basic.publish methods. Note that this may not be the case for other client implementations
and could be OS dependent as well (not tested).
This may not be a good pattern to rely on, but in limited testing it worked for me.
- Dmitriy
More information about the rabbitmq-discuss
mailing list