Kafka、RocketMQ、RabbitMQ消息丢失可能存在的地方,以及解决方案

这里主要对比:Kafka、RocketMQ、RabbitMQ
介绍一下消息生产、存储、消费三者的架构形式。
在这里插入图片描述

消息丢失可能存在的场景:

情况一: 生产者发送给MQ的过程消息丢失

在写消息的过程中因为网络的原因,还没到mq消息就丢失了;或者是到了mq,还没返回确认收到消息,消息丢失了,怎么处理?

情况二: Broker存储消息丢失

mq的master节点在接受到消息后,还没来得及同步给slave上面的follower副本,master节点直接宕机了,消息还在内存中,丢失消息了,怎么处理?

情况三: 消费者拉取消息后,消息丢

消费者拉取到了消息,但是还没来得及消费,消费者实例挂掉了,mq以为这条消息已经消费了,怎么处理?

针对“情况一”的解决思路:

方法1:

AMQP很多都支持事务机制,那是不是说我们可以生产者采用同步模式给mq发送消息的过程,打开事务机制,发送一条,mq接受到后返回确认信息后再发送下一条消息?这样肯定行不通的,会使生产者的吞吐量直线下降。

方法2:

对于 RabbitMQ:
它提供了一个异步confirm机制,发完了生产者就不用管了,rabbitmq接收到消息会回调生产者的本地一个接口告诉你消息接收成功了,如果rabbitmq在接收消息是报错了,就会回调这个接口,告诉你这个消息接收失败了,可以重试发送了,不会阻塞下一条消息的发送。

对于RocketMQ:它提供了一个异步接收模式, Async
API,Producer只需要把消息发送给mq就可以。mq处理完成之后,调用producer定义好的回调函数,就可以确认是否收到对应messageID的回调确认消息,没有收到就触发retry机制。
对于Kafka:它也提供了异步(async)处理模式,send()方法会返回Futrue对象,通过调用Futrue对象的get()方法,等待直到结果返回。

针对“情况二”MQ把消息弄丢了的解决思路:

1、必须开启持久化,就是消息写入mq后就会刷盘,就算mq自己挂掉了,恢复之后也会读取存储的数据,一般不会丢失,除非还没来得及持久化就挂掉了,这种情况很少,概率极低。
2、配合producer的confirm机制,只有消息被持久化或者大多数副本同步完成后,才返回ack;
3、kafka消费者丢失消息,跟rabbitmq处理机制是一样的,如:kafka
broker自己把消息给丢失了,生产者将消息发送给partion
leader,但是接收完,leader就宕机了,还没同步给follower,而马上另外的partion
follower被选举成了leader,这一块数据丢失了,怎么处理?必须将kafka的副本参数设置大于1,就是说至少有2个副本;kafka还需要设置副本leader至少感知不到一个follower挂掉了,才算leader挂掉了,才能重新选举;broker副本的follower全部同步成功时,才能算生产者写入消息队列写入成功【这样可以保证一条不丢】。

针对“情况三”消费者拉取消息后,消息丢失的解决思路:

1、消费者丢失消息:一般是消费者打开了autoAck的机制,自动提交,但还在处理中,消费者系统宕机了,mq以为消费完了,造成了消费者丢失消息,怎么处理?
解决办法:关闭autoAck,每次处理完了再提交ack/offset,如果还没处理完就宕机了,长时间收不到ack,mq也会重新将这条消息分配给其他的消费者去处理。但是此时你需要自己保证消息的幂等性,因为如果消费者将消息已经消费了,但是返回给mq的确认信息失败了,mq以为你没消费,它会把消息发送给给另外的消费者,或者等该实例恢复后再次发送,引起消息的重复消费,此时,你可以将messageID做唯一键处理。

如果保证消息一条不丢,必须关闭消息过期清理的机制,否则消息积压会触发消息清理的机制,也会造成消息丢失。

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

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

相关文章

【AI故事】灵感的源泉还是知识的盗窃?

灵感的源泉还是知识的盗窃? ——ChatGPT Robot在一个漆黑的夜晚,年轻的作家艾米丽坐在书桌前,手里紧握着一支笔,思绪万千。她一直在寻找创作的灵感,但却毫无头绪。 突然,她听到了一声巨响,仿佛…

C# 初识System.IO.Pipelines

写在前面 在进一步了解Socket粘包分包的过程中,了解到了.NET 中的 System.IO.Pipelines,可以更优雅高效的解决这个问题;先跟随官方的示例做个初步的认识。 System.IO.Pipelines 是一个库,旨在使在 .NET 中执行高性能 I/O 更加容…

DeskPins | 将窗口钉在面前

前言 DeskPins | 将窗口钉在面前 有的人,一边看番,一边却在刷题; 有的人,一边网课,一边却在摸鱼。 有的人,一边某xuexi通上考试,一边。。 众所周知,窗口置顶是很常见的一个需求&…

智慧零售技术探秘:关键技术与开源资源,助力智能化零售革新

智慧零售是一种基于先进技术的零售业态,通过整合物联网、大数据分析、人工智能等技术,实现零售过程的智能化管理并提升消费者体验。 实现智慧零售的关键技术包括商品的自动识别与分类、商品的自动结算等等。 为了实现商品的自动识别与分类,…

vue3+ts 代理的使用

简单封装request.ts import axios from "axios";// 1.创建axios对象 const serviceaxios.create();// 2.请求拦截器 service.interceptors.request.use(config>{return config; },error>{Promise.reject(error); })// 3.响应拦截器 service.interceptors…

走进数字金融峰会,为金融科技数字化赋能

12月20—21日,FSIDigital数字金融峰会在上海圆满召开。本次峰会包含InsurDigital数字保险峰会和B&SDigital数字银行与证券峰会2场平行峰会;吸引了近600位来自保险、银行、证券以及金融科技等行业的领导者和专家齐聚一堂,共同探讨金融业数…

docker 私有仓库

Docker 私有仓库 一、私有仓库搭建 # 1、拉取私有仓库镜像 docker pull registry # 2、启动私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories&quo…

瑞熙贝通助力实验室原始记录无纸化管理

一、系统概述 随着互联网时代的发展,实验室管理信息化功能日趋完善,涉及维度也不断扩大,实现实验室原始记录的电子化和数字化,提高实验室工作质量和效率,是实验室发展大势所趋。在实验室信息管理系统得到日益广泛应用…

云计算:现代技术的基本要素

众所周知,在儿童教育的早期阶段,幼儿园都会传授塑造未来行为的一些基本准则。 今天,我们可以以类似的方式思考云计算:它已成为现代技术架构中的基本元素。云现在在数字交互、安全和基础设施开发中发挥着关键作用。云不仅仅是另一…

nodejs+vue+微信小程序+python+PHP的热带野生动物园景点预约订票系统的设计与实现-计算机毕业设计推荐

管理员是系统的管理者,拥有系统的所有权限,通过系统设定的账号和密码登录后对系统进行管理,包括密码修改、用户管理。新闻公告的管理、景点管理、订单管理。管理员登录中,通过用户的登录名和密码到热带野生动物园景点预约订票系统…

【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

文章目录 一、定义二、LRU模拟实现二、代码实现 一、定义 LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就…

几种串口扩展电路

一、IIC串口扩展电路 LCT200 是一款可以通过 I2C 接口通讯,拓展 2 路独立串口的通讯芯片,同时也支持通过 2 路串口读写 I2C 接口的数据。LCT200 的封装为 TSSOP-20。 主要功能:⚫ 通过对 I2C 接口读写实现拓展 2 路独立串口功能 ⚫ 通过读写…

【Python3】\u字符与中文字串互转

小水。 encode和decode: str没有decode函数,但对应的有encode函数,该函数作用是转码为bytes对象bytes通过decode函数转换回对应的str对于一些偏激的(可以用过分来形容)的字符串,例如一二三\\u56db\\u4e94\\u516d,是有…

小狐狸GPT付费2.4.9 去除授权弹窗版

后台安装步骤: 1、在宝塔新建个站点,php版本使用7.2 、 7.3 或 7.4,把压缩包上传到站点根目录,运行目录设置为/public 2、导入数据库文件,数据库文件是 /db.sql 3、修改数据库连接配置,配置文件是/.env 4、…

时间Date

你有没有思考过时间问题: 前端为什么可以直接看见时间格式的数据 后端怎么接受的数据,怎么处理的 一般来说:前端传输来数据都是时间格式的字符串,那么后端需要能够解析时间格式的字符串,归功于JSONFormat ,可以解析…

YOLOv8改进 | 主干篇 | RevColV1可逆列网络(特征解耦助力小目标检测)

一、本文介绍 本文给大家带来的是主干网络RevColV1,翻译过来就是可逆列网络去发表于ICLR2022,其是一种新型的神经网络设计(和以前的网络结构的传播方式不太一样),由多个子网络(列)通过多级可逆连接组成。这种设计允许…

【Python_09】Python基础语法(数据容器之列表详解)

文章目录 概述Python中的数据容器列表1.1 定义列表1.2列表取值与修改1.3 列表遍历1.3.1 使用for循环遍历列表1.3.2 使用while循环遍历1.3.3 使用enumerate()函数获取索引和元素 1.4 列表常用方法 概述 数据容器是用来存储和组织数据的数据结构和对象。可以以不同的方式存储和操…

SpringBoot Event,事件驱动轻松实现业务解耦

什么是事件驱动 Spring 官方文档AWS Event Driven 简单来说事件驱动是一种行为型设计模式,通过建立一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖它的对象都能自动接收通知并更新。即将自身耦合的行为进行拆分,使拆…

@click 默认传递原生的事件对象

项目场景 [Day1] <template><div id"app"><h1>小黑记事本</h1><button click"handleClick">www</button><div class"head"><!-- 按键&#xff08;回车&#xff09;按下&#xff0c;出发add事件&…

Leetcode---376周赛---中位数贪心

题目列表 2965. 找出缺失和重复的数字 2966. 划分数组并满足最大差限制 2967. 使数组成为等数数组的最小代价 2968. 执行操作使频率分数最大 一、找到缺失和重复的数字 由于数据范围不是很大&#xff0c;可以直接暴力统计每个数字出现的次数&#xff0c;时间复杂度为O(n^2…