消息丢失问题
消息确认机制
生产者与MQ之间的消息确认:
当MQ成功接收消息后,会返回给生产者一个确认消息。如果在规定时间内生产者未收到确认消息,则任务消息发送失败。
MQ与消费者之间的消息确认:
当MQ成功接收消息后,会返回给MQ一个确认消息,MQ此时会将对应消息删除。如果在规定时间内MQ未收到确认消息,则任务消息发送失败。
补发机制
当确认消息丢失后,可通过补发机制重发消息:
通过回调方法即时完成重发。
将发送的消息记录于日志文件当中。然后进行重发。
持久化
MQ通过内存存储消息,如果系统突然断电会导致消息丢失。因此可使用持久化方法(交换机持久化、队列持久化、消息持久化):
重复消费问题
出现原因举例:在保证MQ消息不重复的情况下,消费者消费消息成功后,在给MQ发送消息确认的时候出现了网络异常(或者是服务中断),MQ没有接收到确认,此时MQ会补发一条消息,从而导致重复消费。
解决方法:
-
每条消息设置唯一id。消费者接收到消息时会校验id是否存在(是否已在数据库中),如果存在则不处理该条消息。
-
幂等方案。
死信交换机
死信交换机的定义:
- 消息被消费者拒绝
- 消息超过生存时间TTL:这个方法可实现超时队列。如订单支付,给订单消息创建TTL,如果超时,订单消息变为死信,订单失效。
3.队列满了,则处于对头的消息也可能成为死信。
消息堆积问题
问题描述:
解决方法:
扩大队列容积的办法------惰性队列(将队列中的消息存入磁盘而非内存):