`
y806839048
  • 浏览: 1120380 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

消息总线真的能保证幂等?

阅读更多

一、缘起

如《消息总线消息必达》所述,MQ消息必达,架构上有两个核心设计点:

1)消息落地

2)消息超时、重传、确认

 

再次回顾消息总线核心架构,它由发送端、服务端、固化存储、接收端四大部分组成。

 

为保证消息的可达性,超时、重传、确认机制可能导致消息总线、或者业务方收到重复的消息,从而对业务产生影响。

 

举个栗子:

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

 

消息总线的幂等性设计至关重要,是本文将要讨论的重点。

 

二、上半场的幂等性设计

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

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

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

3,服务端MQ-serverACK给发送端MQ-client

如果3丢失,发送端MQ-client超时后会重发消息,可能导致服务端MQ-server收到重复消息

 

此时重发是MQ-client发起的,消息的处理是MQ-server,为了避免步骤2落地重复的消息,对每条消息,MQ系统内部必须生成一个inner-msg-id,作为去重和幂等的依据,这个内部消息ID的特性是(mqserver自动生成无需考虑):

1)全局唯一

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

 

有了这个inner-msg-id,就能保证上半场重发,也只有1条消息落到MQ-serverDB中,实现上半场幂等。

 

三、下半场的幂等性设计

MQ消息发送下半场,即上图中的4-6

4,服务端MQ-server将消息发给接收端MQ-client

5,接收端MQ-clientACK给服务端

6,服务端MQ-server将落地消息删除

需要强调的是,接收端MQ-clientACK给服务端MQ-server,是消息消费业务方的主动调用行为,不能由MQ-client自动发起,因为MQ系统不知道消费方什么时候真正消费成功。

如果5丢失,服务端MQ-server超时后会重发消息,可能导致MQ-client收到重复的消息

 

此时重发是MQ-server发起的消息的处理是消息消费业务方,消息重发势必导致业务方重复消费(上例中的一次付款,重复发卡),为了保证业务幂等性,业务消息体中,必须有一个biz-id,作为去重和幂等的依据,这个业务ID的特性是:

1)对于同一个业务场景,全局唯一

2)由业务消息发送方生成,业务相关,对MQ透明

3)由业务消息消费方负责判重,以保证幂等

 

最常见的业务ID有:支付ID,订单ID,帖子ID等。

 

具体到支付购卡场景,发送方必须将支付ID放到消息体中,消费方必须对同一个支付ID进行判重,保证购卡的幂等。(数据库主键唯一索引

 

有了这个业务ID,才能够保证下半场消息消费业务方即使收到重复消息,也只有1条消息被消费,保证了幂等。

 

三、总结

MQ为了保证消息必达,消息上下半场均可能发送重复消息,如何保证消息的幂等性呢?

上半场

MQ-client生成inner-msg-id,保证上半场幂等

这个ID全局唯一,业务无关,由MQ保证。

 

下半场

业务发送方带入biz-id,业务接收方去重保证幂等

这个ID对单业务唯一,业务相关,对MQ透明。

 

结论:幂等性,不仅对MQ有要求,对业务上下游也有要求。

 

客户端没有接到服务端ack会重发(自动),服务端没有接受到客户端ack消息会在队列中导致重复消费(主动调用)

 

分享到:
评论

相关推荐

    RabbitMQ实战:高效部署分布式消息队列 带目录书签高清PDF

    3. 幂等性:通过消息唯一标识(message ID)和消费者处理策略,确保消息在重复发送时不会引起错误。 4. 批量操作:支持批量发送和接收消息,提高系统性能。 5. 多语言支持:提供多种编程语言的客户端库,方便不同...

    springCloud_dataservice_bus.zip

    3. 消息幂等性:设计幂等的事件处理逻辑,防止重复消息导致的问题。 4. 错误处理与重试机制:建立合理的错误处理策略和重试机制,避免因网络或其他原因导致的消息丢失。 总结,SpringCloud Alibaba Data Bus为...

    kafka_2.13-3.2.3.tgz

    Kafka保证了每个消息只被消费组内的一个消费者消费,实现了消息的幂等性。 7. **offset**:每个消息在分区中都有一个唯一的序列号,称为offset,用于跟踪消费者的读取位置。 **Kafka的特点** 1. **高性能**:...

    Kafka深度解析PDF 下载

    - **分区(Partition)**:保证消息顺序的关键,每个分区内部的消息是有序的。 - **生产者(Producer)**:负责向Kafka发布消息的应用程序。 - **消费者(Consumer)**:消费主题中的消息,可以是单个应用程序或...

    大学计算机硬件复习题

    5. 总线等待周期:当设备不能立即响应时插入,保证数据传输正确。 6. 地址信号有效时间:在建立周期和保持周期内有效,确保设备读取地址。 7. 微处理器与微型计算机组成:微处理器包括CPU和控制逻辑,微型计算机还...

    springcloud微服务面试题.zip

    - RESTful API设计原则,如何保证服务接口的幂等性。 - 使用OpenFeign进行服务调用,Feign是如何实现声明式调用的。 6. **配置管理** - Spring Cloud Config的工作流程,如何实现配置的动态更新。 - Git仓库或...

    专升本计算机基础笔记(珍藏版).pdf

    计算机基础是专升本考试...20. 总线:连接CPU与外部设备的一组公共线路,系统总线包括地址总线、数据总线和控制总线等。 这些基础知识构成了专升本计算机基础学习的主要内容,对于理解计算机工作原理和操作至关重要。

    NServiceBus.Deduplication

    NServiceBus.Deduplication 模块就是为了解决这一问题,确保每个消息只被处理一次,从而维护系统的幂等性。 NServiceBus 框架的核心是消息驱动的设计,它通过定义消息接口来促进松耦合和事件驱动架构。当启用 ...

    Kafka知识点(基础+进阶+高阶)

    3. **幂等性生产者**: 保证即使在并发和网络问题下,一条消息也不会被重复发送。 4. **事务支持**: Kafka支持跨多个分区和主题的ACID事务,确保数据一致性。 5. **Kafka MirrorMaker**: 用于在不同集群间复制数据...

    基于复杂网络理论的计算机网络拓扑研究 (8).pdf

    计算机网络的拓扑模型主要有总线型、环形、星形、网状和树形等,每种模型都有其特定的特征和应用场景。例如,总线型网络中所有设备共享一条通信线路,环形网络则通过环状连接实现信息传递,星形网络有一个中心节点...

    kafka-app

    - **幂等性**:Kafka 0.11.0.0版本后支持幂等性生产者,确保相同的消息只被处理一次。 - ** Exactly-Once语义**:Kafka 2.5版本引入了Exactly-Once Semantics,提供最高级别的数据一致性保障。 5. **Kafka监控与...

    分布式金融交易模型Spring Cloud

    6. **Spring Cloud Bus**:它是一个事件、消息总线,可以用于广播配置更改或者同步分布式系统的状态。 7. **Spring Cloud Data Flow**:用于管理和部署数据处理任务,如流处理和批处理,对于金融交易中的实时数据...

    java-microservices-kafka

    2. Kafka的核心组件:Producers(生产者)负责发布消息到主题,Brokers(代理)存储和转发消息,Consumers(消费者)订阅主题并消费消息,Topics(主题)是消息的分类,Partitions(分区)保证消息的有序性和并行...

    多回路网络化控制系统中采样周期的优化算法研究.doc

    该算法的应用实例基于CAN总线控制网络进行仿真,结果显示,提出的采样周期优化算法能够有效地实现不同类型数据的实时传输,保证了控制系统的性能,同时也降低了非实时数据的利用率。这一成果对于理解NCS中采样周期的...

    卡夫卡0.10.1

    1. **幂等性生产者**:此版本引入了幂等性生产者,确保消息在重试时不会被重复写入,解决了消息丢失或重复的问题。 2. **消费者API改进**:消费者API进行了优化,提供了更强大的控制和灵活性,包括自动和手动分区...

    探究基于复杂网络理论的计算机网络拓扑研究.pdf

    3. **小世界效应**:尽管网络规模庞大,但任意两个节点间通常存在较短的平均路径长度,使得信息能在网络中快速传播。 4. **模块化结构**:复杂网络常呈现出模块化,即节点聚集形成具有特定功能的子网络或社区。 5....

    编码器______工作原理

    绝对编码器的光码盘上刻有许多道线条,每道线条以不同数量的线(2的幂次)表示,形成一个格雷码,保证相邻位置之间的变化只有一位不同,增加了抗干扰能力。 编码器的输出形式多样,包括并行输出、串行输出和总线型...

    2016年江苏专转本计算机真题与答案全解.doc

    7. **TCP/IP协议**:IP协议负责数据传输,但不保证数据正确性,这由TCP协议来确保,提供可靠的数据传输。 8. **ASCII码**:标准ASCII码使用7位二进制编码,可表示128个字符,但存储8个ASCII字符需要8个字节,因为...

    2021-2022计算机二级等级考试试题及答案No.17295.docx

    这种映像的存在保证了数据的物理独立性,即当数据的物理存储改变时,应用程序不受影响。 #### 在Word中切换文档(题目20) - **知识点**:在Word中切换打开的文档。 - **详细解释**:在Microsoft Word中,用户可以...

Global site tag (gtag.js) - Google Analytics