MQ保证消息幂等机制

简介: MQ保证消息幂等机制

1. MQ 核心架构


MQ核心架构,它是由发送端、服务端、固话存储、接收端四大部分组成。


2. MQ如何保证消息必达?

  1. 消息落地
  2. 超时,重传,确认

mq为保证消息的可达性,超时,重传,确认机制可能导致MQ,或者业务方收到重复的消息,从而对业务产生消息。怎么解决慢慢往下看。


3. MQ 如何做到,消息幂等?

什么是幂等性?

使用同样的条件,一次请求和重复多次请求对系统资源的影响是一致的。


MQ消息发送上半场,即上图中的1-3:

(1)发送端MQ-client将消息发送给服务端MQ-server

 (2)   服务端MQ-server将消息落地

(3)服务端MQ-server回ACK响应给发送端MQ-client

如果图上3丢失,发送端MQ-client超时后会重发消息,可能会导致MQ-server收到重复的消息。为了避免步骤2落地重复消息,对每条消息,MQ系统内部必须生成一个inner-msg-id,作为去重和幂等的依据,inner-msg-id的特性是:

(1)全局唯一

(2)MQ生成,具备业务无关性,对消息发送方和消息接收方屏蔽

(3)重复的消息为一样的inner-msg-id

(4)能保证上半场重发,也只有1条消息落到MQ-sercer的DB中,实现上半场幂等

MQ消息接收下半场,如何保证幂等性,即图中的4-6:

(4)MQ-server将消息发给接收端MQ-client

 (5)  MQ-client回ACK给服务端

 (6)  MQ-server将落地消息删除

需要注意的是:MQ-client回ACK给MQ-server,是消息消费业务方的主动调用行为,不能由MQ-client自动发起,因为MQ系统不知道消费方什么时候真正消费成功。

如果5丢失,MQ-server超时后会重发消息,可能会导致MQ-client收到重复消息。这样势必导致业务方重复消费。为了保证业务幂等性,业务消息中,必须有一个unique-biz-id,作为去重和幂等的依据。这个业务ID特性是:

(1)对于同一个业务数据,全局唯一

(2)由业务消息发送方生成,业务相关

(3)由业务消息消费方负责判断是否重复,以保证幂等

(4)业务ID可以是:贴子ID,订单ID等

(5)保证了下半场消息消费业务方即使收到重复消息,也只有1条消息被消息,保证了幂等。

综上:

上半场幂等的关键:MQ-client生成inner-msg-id,核心是消息去重

下半场幂等的关键:业务方带入unique-biz-id,业务方通过全局唯一的业务 id 去自行保证

业务幂等性,需要 MQ 和消息接收方配合完成!

4. 有人会问: 开发中我们只需要关心unique-biz-id就行了么?

答:如果MQ实现了相关重试功能等,那么“YES”

5.相关知识

Pub-Sub 消息传递的工作流程


在 Apache Kafka 中,Pub-Sub 消息传递的逐步工作流程是:

(1)Kafka 生产者将消息发送到主题。
(2)Kafka Brokers 将所有消息存储在为该特定主题配置的分区中,确保分区之间消息的平等分布。例如,如果生产者发送两条消息并且有两个分区,Kafka 将在第一个分区中存储一条消息,在第二个分区中存储第二条消息。此外,  Kafka Consumer 订阅特定主题。
(3)一旦消费者订阅了一个主题,Kafka 就会将该主题的当前偏移量提供给消费者,并将该偏移量保存在 Zookeeper ensemble 中。此外,消费者将定期向 Kafka 请求新消息(如 100 毫秒)。或者 kafka push 新消息
(4) Kafka 将在收到来自生产者的消息后立即将消息push给消费者。
(5)消费者将收到消息并进行处理。
(6)然后 Kafka 代理收到已处理消息的确认。
(7)此外,一旦 Kafka 收到确认,偏移量就会更改并更新为新值。即使在服务器异常期间,消费者也可以正确读取下一条消息,因为 ZooKeeper 会维护偏移量。
(8)但是,直到消费者停止请求,流程才会重复。
(9)作为一个好处,消费者可以在任何时候回退/跳过主题的任何偏移量,并且还可以读取所有后续消息,作为一个标准的愿望。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
消息中间件 存储 监控
|
消息中间件 存储 负载均衡
一文读懂RocketMQ的高可用机制——消息发送高可用
一文读懂RocketMQ的高可用机制——消息发送高可用
306 1
|
5月前
|
消息中间件 存储 运维
|
5月前
|
消息中间件 负载均衡 Java
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息消费长轮训机制体系的原理分析
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息消费长轮训机制体系的原理分析
84 0
|
3月前
|
消息中间件 JavaScript RocketMQ
消息队列 MQ使用问题之过期删除机制的触发条件是什么
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ使用问题之过期删除机制的触发条件是什么
|
5月前
|
消息中间件 存储 安全
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息顺序消费和并发消费机制体系的原理分析
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息顺序消费和并发消费机制体系的原理分析
78 0
|
2月前
|
消息中间件 RocketMQ
RocketMQ - 消费者进度保存机制
RocketMQ - 消费者进度保存机制
49 0
|
2月前
|
消息中间件 RocketMQ
RocketMQ - 消费者Rebalance机制
RocketMQ - 消费者Rebalance机制
45 0
|
2月前
|
消息中间件 存储 缓存
RocketMQ - 消费者启动机制
RocketMQ - 消费者启动机制
35 0
|
4月前
|
消息中间件 Apache RocketMQ
消息队列 MQ产品使用合集之是否提供机制检测消费的状态
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。

热门文章

最新文章

下一篇
无影云桌面