❒ 消息从生产者到消费者流程
✔ publisher -> exchange -> queue -> consumer
❒ 消息丢失的几种可能
✔ 发送阶段丢失。
✔ 在中间件内存中丢失。
✔ 消费阶段丢失。
❒ rabbitMQ提供了publisher confirm机制来避免消息丢失。
✔ 消息未到交换机,返回nack publish-confirm。
✔ 消息未到消息队列,返回nack publish-return。
✔ 消息发送到队列成功,返回ack publish-confirm。
❒ 消息失败之后如何处理呢?
✔ 1. 生产者回调方法中及时重发。
✔ 2. 记录日志。
✔ 3. 保存到数据库然后定时重发,成功发送后即刻删除表中的数据。
❒ MQ默认是内存存储消息,开启持久化功能可以确保缓存在MQ中的消息不丢失。
✔ 持久化交换机。
✔ 持久化队列。
✔ 持久化消息。
❒ rabbitMQ支持消费者确认机制,即:消费者处理消息后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息而SpringAMQP则允许配置三种确认模式:
✔ manual:手动ack,需要在业务代码结束后,调用api发送ack。
✔ auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出常则返回nack。
✔ none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除。
我们可以利用spring的retry机制,在消费者出现异常时利用本地重试,设置重试次数,当次数达到了以后,如果消息依然失败,将消息投递到异常交换机,交由人工处理。