RabbitMQ面试篇

news2024/11/15 23:20:03

文章目录

  • 1 你们为什么选择了RabbitMQ而不是其它的MQ?
  • 2 RabbitMQ如何确保消息的不丢失?
  • 3 RabbitMQ如何避免消息堆积?
  • 4 RabbitMQ如何保证消息的有序性?
  • 5 如何防止MQ消息被重复消费?
  • 6 如何保证RabbitMQ的高可用?
  • 7 使用MQ可以解决那些问题?

1 你们为什么选择了RabbitMQ而不是其它的MQ?

如图:
在这里插入图片描述
话术:

kafka是以吞吐量高而闻名,不过其数据稳定性一般,而且无法保证消息有序性。我们公司的日志收集也有使用,业务模块中则使用的RabbitMQ。

阿里巴巴的RocketMQ基于Kafka的原理,弥补了Kafka的缺点,继承了其高吞吐的优势,其客户端目前以Java为主。但是我们担心阿里巴巴开源产品的稳定性,所以就没有使用。

RabbitMQ基于面向并发的语言Erlang开发,吞吐量不如Kafka,但是对我们公司来讲够用了。而且消息可靠性较好,并且消息延迟极低,集群搭建比较方便。支持多种协议,并且有各种语言的客户端,比较灵活。Spring对RabbitMQ的支持也比较好,使用起来比较方便,比较符合我们公司的需求。

综合考虑我们公司的并发需求以及稳定性需求,我们选择了RabbitMQ。

2 RabbitMQ如何确保消息的不丢失?

话术:

RabbitMQ针对消息传递过程中可能发生问题的各个地方,给出了针对性的解决方案:

  • 生产者发送消息时可能因为网络问题导致消息没有到达交换机:
    • RabbitMQ提供了publisher confirm机制
      • 生产者发送消息后,可以编写ConfirmCallback函数
      • 消息成功到达交换机后,RabbitMQ会调用ConfirmCallback通知消息的发送者,返回ACK
      • 消息如果未到达交换机,RabbitMQ也会调用ConfirmCallback通知消息的发送者,返回NACK
      • 消息超时未发送成功也会抛出异常
  • 消息到达交换机后,如果未能到达队列,也会导致消息丢失:
    • RabbitMQ提供了publisher return机制
      • 生产者可以定义ReturnCallback函数
      • 消息到达交换机,未到达队列,RabbitMQ会调用ReturnCallback通知发送者,告知失败原因
  • 消息到达队列后,MQ宕机也可能导致丢失消息:
    • RabbitMQ提供了持久化功能,集群的主从备份功能
      • 消息持久化,RabbitMQ会将交换机、队列、消息持久化到磁盘,宕机重启可以恢复消息
      • 镜像集群,仲裁队列,都可以提供主从备份功能,主节点宕机,从节点会自动切换为主,数据依然在
  • 消息投递给消费者后,如果消费者处理不当,也可能导致消息丢失
    • SpringAMQP基于RabbitMQ提供了消费者确认机制、消费者重试机制,消费者失败处理策略:
      • 消费者的确认机制:
        • 消费者处理消息成功,未出现异常时,Spring返回ACK给RabbitMQ,消息才被移除
        • 消费者处理消息失败,抛出异常,宕机,Spring返回NACK或者不返回结果,消息不被异常
      • 消费者重试机制:
        • 默认情况下,消费者处理失败时,消息会再次回到MQ队列,然后投递给其它消费者。Spring提供的消费者重试机制,则是在处理失败后不返回NACK,而是直接在消费者本地重试。多次重试都失败后,则按照消费者失败处理策略来处理消息。避免了消息频繁入队带来的额外压力。
      • 消费者失败策略:
        • 当消费者多次本地重试失败时,消息默认会丢弃。
        • Spring提供了Republish策略,在多次重试都失败,耗尽重试次数后,将消息重新投递给指定的异常交换机,并且会携带上异常栈信息,帮助定位问题。

3 RabbitMQ如何避免消息堆积?

话术:

消息堆积问题产生的原因往往是因为消息发送的速度超过了消费者消息处理的速度。因此解决方案无外乎以下三点:

  • 提高消费者处理速度
  • 增加更多消费者
  • 增加队列消息存储上限

1)提高消费者处理速度

消费者处理速度是由业务代码决定的,所以我们能做的事情包括:

  • 尽可能优化业务代码,提高业务性能
  • 接收到消息后,开启线程池,并发处理多个消息

优点:成本低,改改代码即可

缺点:开启线程池会带来额外的性能开销,对于高频、低时延的任务不合适。推荐任务执行周期较长的业务。

2)增加更多消费者

一个队列绑定多个消费者,共同争抢任务,自然可以提供消息处理的速度。

优点:能用钱解决的问题都不是问题。实现简单粗暴

缺点:问题是没有钱。成本太高

3)增加队列消息存储上限

在RabbitMQ的1.8版本后,加入了新的队列模式:Lazy Queue

这种队列不会将消息保存在内存中,而是在收到消息后直接写入磁盘中,理论上没有存储上限。可以解决消息堆积问题。

优点:磁盘存储更安全;存储无上限;避免内存存储带来的Page Out问题,性能更稳定;

缺点:磁盘存储受到IO性能的限制,消息时效性不如内存模式,但影响不大。

4 RabbitMQ如何保证消息的有序性?

话术:

其实RabbitMQ是队列存储,天然具备先进先出的特点,只要消息的发送是有序的,那么理论上接收也是有序的。不过当一个队列绑定了多个消费者时,可能出现消息轮询投递给消费者的情况,而消费者的处理顺序就无法保证了。

因此,要保证消息的有序性,需要做的下面几点:

  • 保证消息发送的有序性
  • 保证一组有序的消息都发送到同一个队列
  • 保证一个队列只包含一个消费者

5 如何防止MQ消息被重复消费?

话术:

消息重复消费的原因多种多样,不可避免。所以只能从消费者端入手,只要能保证消息处理的幂等性就可以确保消息不被重复消费。

而幂等性的保证又有很多方案:

  • 给每一条消息都添加一个唯一id,在本地记录消息表及消息状态,处理消息时基于数据库表的id唯一性做判断
  • 同样是记录消息表,利用消息状态字段实现基于乐观锁的判断,保证幂等
  • 基于业务本身的幂等性。比如根据id的删除、查询业务天生幂等;新增、修改等业务可以考虑基于数据库id唯一性、或者乐观锁机制确保幂等。本质与消息表方案类似。

6 如何保证RabbitMQ的高可用?

话术:

要实现RabbitMQ的高可用无外乎下面两点:

  • 做好交换机、队列、消息的持久化
  • 搭建RabbitMQ的镜像集群,做好主从备份。当然也可以使用仲裁队列代替镜像集群。

7 使用MQ可以解决那些问题?

话术:

RabbitMQ能解决的问题很多,例如:

  • 解耦合:将几个业务关联的微服务调用修改为基于MQ的异步通知,可以解除微服务之间的业务耦合。同时还提高了业务性能。
  • 流量削峰:将突发的业务请求放入MQ中,作为缓冲区。后端的业务根据自己的处理能力从MQ中获取消息,逐个处理任务。流量曲线变的平滑很多
  • 延迟队列:基于RabbitMQ的死信队列或者DelayExchange插件,可以实现消息发送后,延迟接收的效果。

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

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

相关文章

计算机体系结构:分支目标缓冲(BTB)例题

题目内容 按照下表计算分支转移总的延迟,根据下面的假设,计算分支目标缓冲的性能。 (1)对于BTB中的指令,预测准确率90%。 (2)缓冲区命令率90%。 (3)不在BTB中分支转移成功的比例为60%。 题目分析 总共有四种情况: ①在BTB中且预…

DSP篇--C6678功能调试系列之网络调试

目录 网络调试 1、GE工程的研究与功能扩充 网络调试 网口测试,使用的是TI官方提供的GE网络测试例程。 主要注意的事项是:时钟的设置、相关设备的MAC地址和IP的设置、中断的设置。确定板子的port和phy。 GbE Switch Subsystem Initialization Procedure…

[附源码]Python计算机毕业设计Django计算机相关专业考研资料管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

bash调试方法总结

在看nginx源码实现时发现有些代码是根据不同的本地环境动态生成的,看了一下大致生成流程,基本上都是通过shell脚本调用shell脚本实现的。看到了shell脚本,就想到如何调试shell脚本,shell脚本在实际工作中运用的挺多的,…

几何向量:向量到平面投影和LookAt

在研究所保密开发完后回来隔离两波,已经接近四五个月没碰外网电脑了,可以说是活成了原始人。 因为某些开发细节原因,需要实现向量投影和LookAt功能,记录一下。 首先实现向量到平面投影,如下: …

第二证券|鲍威尔发声:释放重磅信号,美股大涨!中概股狂涨

大家早上好!昨夜今晨又有许多大事产生:美联储主席鲍威尔证明,12月开端或许放缓加息;微软涨逾1100亿美元,美股进入技能型牛市;小鹏轿车昨日暴升近50%,中概股11月涨逾40%;法、德不满美…

java计算机毕业设计ssm企业日常事务管理系统sl5xl(附源码、数据库)

java计算机毕业设计ssm企业日常事务管理系统sl5xl(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

全栈性能测试教程之性能测试相关知识(二) Jmeter的应用

性能测试相关知识(二) Jmeter的应 1、性能测试的方法 1.1验收负载测试: 在QA的环境模拟生产运行的业务压力和使用场景组合,测试系统的性能是否满足生产环境的性能诉求。 1.2负载测试 在被测系统上持续不断的增加压力&#xff…

易点易动RFID固定资产管理系统助力企业年终固定资产大盘点

固定资产作为资产构成的重要组成部分,也是企业完成生产经营的物质保障,对企业的发展起着重要的作用。越来越多的企业者开始重视企业内部的固定资产管理,从而会定期对固定资产进行盘点,以保证固定资产账实一致、账账相符。每逢年底…

粒子群算法和鲸鱼算法的比较(Matlab代码实现)

目录 1 粒子群优化算法 2 鲸鱼优化算法 3 粒子群算法和鲸鱼算法比较 4 Matlab代码实现 1 粒子群优化算法 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究…

GitHub限时开源36小时的阿里Java架构师学习手册,上线即标星35k+

前言 今年受大环境影响面试于往年相比难得多,对程序员要求越来越高!环境我们无法改变能改变的就是自己,努力提升技术! 我在GitHub无意见看见115k的Java教程,感觉还不错,给大家看看!文档总共分为…

Cloud Mail JavaScript管理邮件

Cloud Mail JavaScript管理邮件 使用流行的云服务发送、接收和管理邮件。 云邮件使用流行的云服务简化了邮件的发送、接收和管理,包括Amazon SES、Microsoft 365(Outlook Mail)和Gmail。还支持包括OAuth、TLS 1.3和TLS 1.2在内的现代身份验证和安全选项。 云邮件功…

前后端验证码交互完整流程

本文章基于vueelement-uispringbootredis讲解,其他的都是工具,可以直接拿来用,不懂redis没关系(因为本文只用了简单的存取),但前面三个要懂 如果你只想看前端或者后端的代码逻辑,本文章同样适用…

提升代码可读性,减少if-else的几个小技巧

前言💁‍♂️ 相信大家或多或少都接触过拥有庞大 if else 的项目代码吧,多重嵌套的 if else 在维护的时候真的让人很恼火😡,有时候一个 bug 排查下来,严重感觉身体被掏空😿。 本文并未有消灭或歧视 if el…

2022年测试行业的新变化

清晨的第一缕阳光,打开手机,熟悉的数字映入眼帘,洗漱完毕,戴好口罩,新的一天开始了 看似平静的表面,却到处暗潮汹涌 偶然间在朋友圈看到一则招聘广告,Base上海,两年以上经验&#…

python接口自动化测试框架

本文总结分享介绍接口测试框架开发,环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用HTMLTestRunner来生成测试报告,目前有开源的poman、Jmeter等接口测试工…

文件的上传和下载

一、node实现文件上传 1、FormData对象:以对象的方式来表示页面中的表单,又称为表单对象。以key-value的方式来保存数据,XMLHttpRequest对 象可以轻松的表单对象发送的服务器端 ​ (1)是一个构造函数:ne…

力扣hot100——第4天:19删除链表的倒数第N个节点、20有效的括号、21合并两个有序链表

文章目录1.19删除链表的倒数第N个节点【代码随想录已刷】2.20有效的括号【代码随想录已刷】3.21合并两个有序链表3.1.题目3.2.题解1.19删除链表的倒数第N个节点【代码随想录已刷】 参考:力扣题目链接;自己的博客解答 2.20有效的括号【代码随想录已刷】…

whistle监听方法

视频教程 程序员抓包神器,快速定位线上bug_哔哩哔哩_bilibili whistle官网 关于whistle GitBook 安装whistle后, 复制启动网址 系统代理也设置完毕后,在浏览器打开http://192.168.4.238:8899,即可进行抓包 拦截js,并执行自定…

10年的老测试告诉你八大测试用例设计方法

一:等价类划分法 1:有效等价类: 2:无效等价类: 案例:比如一个登陆输入框,规定只能输入中文,同时长度为6-10。 通过等价类设计测试用例: 测试用例中重要的三步: 输入 操作 预计结果 如果与预期结果不符合就是bug。 有效等价类: 输入:输入长度为6的中文,输入的为…