简介
开发中会经常使用都消息中间件来进行消息同步操作。但往往会因为各种原因导致消息在投递至消息代理服务器的过程出现意外。确保消息同步的高可靠,至少需要做到两点:
同步失败记录:确保清楚哪些消息同步失败;
再次投递消息:确保在失败后,会自动尝试重新发送消息,排除因网络原因导致消息投递失败。
处理方案
- 由sendUtils投递消息到消息代理服务器MQ Broker时,会同时保存一未接收状态status=0到数据库中
- 当消息成功投递到Broker时,Broker会返回一个确认信息到生产者的回调监听器中Confirm Listener
- 当Confirm Listener中接收到确认消息,同时更新数据库中对应消息的接收状态status=1
- 额外有个定时器Timer,定时对数据库中消息状态为未接收的消息 进行第二次投递
- 当多次投递数count > 3时,将状态更新为status=2并不再继续投递
关键配置(RabbitMQ示例)
# 确认消息发送成功,通过实现ConfirmCallBack接口,消息发送到交换器Exchange后触发回调
spring.rabbitmq.publisher-confirms=true
# 实现ReturnCallback接口,如果消息从交换器发送到对应队列失败时触发
# (比如根据发送消息时指定的routingKey找不到队列时会触发)
spring.rabbitmq.publisher-returns=true