MQ
丢单原因
- 发送端失败未补发 ----发方强制先入库,再发送,再更新状态
- 消费端失败未重试---采用MQ机制
- 应用启动失败,但是MQ消费线程已启动
- 发送方发送成功,但是消费方未能消费到消息
解决方案
发送端失败
简单重试
虽然依然存在丢数据的风险,但是考虑到发送失败的概率极低,因此只需要用最低的成本进行重试即可,对于特定的业务,如果重试依然失败,可以进行报警,人工处理,如果不能容忍任何的数据丢失,请采用第二种方案
重试系统
重试系统设计架构
消费方失败
同上,将消费失败的消息转发到自动重试模块即可。
如果使用的rocketMq,还可以依赖其自动重试机制,
业务系统在消费时,只要抛出Exception子类异常,当前消息都会被重新消费,超过配置的最大重试次数后,消息将进入死信队列,死信队列中消息需要人工触发后才能重新消费,注:死信队列当前只保留7天~