消息队列 - 关于消息队列的消息丢失问题的一点思考

消息队列 - 关于消息队列的消息丢失问题的一点思考

  

  使用消息中间件必须面对的两大问题 - 消息丢失 和 消息重复。

   消息丢失的解决办法主要是通过消息重发的补偿手段,消息重发后导致消息重复,消息重复需要使用幂等解决。

 

   

 

 

  消息从生产到消费,一般需要通过如图3个阶段。成熟的消息中间件的设计者都会考虑这个问题。rabbitmq在生产阶段,一般会有回调确认机制,存储阶段,会有持久化配置策略,消费阶段会有成功消费后的确认机制。spring 在封装rabbitmq时,默认的配置策略很人性化,存储阶段默认配置成持久化,消费阶段默认没有异常后再向mq确认成功消费。

  问题在于是否在生产消息时要人为保证百分之一百确保消息成功?因为即时使用了回调机制,重试策略,在极端情况下还是会丢失消息的。

  如果要保证百分之一百成功,需要引入数据库,设计上比较复杂, (参考学习资料)

  

 

 

   如果每次使用消息中间件,都保证百分之一百成功,整体系统会越来越复杂。

  因此,在核心重要业务上,如金钱相关的业务,就一定要保证百分之一百,

  在非核心业务上,可以使用简单的重试策略,重试几次,发送数据,防止网络导致的消息丢失。

  重点在于,一定要先保证业务数据(如订单数据)入库成功,再去发送消息到mq供其他消费者消费。

  这样即时发送消息到mq时丢失了,也可以事后查库补发

  如果有错误,欢迎斧正。

 

posted @ 2020-04-04 22:42  timfruit  阅读(1540)  评论(0编辑  收藏  举报