一、缘起
如《消息总线消息必达》所述,MQ消息必达,架构上有两个核心设计点:
(1)消息落地
(2)消息超时、重传、确认
再次回顾消息总线核心架构,它由发送端、服务端、固化存储、接收端四大部分组成。
为保证消息的可达性,超时、重传、确认机制可能导致消息总线、或者业务方收到重复的消息,从而对业务产生影响。
举个栗子:
购买会员卡,上游支付系统负责给用户扣款,下游系统负责给用户发卡,通过MQ异步通知。不管是上半场的ACK丢失,导致MQ收到重复的消息,还是下半场ACK丢失,导致购卡系统收到重复的购卡通知,都可能出现,上游扣了一次钱,下游发了多张卡。
消息总线的幂等性设计至关重要,是本文将要讨论的重点。
二、上半场的幂等性设计
MQ消息发送上半场,即上图中的1-3
1,发送端MQ-client将消息发给服务端MQ-server
2,服务端MQ-server将消息落地
3,服务端MQ-server回ACK给发送端MQ-client
如果3丢失,发送端MQ-client超时后会重发消息,可能导致服务端MQ-server收到重复消息。
此时重发是MQ-client发起的,消息的处理是MQ-server,为了避免步骤2落地重复的消息,对每条消息,MQ系统内部必须生成一个inner-msg-id,作为去重和幂等的依据,这个内部消息ID的特性是(mqserver自动生成无需考虑):
(1)全局唯一
(2)MQ生成,具备业务无关性,对消息发送方和消息接收方屏蔽
有了这个inner-msg-id,就能保证上半场重发,也只有1条消息落到MQ-server的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收到重复的消息。
此时重发是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消息会在队列中导致重复消费(主动调用)
相关推荐
3. 幂等性:通过消息唯一标识(message ID)和消费者处理策略,确保消息在重复发送时不会引起错误。 4. 批量操作:支持批量发送和接收消息,提高系统性能。 5. 多语言支持:提供多种编程语言的客户端库,方便不同...
3. 消息幂等性:设计幂等的事件处理逻辑,防止重复消息导致的问题。 4. 错误处理与重试机制:建立合理的错误处理策略和重试机制,避免因网络或其他原因导致的消息丢失。 总结,SpringCloud Alibaba Data Bus为...
Kafka保证了每个消息只被消费组内的一个消费者消费,实现了消息的幂等性。 7. **offset**:每个消息在分区中都有一个唯一的序列号,称为offset,用于跟踪消费者的读取位置。 **Kafka的特点** 1. **高性能**:...
- **分区(Partition)**:保证消息顺序的关键,每个分区内部的消息是有序的。 - **生产者(Producer)**:负责向Kafka发布消息的应用程序。 - **消费者(Consumer)**:消费主题中的消息,可以是单个应用程序或...
5. 总线等待周期:当设备不能立即响应时插入,保证数据传输正确。 6. 地址信号有效时间:在建立周期和保持周期内有效,确保设备读取地址。 7. 微处理器与微型计算机组成:微处理器包括CPU和控制逻辑,微型计算机还...
- RESTful API设计原则,如何保证服务接口的幂等性。 - 使用OpenFeign进行服务调用,Feign是如何实现声明式调用的。 6. **配置管理** - Spring Cloud Config的工作流程,如何实现配置的动态更新。 - Git仓库或...
计算机基础是专升本考试...20. 总线:连接CPU与外部设备的一组公共线路,系统总线包括地址总线、数据总线和控制总线等。 这些基础知识构成了专升本计算机基础学习的主要内容,对于理解计算机工作原理和操作至关重要。
NServiceBus.Deduplication 模块就是为了解决这一问题,确保每个消息只被处理一次,从而维护系统的幂等性。 NServiceBus 框架的核心是消息驱动的设计,它通过定义消息接口来促进松耦合和事件驱动架构。当启用 ...
3. **幂等性生产者**: 保证即使在并发和网络问题下,一条消息也不会被重复发送。 4. **事务支持**: Kafka支持跨多个分区和主题的ACID事务,确保数据一致性。 5. **Kafka MirrorMaker**: 用于在不同集群间复制数据...
计算机网络的拓扑模型主要有总线型、环形、星形、网状和树形等,每种模型都有其特定的特征和应用场景。例如,总线型网络中所有设备共享一条通信线路,环形网络则通过环状连接实现信息传递,星形网络有一个中心节点...
- **幂等性**:Kafka 0.11.0.0版本后支持幂等性生产者,确保相同的消息只被处理一次。 - ** Exactly-Once语义**:Kafka 2.5版本引入了Exactly-Once Semantics,提供最高级别的数据一致性保障。 5. **Kafka监控与...
6. **Spring Cloud Bus**:它是一个事件、消息总线,可以用于广播配置更改或者同步分布式系统的状态。 7. **Spring Cloud Data Flow**:用于管理和部署数据处理任务,如流处理和批处理,对于金融交易中的实时数据...
2. Kafka的核心组件:Producers(生产者)负责发布消息到主题,Brokers(代理)存储和转发消息,Consumers(消费者)订阅主题并消费消息,Topics(主题)是消息的分类,Partitions(分区)保证消息的有序性和并行...
该算法的应用实例基于CAN总线控制网络进行仿真,结果显示,提出的采样周期优化算法能够有效地实现不同类型数据的实时传输,保证了控制系统的性能,同时也降低了非实时数据的利用率。这一成果对于理解NCS中采样周期的...
1. **幂等性生产者**:此版本引入了幂等性生产者,确保消息在重试时不会被重复写入,解决了消息丢失或重复的问题。 2. **消费者API改进**:消费者API进行了优化,提供了更强大的控制和灵活性,包括自动和手动分区...
3. **小世界效应**:尽管网络规模庞大,但任意两个节点间通常存在较短的平均路径长度,使得信息能在网络中快速传播。 4. **模块化结构**:复杂网络常呈现出模块化,即节点聚集形成具有特定功能的子网络或社区。 5....
绝对编码器的光码盘上刻有许多道线条,每道线条以不同数量的线(2的幂次)表示,形成一个格雷码,保证相邻位置之间的变化只有一位不同,增加了抗干扰能力。 编码器的输出形式多样,包括并行输出、串行输出和总线型...
7. **TCP/IP协议**:IP协议负责数据传输,但不保证数据正确性,这由TCP协议来确保,提供可靠的数据传输。 8. **ASCII码**:标准ASCII码使用7位二进制编码,可表示128个字符,但存储8个ASCII字符需要8个字节,因为...
这种映像的存在保证了数据的物理独立性,即当数据的物理存储改变时,应用程序不受影响。 #### 在Word中切换文档(题目20) - **知识点**:在Word中切换打开的文档。 - **详细解释**:在Microsoft Word中,用户可以...