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

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 快速学习消息幂等性处理

开发者学堂课程【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的区别和联系
|
分布式计算 Java 大数据
大数据常用调度平台
大数据常用调度平台
546 0
|
虚拟化
故障案例-ESXI6.7 EP13 紫屏分析
一台ESXI6.7 EP13 紫屏分析过程
2738 0
|
11月前
|
缓存 安全 网络协议
HTTPS协议的历史发展
HTTPS协议的历史发展
425 8
|
11月前
|
存储 负载均衡 算法
Hash介绍与应用详解
哈希算法在计算机科学中有着广泛而重要的应用,从数据存储、数据完整性校验到密码安全和分布式系统中的负载均衡,哈希函数都发挥着关键作用。通过本文的介绍和示例代码,希望您能更好地理解哈希的基本概念和实际应用,并在您的项目中有效地应用这些知识。
1861 3
|
SQL 存储 数据可视化
手机短信SQL分析技巧与方法
在手机短信应用中,SQL分析扮演着至关重要的角色
|
SQL 运维 安全
【产品升级】Dataphin V4.2重大升级:上线敏捷版,打通数据资产管理和消费,开启数据价值放大新篇章
Dataphin 是阿里巴巴旗下的一个智能数据建设与治理平台,旨在帮助企业构建高效、可靠、安全的数据资产。在V4.2版本中,Dataphin敏捷版上线助力企业打造轻量版数据中台,打通数据资产管理和消费,陪伴企业迈入数据高价值应用新阶段。
2827 2
【产品升级】Dataphin V4.2重大升级:上线敏捷版,打通数据资产管理和消费,开启数据价值放大新篇章
|
SQL 数据采集 JSON
弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
126020 137
|
Kubernetes Linux 虚拟化
一文详解容器技术简介和基本原理
本文全面阐述了容器技术的发展历程、关键技术、架构和当前的行业生态,特别是容器技术在云环境中的应用和演进。
|
缓存 前端开发 JavaScript
JavaScript进阶 - Web Workers与Service Worker
【7月更文挑战第10天】在Web开发中,Web Workers和Service Worker提升性能。Workers运行后台任务,防止界面冻结。Web Workers处理计算密集型任务,Service Worker则缓存资源实现离线支持。常见问题包括通信故障、资源限制、注册错误及缓存更新。通过示例代码展示了两者用法,并强调生命周期管理和错误处理的重要性。善用这些技术,可构建高性能的Web应用。
318 0