【原创】RabbitMQ 之 no_ack 分析
熟悉 RabbitMQ 的人肯定知道 no_ack 属性是在调用 Basic.Consume 方法时可以设置的一个重要参数。本文主要针对 no_ack 设置的两种情况,通过抓包分析的形式讲解下实际应用中的异同,并总结一下相关的处理经验。 ============ 我是分隔线 ============= no_ack 的用途 :确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。 情况一 : no_ack=true (此时为 自动应答 ) 在这种情况下,consumer 会在接收到 Basic.Deliver + Content-Header + Content-Body 之后,立即回复 Ack 。而这个 Ack 是 TCP 协议中的 Ack 。此 Ack 的回复不关心 consumer 是否对接收到的数据进行了处理,当然也不关心处理数据所需要的耗时。 图1:(Producer+Consumer) 图2:(Consumer) 图3:(Producer) 情况二: no_ack=false (此时为 手动应答 ) 在这种情况下,要求 consumer 在处理完接收到的 Basic.Deliver + Content-Header