当前位置:网站首页>第十六期八股文巴拉巴拉说(MQ篇)
第十六期八股文巴拉巴拉说(MQ篇)
2022-07-30 17:49:00 【IT学习小镇】
点击上方蓝字关注我们
1
Q:RocketMq使用哪种方式消费消息,pull还是push?
RocketMq提供两种方式:pull和push进行消息的消费。而RocketMq的push方式,本质上也是采用pull的方式进行实现的。也就是说这两种方式本质上都是采用consumer轮询从broker拉取消息的。push方式里,consumer把轮询过程封装了一层,并注册了MessageListener监听器。当轮询取到消息后,便唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉好像消息是被推送过来的。消息统一都发到了broker,而broker又不会主动去push消息,那么消息肯定都是需要消费者主动去拉。
如果broker主动推送消息的话有可能push速度快,消费速度慢的情况,那么就会造成消息在consumer端堆积过多,同时又不能被其他consumer消费的情况。而pull的方式可以根据当前自身情况来pull,不会造成过多的压力而造成瓶颈。所以采取了pull的方式。
2
Q:RocketMq如何进行消息的去重?
我们知道,只要通过网络交换数据,就无法避免因为网络不可靠而造成的消息重复这个问题。比如说RocketMq中,当consumer消费完消息后,因为网络问题未及时发送ack到broker,broker就不会删掉当前已经消费过的消息,那么,该消息将会被重复投递给消费者去消费。虽然rocketMq保证了同一个消费组只能消费一次,但会被不同的消费组重复消费,因此这种重复消费的情况不可避免。RocketMq本身并不保证消息不重复,这样肯定会因为每次的判断,导致性能打折扣,所以它将去重操作直接放在了消费端:
1)消费端处理消息的业务逻辑保持幂等性。那么不管来多少条重复消息,可以实现处理的结果都一样。
2)还可以建立一张日志表,使用消息主键作为表的主键,在处理消息前,先insert表,再做消息处理。这样可以避免消息重复消费。
3
Q:RocketMQ Broker中的消息被消费后会立即删除吗?
不会,每条消息都会持久化到CommitLog中,每个Consumer连接到Broker后会维持消费进度信息,当有消息消费后只是当前Consumer的消费进度(CommitLog的offset)更新了。
4
Q:RocketMQ消费模式有几种?
消费模型由Consumer决定,消费维度为Topic。
集群消费:
1.一条消息只会被同Group中的一个Consumer消费。
2.多个Group同时消费一个Topic时,每个Group都会有一个Consumer消费到数据。
广播消费:
消息将对一 个Consumer Group 下的各个 Consumer 实例都消费一遍。即即使这些 Consumer 属于同一个Consumer Group ,消息也会被 Consumer Group 中的每个 Consumer 都消费一次。
5
Q:如何让RocketMQ保证消息的顺序消费
首先多个queue只能保证单个queue里的顺序,queue是典型的FIFO,天然顺序。多个queue同时消费是无法绝对保证消息的有序性的。所以总结如下:同一topic,同一个QUEUE,发消息的时候一个线程去发送消息,消费的时候 一个线程去消费一个queue里的消息。
6、
Q:如何确保消息正确地发送至MQ?接收方消费了消息?
发送方确认模式将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID。
一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID)。
如果 RabbitMQ 发生内部错误从而导致消息丢失,会发送一条 nack(notacknowledged,未确认)消息。
发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。接收方确认机制消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ 才能安全地把消息从队列中删除。这里并没有用到超时机制,RabbitMQ 仅通过 Consumer 的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ 给了Consumer 足够长的时间来处理消息。保证数据的最终一致性;下面罗列几种特殊情况:
1、如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ 会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
2、如果消费者接收到消息却没有确认消息,连接也未断开,则 RabbitMQ 认为该消费者繁忙,将不会给该消费者分发更多的消息。
点个在看你最好看
边栏推荐
- 基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇
- 952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题
- 【HarmonyOS】【FAQ】鸿蒙问题合集3
- 「Redis应用与深度实践笔记」,深得行业人的心,这还不来看看?
- 【AGC】增长服务2-应用内消息示例
- 多年以后「PageHelper」又深深的给我上了一课
- FastJson反序列化漏洞(复现)
- JMeter笔记3 | JMeter安装和环境说明
- C陷阱与缺陷 第7章 可移植性缺陷 7.2 标识符名称的限制
- Microsoft Office 2019 software download and installation detailed tutorial!
猜你喜欢
随机推荐
Basic knowledge points in js - BOM
leetcode-684:冗余连接
沃尔沃中国的年中总结,在“安全感”中寻找未来
【HMS core】【Analytics Kit】【FAQ】如何解决华为分析付费分析中付款金额显示为0的问题?
数据库系统原理与应用教程(068)—— MySQL 练习题:操作题 90-94(十二):DML 语句练习
多年以后「PageHelper」又深深的给我上了一课
信息学奥赛一本通 1915:【01NOIP普及组】最大公约数与最小公倍数 | 洛谷 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
Leetcode数据库系列题解合集(持续更新)
【AGC】增长服务2-应用内消息示例
【HarmonyOS】【FAQ】鸿蒙问题合集3
数据库系统原理与应用教程(069)—— MySQL 练习题:操作题 95-100(十三):分组查询与聚合函数的使用
How Google earth engine realizes the arrangement and selection of our time list
Analysis and Simulation of Short Circuit Fault in Power System Based on MATLAB
【开发者必看】【push kit】推送服务典型问题合集3
2022鹏城杯web
Dodging ice cream assassins?Crawling ice cream prices through crawlers
分布式消息队列平滑迁移技术实战
知识蒸馏1:基础原理讲解及yolov5项目实战介绍
习题:变量、常量和基本数据类型
高级语言垃圾回收思路和如何减少性能影响原理分析