如何保证消息队列的消息只能被消费一次

news/2025/3/26 2:27:18/文章来源:https://www.cnblogs.com/MaC-Matthew/p/18792676

如何保证消息队列的消息只能被消费一次,首先先保证消息不会丢失
首先先生产者到消费者到消费者有哪些场景会消息丢失

一、问题场景
场景一、生产者发送到消息队列失败

场景二、消息队列接受到消息磁盘化失败

场景三、消费者接受到消息消费失败

二、场景原因,如何解决
1、场景一失败的原因:可能出现在生产者发送给消息队列消息时可能会出现网络抖动,导致发送失败。也有可能消息队列服务挂掉导致发送失败。

解决方法:可以采用消息重传的方式,先可以采用在内存中重试几次,如果重试次数达到最大重试次数,将该消息放到一张记录表中,延时重发即可。当然这种做法可能会有重复消息,
这里只需要确保消息发送到消息队列即可,如何保证消息发送到消息队列,以rocketMQ为例,确保rocketMQ开启ack确认机制,当rocketMQ接受到消息会返回给生产者一条
ack,当生产者收到了ack才说明此条消息到达了rocketMQ,若没有收到一律按照重传处理

2、场景二失败的原因:会出现这种原因是因为消息队列将消息持久化机制有关。持久化机制有两种,一种是异步刷盘,一种是同步刷盘。
异步刷盘是生产者将消息发送给消息队列,消息队列并不是将消息立即将消息存到磁盘,而是将消息消息存到内存或者操作系统的缓存里,消息累计到一定的数量才会将消息持久化到磁盘上,这时消息在内存到中消息队列就会发送给生产者一条消息确认消息,在单机的状态下,如果消息没有消费消息队列重启或者挂掉会导致消息丢失。在集群的情况下也有可能会出现消息丢失,当主节点收到生产者的消息,在主节点和从节点消息同步时,主节点还没有消息持久化,没有同步给从节点,这个时候主节点挂点,从节点晋升为主节点,这个时候会出现消息丢失
同步刷盘是将消息持久化到磁盘中才会返回给生产者ack。

解决方法:将消息队列消息持久化设置成同步刷盘就可以解决这个问题

3、场景三失败原因:以上两点只需要保证消息不丢失即可。那为什么消费者也会出现消息的丢失呢?有几个原因,第一个原因当消费者还有没有消费完消费者出现了宕机或者异常,提前将进度更新到消息队列中,消息队列就不会重复的消费了。第二个原因生产者生产重复消息到了消费者,消费者无法重复消费消息。

解决方法:

首先消费者先插入一个消费记录表,插入成功就执行业务代码,业务代码程序成功就更新记录表状态,业务代码未执行成功,删除记录表中的数据重新执行,如果是bug可以人工干预一下。如果插入记录表失败,检查记录表的状态。如果说已经完成,直接返回消费成功,如果是未完成,延迟消费即可。
这个时候会有一个问题,如果在执行业务代码时出现了宕机等状况,没有来得及删除删除记录表数据,会出现消息开始 -> 插入状态 ->延迟消费的死循环,这个时候就需要人工干预,或者记录消息消费的消费次数时候还是不是需要再消费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day22_java方法

Java方法 方法重载 package com.xiang.method;public class Demo02 {public static void main(String[] args) {int max = max(20, 100, 10);System.out.println(max);}// 比大小public static int max(int num1,int num2){int result = 0;if (num1 == num2){System.out.printl…

文献阅读《Spectral Networks and Deep Locally Connected Networks on Graphs》

参考博客 第一代图卷积网络:图的频域网络与深度局部连接网络 - 知乎 (zhihu.com) 论文解读一代GCN《Spectral Networks and Locally Connected Networks on Graphs》 - 别关注我了,私信我吧 - 博客园 (cnblogs.com) 论文核心 卷积神经网络得益于所处理的数据具有局部平移不变…

【CodeForces训练记录】Codeforces Round 1013 (Div. 3)

训练情况赛后反思 A题题目读半天,发现日期有前导零,div3还是比较基础一点,但是感觉自己还是不够熟练,D题看出来二分但是调了挺久的 A题 判断取多少个数之后才能构成 20250301,我们维护数字的出现次数,直到所有数字的出现次数全部大于等于 20250301 的出现次数时输出位置即…

字符串问题的江湖奇宝:进制哈希

江湖中,剑客以快制胜,而算法竞赛里,字符串哈希(String Hashing)便是那柄出招如电的快剑。 各种字符串问题纷乱复杂,各种字符串算法招式繁复,需苦练内功心法。但字符串哈希算法却只凭一招:将字符串化作数字,以数论为刃,至简之道斩尽来犯之敌。 但此招并非无懈可击。若…

HW-1

1.选项A是正确的,它表示的是极小项m6的正确形式。极小项m6对应的是变量a=0,b=1,c=1,d=0的情况,因此其表达式应为(\overline{a} \cdot b \cdot c \cdot \overline{d}),即选项A。 其他选项的分析:选项B是一个或项,不符合极小项的定义。 选项C缺少变量a和d,不是一个完整的…

为什么nn.Linear 的weight 是 (out_features, in_features)

在PyTorch的nn.Linear中,权重矩阵的形状为(out_features, in_features)。这是因为线性变换的实现方式为:具体来说:当创建nn.Linear(10, 60)时,in_features=10,out_features=60,因此权重的形状是(60, 10)。 输入张量t的形状为(2, 5, 10),与转置后的权重a.weight.T(形状(…

字符串问题的终极法宝:进制哈希

江湖中,剑客以快制胜,而算法竞赛里,字符串哈希(String Hashing)便是那柄出招如电的快剑。 各种字符串问题纷乱复杂,各种字符串算法招式繁复,需苦练内功心法。但字符串哈希算法却只凭一招:将字符串化作数字,以数论为刃,至简之道斩尽来犯之敌。 但此招并非无懈可击。若…

布局机器人,vivo用三十年技术沉淀回答“时代之问”

科技创新给产业界带来最大的影响就是“跨界焦虑”。不敢错过,这是企业面对风口的普遍心态。生怕一波没跟上,就被时代淘汰了。 但不错过,并不等于抓得住。比如元宇宙概念经历资本狂欢,无数科技巨头卷入,退潮时一地鸡毛。再比如在新能源汽车赛道卷起千亿投资风暴时,也有很多…

石油化工厂区防爆入侵报警系统

石油化工厂区防爆入侵报警系统采用AI智能防爆预警摄像头嵌入AI人体识别深度算法,对人体目标特征的检测分析识别预警。系统设备采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确地对场景中发生的人体入侵行为发出告警信息。通过对实时视频图像进行智能…

矿山皮带运输机安全监测预警系统

智慧矿山皮带运输机安全监测预警系统是基于AI视频监测分析识别的智能皮带管理系统,该系统通过将人工智能识别算法提高实时分析的效率,达到现场快速识别、分析、预警的目的,为矿山皮带运输系统提供可视化的安全生产保障,该系统已经实现了皮带运输机大媒块、传输带异物、传输…