<font face="arial" size="2"><p style="margin:0;padding:0;">BTW, this article about EventMachine (http://www.paperplanes.de/2011/4/25/eventmachine-how-does-it-work.html)</p>
<p style="margin:0;padding:0;">&nbsp;</p>
<p style="margin:0;padding:0;">says that EM.connect disables Nagel:</p>
<p style="margin:0;padding:0;">&nbsp;</p>
<p style="margin:0;padding:0;">
<p style="margin:0;padding:0;color: #4c4c4c; font-family: 'Lucida Grande', Verdana; font-size: 12px; line-height: 18px;"><em><span style="font-family: arial, helvetica, sans-serif; color: #000000;">"When you call&nbsp;<code style="font-family: Monaco, 'Courier New', Courier; font-size: 10px; color: #000000;">EM.connect</code> to open a connection to a remote server, the connection will be immediately created, but it may not finish until later. The resulting connection will have a bunch of properties:"</span></em></p>
<p style="margin:0;padding:0;color: #4c4c4c; font-family: 'Lucida Grande', Verdana; font-size: 12px; line-height: 18px;">&nbsp;</p>
<p style="margin:0;padding:0;color: #4c4c4c; font-family: 'Lucida Grande', Verdana; font-size: 12px; line-height: 18px;"><em><span style="font-family: arial, helvetica, sans-serif; color: #000000;">[...]</span></em></p>
<p style="margin:0;padding:0;color: #4c4c4c; font-family: 'Lucida Grande', Verdana; font-size: 12px; line-height: 18px;"><em><span style="font-family: arial, helvetica, sans-serif; color: #000000;"><br /></span></em></p>
</p>
<p style="margin:0;padding:0;"><span style="font-family: arial, helvetica, sans-serif;"><em><span style="font-size: 10pt; line-height: 18px;">"The Nagle algorithm is disabled to prevent the TCP stack from delaying sending packets by setting</span><span style="font-size: 10pt; line-height: 18px;"> </span><code style="line-height: 18px; font-family: Monaco, 'Courier New', Courier; font-size: 10px;">TCP_NODELAY</code><span style="font-size: 10pt; line-height: 18px;"> </span><span style="font-size: 10pt; line-height: 18px;">on the socket. The operating system wants to buffer output to send fewer packets. Disabling Nagle causes any writes to be sent immediately. As EventMachine does internal buffering, it's preferrable for the data to be really sent when it's eventually written to a socket."</span></em></span></p>
<p style="margin:0;padding:0;">&nbsp;</p>
<p style="margin:0;padding:0;">-larry</p>
<p style="margin:0;padding:0;">&nbsp;</p>
<p style="margin:0;padding:0;">-----Original Message-----<br />From: "Simon MacMullen" &lt;simon@rabbitmq.com&gt;<br />Sent: Wednesday, November 7, 2012 4:50am<br />To: "Discussions about RabbitMQ" &lt;rabbitmq-discuss@lists.rabbitmq.com&gt;<br />Cc: larry.edelstein@therealreal.com<br />Subject: Re: [rabbitmq-discuss] redelivery after ACK<br /><br /></p>
<div id="SafeStyles1352414425">
<p style="margin:0;padding:0;">Hmm.<br /><br />Acks only matter to the server if it receives them. I wonder if you are <br />killing the script after it has sent acks, but before the server has <br />received them. That's consistent with what you're seeing re some acks <br />getting through when you ack a lot - those are the ones that made it all <br />the way to the server before the client was killed.<br /><br />You may also be running into the Nagle algorithm. Not sure how you would <br />disable that for the Ruby gem. Is the author here?<br /><br />Cheers, Simon<br /><br />On 07/11/12 03:48, larry.edelstein@therealreal.com wrote:<br />&gt; Hi folks - I'm new to RabbitMQ. I've got a problem and need some help.<br />&gt;<br />&gt; I've posted the question on Stack Overflow at<br />&gt; http://stackoverflow.com/questions/13262738/redelivery-after-ack, so if<br />&gt; you want to answer it there, please do! I'll do my best to repost, here,<br />&gt; any answers I get there, so that rabbitmq-discuss list denizens can also<br />&gt; see and discuss.<br />&gt;<br />&gt; So feel free to go to Stack Overflow, or read it here.<br />&gt;<br />&gt;<br />&gt; Larry Edelstein<br />&gt;<br />&gt; Now Answers, Inc.<br />&gt;<br />&gt; m (415) 713-9148<br />&gt;<br />&gt; ribs@acm.org<br />&gt;<br />&gt;<br />&gt; +++<br />&gt;<br />&gt; Why are my RabbitMQ messages being redelivered to my consumer after they<br />&gt; have been ACKd? I'm new to RabbitMQ; I must be misusing it, or there's<br />&gt; something wrong perhaps with the Ruby amqp gem.<br />&gt;<br />&gt;<br />&gt; I have a ruby script that subscribes to a queue and acks each message.<br />&gt; If I let it make it all the way through the messages, the messages<br />&gt; really do disappear from the queue; they're not redelivered. But if I<br />&gt; interrupt my script before they're all ACKd, and then start the script<br />&gt; again, delivery starts anew from the first message.<br />&gt;<br />&gt;<br />&gt; The behavior I'm seeing in code is reflected accurately by the RabbitMQ<br />&gt; web management interface; the queue has messages, and despite the ACKs,<br />&gt; they don't disappear.<br />&gt;<br />&gt;<br />&gt; Clue: I put about 5000 messages in the queue. If I let the consumer ACK<br />&gt; a significant amount, a few messages do actually appear to be removed<br />&gt; from the queue (contrary to what I said above). I haven't been able to<br />&gt; nail this phenomenon down.<br />&gt;<br />&gt;<br />&gt; I'm using ruby 1.9.3, RabbitMQ 2.8.7, and the amqp ruby gem 0.9.8. It<br />&gt; happens with producer and consumer on Ubuntu 12.0.4, or on Mac OS 10.7.4.<br />&gt;<br />&gt;<br />&gt; What the heck??<br />&gt;<br />&gt;<br />&gt; Here's the code for the consumer:<br />&gt;<br />&gt;<br />&gt; # encoding: utf-8<br />&gt;<br />&gt; require "rubygems"<br />&gt;<br />&gt; require 'amqp'<br />&gt;<br />&gt; require 'aws-sdk'<br />&gt;<br />&gt; queue_name = "some.queue"<br />&gt;<br />&gt; begin<br />&gt;<br />&gt; AMQP.start("amqp://localhost:5672") do | connection |<br />&gt;<br />&gt; channel  = AMQP::Channel.new(connection)<br />&gt;<br />&gt; queue = channel.queue(queue_name, :durable =&gt; true)<br />&gt;<br />&gt; queue.subscribe(:ack =&gt; true) do | metadata, payload |<br />&gt;<br />&gt; metadata.ack<br />&gt;<br />&gt; end<br />&gt;<br />&gt; end<br />&gt;<br />&gt; end<br />&gt;<br />&gt;<br />&gt; and here's the producer:<br />&gt;<br />&gt;<br />&gt; # encoding: utf-8<br />&gt;<br />&gt; require "rubygems"<br />&gt;<br />&gt; require 'amqp'<br />&gt;<br />&gt; require 'aws-sdk'<br />&gt;<br />&gt; msg = ARGV[0]<br />&gt;<br />&gt; queue_name = "some.queue"<br />&gt;<br />&gt; begin<br />&gt;<br />&gt; AMQP.start("amqp://localhost:5672") do | connection |<br />&gt;<br />&gt; channel  = AMQP::Channel.new(connection)<br />&gt;<br />&gt; queue    = channel.queue(queue_name, :durable =&gt; true)<br />&gt;<br />&gt; (1..5000).each do | x |<br />&gt;<br />&gt; channel.default_exchange.publish x, :routing_key =&gt; queue_name,<br />&gt; :persistent =&gt; true<br />&gt;<br />&gt; end<br />&gt;<br />&gt; end<br />&gt;<br />&gt; end<br />&gt;<br />&gt;<br />&gt;<br />&gt;<br />&gt; _______________________________________________<br />&gt; rabbitmq-discuss mailing list<br />&gt; rabbitmq-discuss@lists.rabbitmq.com<br />&gt; https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss<br />&gt;<br /><br /><br />-- <br />Simon MacMullen<br />RabbitMQ, VMware</p>
</div></font>