当前位置:网站首页>第十六期八股文巴拉巴拉说(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 认为该消费者繁忙,将不会给该消费者分发更多的消息。



点个在看你最好看

边栏推荐
- 知识蒸馏3:YOLOV5项目准备
- 一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧试读版
- linux 下MySQL本地安装mysql - u root - p 无法登入
- C陷阱与缺陷 第7章 可移植性缺陷 7.1 应对C语言标准变更
- 记者卧底
- Research on intelligent charging strategy of matlab simulink lithium-ion battery
- LayaBox---TypeScript---变量声明
- PLSQL Developer安装和配置
- 【AGC】增长服务2-应用内消息示例
- This year..I sincerely recommend the professional engineer to upgrade to the book!
猜你喜欢

Mathematical Principles of Graph Convolutional Neural Networks——A Preliminary Study on Spectral Graph Theory and Fourier Transform

952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题

MySQL中的存储过程(详细篇)

Metaverse Web 3.0 和 DeFi大师班

JVM诊断命令jcmd介绍

【HMS core】【ML Kit】机器学习服务常见问题FAQ(二)

【HarmonyOS】【FAQ】鸿蒙问题合集4

PLSQL Developer安装和配置

Linux-安装MySQL(详细教程)

论文阅读之《Color Constancy Using CNNs》
随机推荐
Linux-安装MySQL(详细教程)
这玩意儿都能优化?果然是细节都在魔鬼里。
主流的深度学习推理架构有哪些呢?
reporter undercover
论文阅读之《Underwater scene prior inspired deep underwater image and video Enhancement (UWCNN)》
【AGC】增长服务2-应用内消息示例
【HMS core】【Analytics Kit】【FAQ】如何解决华为分析付费分析中付款金额显示为0的问题?
【HMS Core】【FAQ】运动健康、音频编辑、华为帐号服务 典型问题合集7
【解决】关于 Unity Hub 获取许可证失败 或 无响应导致无法开发的问题
宽带射频放大器OA4SMM4(1)
JMeter Notes 4 | JMeter Interface Introduction
首发!阿里技术大牛最新耗时半个月整理出最全MySQL性能优化和高可用架构技术宝典,直接封神!
C陷阱与缺陷 第6章 预处理器 6.4 宏并不是类型定义
Basic knowledge points in js - BOM
592. Fraction Addition and Subtraction
windwons 下GPU环境和pytorch安装
Informatics Olympiad All-in-One 1966: [14NOIP Popularization Group] Scale Simplification | Luogu P2118 [NOIP2014 Popularization Group] Scale Simplification
Graph Attention Mechanism
C陷阱与缺陷 第7章 可移植性缺陷 7.3 整数的大小
轻量级网络 ESPNetv2