消息幂等性处理|学习笔记

简介: 快速学习消息幂等性处理

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息幂等性处理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12457


消息幂等性处理


消息的幂等性指的是在消息的消费方对于同一条消息不论消费多少次结果都是一样的。这就是消息消费的幂等性。

其中有一个关键的点:消费方接收了很多次相同的消息这时候才有必要保证幂等性。

重复的消息是如何产生的?

一般来说有以下三种情况会产生重复的消息:

1、发送的时候发送重复的消息

如果生产者在给服务端发送消息的时候,服务端MQ接收到消息之后会给生产者做出响应。如果这时由于网络的闪断或者客户端突然宕机,就不会收到服务端对客户端的应答。这时生产者就会认为消息没有发送成功,就会再次发送这个消息。这样就会产生重复的消息。

2、消息投递时的重复

消息投递的时候对于rocketMQ来说主要指的是消费方在消费了这个消息之后由于网络的闪断或者自身的问题导致没有给rocketMQ做出正确的响应。这时rocketMQ就会尝试投递之前已经被处理过的消息,这时消费者就会收到两条内容相同的消息。因此在消息投递的时候也可能会出现消息的重复。

3、在负载均衡时消息的消费方是负载均衡,那么负载均衡的特点是不同的消费者消费不同的消息。如果这时消费者组当中的某一个消费的实例发生了变化。例如:突然间宕机,这种情况下都会触发组内所有实例的负载均衡。这时就会出现不同的消费者消费了相同的消息。

那么以上三种情况能否避免?

网络原因是不能避免的,还有一些意外的其他情况,包括消费者突发宕机,之后又自己重新启动了。这时是避免不了一些意外的情况的。

能够解决的是如果出现了消息的重复怎样保证幂等性。如果出现了消息的重复,需要保证消费一次或者多次,结果是一样的。

第一种手段:用消息ID去保证,因为之前说重复消息,那么消息的ID是一样的。但是这个地方需要慎重。因为rocketMQ不保证消息ID的唯一性。意思就是有可能不同的消息,但是消息ID是一样的。

那么用消息ID来保证幂等性可能会屏蔽其他的消息。所以消息ID不是很好的办法。

最好使用业务标识处理,在发送消息的时候给消息中设置一个业务KEY,这个消息在被投递到消费方的时候,消费方在拿到这个消息之后,通过业务KEY去判断消息有没有被处理。

Message message = new Message.

message.setKey("ORDERID_100");

SendResult sendResult

= producer. send (message) ;

如何判断?怎么知道消费了哪些?

可以在消费方把自己所消费过的消息去存起来。存起来时候在每一接收新信息的时候在处理之前,先从数据库中判断一下消息有没有包含业务KEY。如果包含了,直接舍弃即可。需要在消费方将消息进行存储。将处理过的消息存起来,这样的话就可以明确哪些消息处理过,哪些消息没有处理过。

小结:

消息的幂等性的意思。消息的幂等性指的是对于消费方来讲,接收到多个消息去消费的时候,消费一次和消费多次的结果是一样的。

这时分析了为什么会出现重复的消息。有三种情况会出现重复的消息:消息发送的时候由于网络的闪断或者是客户端发送者的宕机,没有及时的收到rocket响应的信息。这时就会再发一条信息出去。

投递的时候也会出现消费方如果出现了网络的异常,对于客户端来说没有及时收到消费方的应答也会出现重复的投递。

负载均衡也会出现重复的消息。如果出现了消费者组中的当前实例的变化,都会重新造成负载均衡的重来。这时就会造成不同的消费者对

一个消息消费了很多次。以上是消息重复的原因。

消息重复的情况是不可避免的,所以需要考虑的是在有重复消息的情况下怎么保证幂等性。

保证幂等性有一个关键就是在发送消息的时候会携带一个业务key,在接受到一个消息后先获得业务key,在本地消费方的数据库中判断业务key所对应的消息有没有消费过。如果没有消费过,那么就正常消费。消费完之后给数据库中存一下。如果已经消费过则直接舍弃即可。

以上是关于幂等性的内容。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
SQL 分布式计算 Hadoop
干翻Hadoop系列文章【02】:Hadoop、Hive、Spark的区别和联系
干翻Hadoop系列文章【02】:Hadoop、Hive、Spark的区别和联系
|
虚拟化
故障案例-ESXI6.7 EP13 紫屏分析
一台ESXI6.7 EP13 紫屏分析过程
2797 0
|
人工智能 自然语言处理 机器人
对话阿里云 CIO 蒋林泉:AI 时代,企业如何做好智能化系统建设?
10 月 18 日, InfoQ《C 位面对面》栏目邀请到阿里云 CIO 及 aliyun.com 负责人蒋林泉(花名:雁杨),就 AI 时代企业 CIO 的角色转变、企业智能化转型路径、AI 落地实践与人才培养等主题展开了讨论。
24169 69
对话阿里云 CIO 蒋林泉:AI 时代,企业如何做好智能化系统建设?
|
4月前
|
人工智能 运维 监控
智能运维与数据治理:基于 Apache Doris 的 Data Agent 解决方案
本文基于 Apache Doris 数据运维治理 Agent 展开讨论,如何让 AI 成为 Doris 数据运维工程师和数据治理专家的智能助手,并在某些场景下实现对人工操作的全面替代。这种变革不仅仅是技术层面的进步,更是数据运维治理思维方式的根本性转变:从“被动响应”到“主动预防”,从“人工判断”到“智能决策”,从“孤立处理”到“协同治理”。
747 11
智能运维与数据治理:基于 Apache Doris 的 Data Agent 解决方案
|
3月前
|
人工智能 运维 API
高级RAG优化手册:3招解决检索不准和查询模糊
本文深入解析RAG(检索增强生成)技术的核心优化方法,涵盖背景、架构与实践。RAG通过整合外部知识库,弥补大语言模型在实时性、准确性和专业性上的不足,广泛应用于企业场景。文章系统讲解RAG如何解决知识静态、生成幻觉与专业深度不足等问题,并剖析其离线索引与在线生成的闭环流程。此外,还介绍了高级优化策略,如查询重写、混合检索与结果重排序,助力突破RAG应用瓶颈。
685 1
|
11月前
|
前端开发 安全 UED
React 文件预览组件:File Preview
在现代Web应用中,文件上传和预览功能至关重要。本文基于React库,详细介绍如何构建文件预览组件,涵盖文件选择器、图片预览、文件大小限制及多种文件类型支持。通过实际代码示例,解析常见问题如跨域请求、文件路径处理和状态管理,并提供解决方案。帮助开发者提升用户体验,减少误操作。
802 2
|
SQL 运维 安全
【产品升级】Dataphin V4.2重大升级:上线敏捷版,打通数据资产管理和消费,开启数据价值放大新篇章
Dataphin 是阿里巴巴旗下的一个智能数据建设与治理平台,旨在帮助企业构建高效、可靠、安全的数据资产。在V4.2版本中,Dataphin敏捷版上线助力企业打造轻量版数据中台,打通数据资产管理和消费,陪伴企业迈入数据高价值应用新阶段。
2951 2
【产品升级】Dataphin V4.2重大升级:上线敏捷版,打通数据资产管理和消费,开启数据价值放大新篇章
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
1149 2
|
Kubernetes Linux 虚拟化
一文详解容器技术简介和基本原理
本文全面阐述了容器技术的发展历程、关键技术、架构和当前的行业生态,特别是容器技术在云环境中的应用和演进。
7332 9