MQ解决消息重发--做到幂等性

一、MQ消息发送

        

  1、发送端MQ-client(消息生产者:Producer)将消息发送给MQ-server;

  2、MQ-server将消息落地;

  3、MQ-server回ACK给MQ-client(Producer);

  4、MQ-server将消息发送给消息接受端MQ-client(消息消费者:Customer);

  5、MQ-client(Customer)消费接受到消息后发送ACK给MQ-server;

  6、MQ-server将落地消息删除

二、消息重复发送原因

  为了保证消息必达,MQ使用了消息超时、重传、确认机制。使得消息可能被重复发送,如上图中,由于网络不可达原因:3和5中断,可能导致消息重发。消息生产者a收不到MQ-server的ACK,重复向MQ-server发送消息。MQ-server收不到消息消费者b的ACK,重复向消息消费者b发消息。

三、消息重复发送产生的后果

  举个例子:购买会员卡,上游支付系统负责给用户扣款,下游系统负责给用户发卡,通过MQ异步通知。不管是上半场的ACK丢失,导致MQ收到重复的消息,还是下半场ACK丢失,导致购卡系统收到重复的购卡通知,都可能出现,上游扣了一次钱,下游发了多张卡。

四、MQ内部如何做到幂等性的

  对于每条消息,MQ内部生成一个全局唯一、与业务无关的消息ID:inner-msg-id。当MQ-server接收到消息时,先根据inner-msg-id判断消息是否重复发送,再决定是否将消息落地到DB中。这样,有了这个inner-msg-id作为去重的依据就能保证一条消息只能一次落地到DB。

五、消息消费者应当如何做到幂等性

  1、对于非幂等性业务且要求实现幂等性业务:生成一个唯一ID标记每一条消息,将消息处理成功和去重日志通过事物的形式写入去重表。

  2、对于非幂等性业务可不实现幂等性的业务:权衡去重所花的代价决定是否需要实现幂等性,如:购物会员卡成功,向用户发送通知短信,发送一次或者多次影响不大。不做幂等性可以省掉写去重日志的操作。

原文地址:https://www.cnblogs.com/shoshana-kong/p/10915039.html

时间: 2024-10-27 01:12:46

MQ解决消息重发--做到幂等性的相关文章

MQ如何解决消息的顺序问题和消息的重复问题?

一.摘要 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 1.消息的顺序问题 2.消息的重复问题 二.关键特性以及其实现原理 2.1.顺序消息 要实现严格的顺序消息,简单且可行的办法就是: 保证生产者 - MQServer - 消费者是一对一对一的关系 这样的设计虽然简单易行,但也会存在一些很严重的问题,比如: 1.并行度就会成为消息系统的瓶颈(吞吐量不够) 2.更多的异常处理,比如:只要消费端出现问题,就会

RocketMQ(消息重发、重复消费、事务、消息模式)

RocketMQ基础:https://github.com/apache/rocketmq/tree/rocketmq-all-4.5.1/docs/cn 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现原理 一.

ActiveMQ Topic消息重发

MQ学习系列: 消息队列概念与认知 ActiveMQ Topic消息重发 ActiveMQ Topic 消息重发 准备工作 windows下ActiveMQ的下载与启动 百度的教程:链接 ←这里包含基本的下载安装启动以及简单的配置账号 登录控制台主页:http://localhost:8161/admin/ 启动错误以及解决方案 activeMQ启动错误 BeanFactory not initialized https://blog.csdn.net/huang_sheng0527/artic

架构设计:系统间通信(20)——MQ:消息协议(下)

(接上文<架构设计:系统间通信(19)--MQ:消息协议(上)>) 上篇文章中我们重点讨论了"协议"的重要性,并为各位读者介绍了Stomp协议和XMPP协议.这两种协议是消息队列中两种不同使用场景下的典型代表.本文主要接续上文的篇幅,继续讨论消息队列中另一种典型协议:AMQP协议. 3-3.AMQP协议 AMQP协议的全称是:Advanced Message Queuing Protocol(高级消息队列协议).目前AMQP协议的版本为 Version 1.0,这个协议标准

MQ中将消息发送至远程队列的配置

MQ中将消息发送至远程队列的配置 摘自MQ资源管理器帮助文档V7 在开始学习本教程之前,您需要从系统管理员处了解标识网络上接收机器的名称:IP地址.MQ的端口号.队列管理器.接收(远程机器)或者是发送的队列(本地机器)名称. 消息传递如图示: 本教程介绍了如何设置一台计算机上的队列管理器 QM_ORANGE 与另一台计算机上的队列管理器 QM_APPLE 之间的消息传递.在第一台计算机上创建的消息被传递到第二台计算机上的队列 Q1(此队列被称为远程队列). 要点: 在本教程中,您将使用创建了队列

MQ(队列消息的入门)

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下拓展进程间的通信,对于消息中间件,常见的角色大致也就有Producer(生产者).Consumer(消费者) MQ     消息中间件     消息队列 Message Queue简称MQ 种类: 1.Apache  ActiveMQ   ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.

mq解决分布式事物问题

今天只看看原理,下一节看项目怎么集成mq进行解决分布式事物. 1.什么情况下会使用到分布式事物? 举例说明:现有一个支付系统,因为项目使用的是微服务框架,有订单模块和支付模块两个模块.生产者进行订单的下单操作购买100元,这时候订单表数据应该是新增一条,然后支付模块的个人账户资金应该是加100元.同一个方法中既需要对订单数据库进行新增又需要调用支付模块对数据进行修改(不同项目不同数据库),这时候就会用到分布式事物,只是举个典型的例子. 那么问题来了,生产者进行订单的下单操作怎么保证订单和支付的数

通过JAVA从MQ读取消息的时候报错及解决

如果是通过JAVA将消息写入到MQ,再通过JAVA去读取消息,采用MQMessage读消息的方法readUTF()去读取的时候,就不会报错,可以正常读出来.如果采用在MQ资源管理器中插入测试消息或者是通过另外一台MQ服务器往当前MQ服务器通过远程队例写消息过来,通过JAVA读取出会错,我这里疑点有两个: 1.通过MQ资源管理器放入的消息的编码是什么?是否在读消息的时候需要指定读消息的编码?我通过JAVA进入的编码为1381,读的时候也是1381 2.我现在JAVA这边的MQ LIB是从WEBSP

架构设计:系统间通信(19)——MQ:消息协议(上)

1.概述 从本文开始,我们介绍另一类型的系统间通讯及输:MQ消息队列.首先我们将讨论几种常用消息队列协议的基本原理和工作方式,包括MQTT.XMPP.Stomp.AMQP.OpenWire等.然后在这个基础上介绍两款MQ产品:ActiveMQ和RabbitMQ,它们是现在业务系统中应用广泛的消息队列软件.包括他们的安装.运行.支持协议.集群化和调用方式. 当然,在这个过程中我们还会提到其他的消息队列协议(或者实现),例如微软JBossMQ.MSMQ.商业化产品WebSphere MQ.Oracl