zoukankan      html  css  js  c++  java
  • 消息队列

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

      

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

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

       

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

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

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

      

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

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

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

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

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

      如果有错误,欢迎斧正。

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    Google Code 项目代码托管网站上 Git 版本控制系统使用简明教程
    C/C++预定义宏
    使用 Raspberry Pi 远程桌面
    Vim 中将 tab 自动转换成空格
    DR模式搭建LVS负载均衡
    NAT模式LVS搭建负载均衡集群
    php扩展memached安装
    raw_input与input的区别
    keepalived+lvs搭建高可用负载均衡集群
    使用keepalived搭建nginx高可用
  • 原文地址:https://www.cnblogs.com/timfruit/p/12634579.html
Copyright © 2011-2022 走看看