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