文章目录
- 1. 不做任何ack
- 2. ack
- 3. reject
- 4. Nack
1. 不做任何ack
如果队列使用的是手动ack,但在接收消息后不做任何ack处理,RabbitMQ会把消息标记为 unacked
,unacked状态的消息不会被消费,并且占用RabbirMQ资源,只有当消费者channel断开或者服务器重启,消息才会重新回到ready状态被其他消费者消费。
2. ack
确认签收后,消息从队列中删除。
- 自动ack
消费者接收到消息的那一刻就发送ack信息到RabbitMQ的队列,队列将此条消息删除。
自动ack的方式只要队列有消息,RabbitMQ会源源不断的把消息推送给客户端,而不管客户端能否消费的完。 - 手动ack
开发人员决定什么时机进行ack。
如果没有及时进行ack
,RabbitMQ会将来不及做ack的消息标记为unacked
丢回RabbitMQ,被标记为unacked的消息无法被立刻重新消费,而是要等channel重启或者服务器重启才会变成ready
(可消费的消息)。但等待服务器重启这个过程中如果积压了太多unacked消息,会导致MQ响应越来越慢,甚至崩溃的问题。
解决方式就是及时处理消息