网站首页 > 教程文章 正文
哈哈哈,这一篇其实是上一篇的姊妹篇(大厂面试必问——MQ高可用集群方案),昨天小编耽误了一下,写了一半,现在补上。废话不多说,直接上干活。
如何保证MQ消息不丢失
关于消息丢失,首先我们分析一下消息丢失的原因,然后再提出对应策略。
可能原因:
常见的原因无非以下三种。刚好对应生产者、MQ、消费者。
1,消息生产者没有成功发送到MQBroker
2,消息发送给MQBroker后,Broker宕机导致内存中的消息数据丢失
3,消费者获取到消息,但消费者还没有来得及处理宕机了,但此时MQ中消息已经删除,消费者重启后不能再消费之前的消息
解决方案:
上面我们分析了出现的原因,知道了原因就好处理了。
1.消息发送者发送给MQ Broker后,MQ Broker给生产者确认收到。
2.MQ收到消息后进行消息持久化。
3.消费者收到消息处理完毕后手动进行ack确认。
4.MQ收到消费者ack确认后删除持久化的消息。
如何保证消息不被重复消费
首先我们要知道的是消息为什么会重复,消息重复的根本原因是网络不可达。细分的话,可以分为生产者和消费者的重复。
生产者消息重复
当一条消息已被成功发送到服务端,此时出现了网络闪断,导致服务端对客户端应答失败。如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同的消息。
消费者消息重复
消息消费的场景下,消息已投递到消费者并完成业务处理,当消费方给MQ服务端反馈应答的时候网络闪断。为了保证消息至少被消费一次,MQ服务端将在网络恢复后再次尝试投递之前已被消费方处理过的消息,此时消费者就会收到两条内容相同的消息。
防止重复消费
防止消息重复消费的核心就是两个字,幂等。所以消息的重复消费和保证幂等性会经常被连着问,当出现了重复消息后,为了保证系统数据的正常性,就必须要保证幂等性。幂等的方式很简单,主要就是标记。
简单地说,幂等主要有以下几步:
1. 消息发送者发送消息时携带一个全局唯一的消息id。
2. 消费者获取消费后先根据id在redis/db中查询是否存在消费记录。
3. 如果没有消费过就正常消费,消费完毕后写入redis/db。
4. 如果消息消费过就直接舍弃。
消息消费的顺序性
消息有序指的是可以按照消息的发送顺序来消费。这个问题也是比较常见的面试题,场景也比较常见。比如我们下单时送积分,肯定是要先支付完成,然后送积分的。
全局顺序消费
要保证全局的顺序性,其核心是生产者,MQ,消费者1:1:1即可。既可以保证消息顺序到达MQ,又可以保证消息顺序消费。但是显然,这种模型有着致命的缺点。会导致吞吐量下降,容错性降低。所以实际上这种模型并不常见。模型结构如下:
局部顺序消费
这种场景是比较常见的,面试时大部分时候问的是这种。其实本质是通过将一组消息发送到同一个MQ中,通过MQ的有序性保证顺序。主要流程如下:
1. 生产者根据消息ID将同一组消息发送到一个Queue中。
2. 多个消费者同时获取Queue中的消息进行消费。
3. MQ使用分段锁保证单个Queue中的有序消费。
福利赠送
又到了大家期待的福利时间了。本次说的是MQ,那么对应送给各位看官大人的也是MQ的面试笔记了。
说了这么多,各位看官大人要怎么获取呢。很简单,关注小编,私信「资料」即可获得免费获取方式。
如果大家有比较好的资源欢迎相互交流,共同提高。同时有部分素材来源于网络,如侵,联删。
猜你喜欢
- 2025-03-25 深入理解MQ:消息的消费(信息消费的作用)
- 2025-03-25 一面秒过,二面难过(一面二面一般间隔多久)
- 2025-03-25 透彻剖析RocketMQ的消息顺序消费和并发消费机制体系的原理分析
- 2025-03-25 面试官:如何保证RocketMQ/RabbitMQ消息数据100%不丢失
- 2025-03-25 微服务调用原理深度解析:从概念到实践的核心问题与解决方案
- 2025-03-25 kafka丟消息怎么办?看看kafka无消息丢失配置方案
- 2025-03-25 面试官:对于MQ中的消息堆积你是怎么理解的?
- 2025-03-25 阿里二面:如何保证Kafka消息不丢失且不重复
- 2025-03-25 消息消费积压问题排查实战(消费方面)
- 2025-03-25 消息队列(MQ)消息堆积问题排查与解决思路
- 05-11阿里开源MySQL中间件Canal快速入门
- 05-11MyBatis插件开发实战:手写一个分页插件
- 05-11Flask数据库——SQLAlchemy
- 05-11MySQL 到 Hazelcast Cloud 实时数据同步实操分享
- 05-11sqlmap 详解
- 05-11一篇文章让你学会Elasticsearch中的查询
- 05-11Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!
- 05-11Spring Boot 实现 MySQL 读写分离技术
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)