RabbitMQ 将消息投递到客户端后,客户端若是没处理完这个消息就死掉了,这个消息还会不会存在?这取决于 RabbitMQ 的消息确认机制(Message acknowledgment)是否打开。 shell
为了确保消息不会丢失,RabbitMQ 支持消息确认机制。(在开启了消息确认机制后)客户端须要在收到消息并处理完后,发送一个 ack 消息给 RabbitMQ,告诉它该消息能够被安全删除了。假如客户端在发送 ack 以前意外死掉了,那么 RabbitMQ 会将消息投递到下一个 consumer 客户端。若是有多个 consumer 客户端,RabbitMQ 在投递消息时是轮询的。 安全
RabbitMQ 如何判断客户端死掉了?惟一根据是客户端链接是否断开。这里没有超时机制,也就是说客户端能够处理一个消息很长时间,只要没断开链接,RabbitMQ 就一直等待 ack 消息。 spa
消息确认机制默认是打开的,除非你设置 no_ack=True 标记来手工关闭它。 code
经过以下命令查看系统里的未确认消息: orm
#rabbitmqctl list_queues -p /path name messages_unacknowledged Listing queues … queue_storm_actionlog 0 dev_queue_storm_actionlog 0 …done.