常见Rabbitmq面试题及答案总结

news2024/11/24 13:47:23

1、 什么是 rabbitmq

釆用AMQP高级消息队列协议的一种消息队列技术撮大的特点就是消费并不需要 确保提供方存在,实现了服务之间的高度解耦

2、 为什么要使rabbitmq

(1) 在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;

(2) 拥有持久化的机制,进程消息,队列中的信息也可以保存下来。

(3) 实现消费者和生产者之间的解耦。

(4) 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定 量的限流,利于数据库的操作。

(5) 可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。

3、 使用rabbitmq的场景

(1) 服务间异步通信

(2) 顺序消费

(3) 定时任务

(4) 流量削峰

(5) 解耦(为面向服务的架构(SOA)提供基本的最终一致性实现)

4、 如何确保消息正确地发送至RabbitMQ?如何确保消息接收方消费 了消息?

发送方稣模式

将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会 被指派一个唯一的ID。

—旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道 会发送一个确认给生产者(包含消息唯一ID)。

如果RabbitMQ发生内部错误从皿导致消息丢失,会发送一条nack

(notacknowledged,未确认)消息。

发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消 息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处 理确认消息。

接收方稣机制

消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操 作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。

这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需 要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长 的时间来处理消息。保证数据的最终一致性;

以下是常见的源豚清况

(1) 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会 认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复 消费的隐患,需要去重)

(2) 如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为 该消费者繁忙,将不会给该消费者分发更多的消息。

5 .如何避免消息重复投递或重复消费?

在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为 去重的依据(消息投递失败并重侍),避免重复的消息进入队列;在消息消费时, 要求消息体中必须要有一个bizld (对于同一业务全局唯一,如支付ID、订单ID、 帖子ID等)作为去重的依据,避免同一条消息被重复消费。

6、消息基于什么传输?

由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能菰 颈。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚 拟连接,且每条TCP连接上的信道数量没有限制。

7、消息如何分发?

l>round-robin 轮 询分发)

若该队列至少有一个消费者订阅,消息将以循环的方式发送给消费者。每条消息只 会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。通过 路由可实现多消费的功能

2>Fair dispatch (公平分发) 使用basicQos(prefetchcount = 1)方法,来限制RabbitMQ只发不超过1条的消息 给同一个消费者。当消息处理完毕后,有了反馈,才会进行第二次发送。

注:使用公平分发,必须关闭自动应答,改为手动应答

8、 消息怎么路由?

消息提供方->路由->—至多个队列消息发布到交换器时,消息将拥有一个路由键 (routing key),在消息创建时设定。通过队列路由键,可以把队列绑定到交换器 上。消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配 (针对不同的交换器有不同的路由规则);

常用的交换器主要分为一下三种:

fanout:如果交换器收到消息,将会广播到所有绑定的队列上

direct:如果路由键完全匹配,消息就被投递到相应的队列

topic:可以使来自不同源头的消息能够到达同一个队列。使用topic交换器时,可 以使用通配符

9、 如何确保消息不丢失?

消息持久化,当然前提是队列必须持久化

RabbitMQ确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的 —个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit会在消 息提交到日志文件后才发送响应。一旦消费者从持久队列中消费了一条持久化消 息,RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消 息在被消费之前RabbitMQ重启,那么Rabbit会自动重建交换器和队列(以及绑 定),并重新发布持久化日志文件中的消息到合适的队列。

10、 使用RabbitMQ有什么好处?

(1) 服务间高度解耦

减少强依赖

(2) 异步通信性能高

可以使用线程池解决,但是缺点很明显:要自己实现线程池,并且强耦合

大多数是使用消息队列来解决

(3) 流量削峰

通过消息队列设置请求最大值,超过阀值的抛弃或者转到错误界面.

(4)釆用信道通信,不釆用tcp直接通信

lj.tcp的创建和销毁开销大,创建3次握手,销毁4四次分手

2) .高峰时成千上万条的槌接会造成资源的巨大浪费,而且操作系统没秒处理 tcp的数量也是有数量限制的,必定造成性能瓶颈

3) .—条线程一条信道,多条线程多条信道,公用一个tcp连接。一条tcp连接 可以容纳无限条信道(硬盘容量足够的话),不会造成性能菰颈。

11、 RabbitMQ 的集群

镜像集群模式

你创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每 次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同 步。

好处在于,你任何一个机器宕机了,没事儿,别的机器都可以用。

坏处,第一,这个性能开销也太大了吧,消息同步所有机器,导致网络带宽压力和 消耗很重!

第二,这么玩儿,就没有扩展性可言了,如果某个queue负载很重,你加机器, 新増的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue

12、 Rmq的缺点

(1) 系统可用性降低

系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的 接口就好了,人ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ 挂了咋整? MQ挂了,整套系统崩溃了,你不就完了么。

(2) 系统复杂性提高

硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况? 怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已

(3) 一致性问题

A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要 是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,咋整? 你这数据就不一致了。

13、 RabbitMQ的工作模式

Simple模式(即最简单的收发模式)

1. 消息产生消息,将消息放入队列

2. 消息的消费者(consumer)监听消息队列,如果队列中有消息就消费掉,消息被拿走 后,自动从队列中删除(隐患消息可能没有被消费者正确处理,已经从队列中消失了, 造成消息的丢失,这里可以设置成手动的ack但如果设置成手动ack,处理完后要 及时发送ack消息给队列,否则会造成内存溢岀)。

-work工作模式(资源的竞争)

1. 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一 个队列,消息被消费。C1C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消 息(隐患:高并发情况下默认会产生某一个消息被多个消费者共同使用,可以设置一 个并关(syncronize)保证一条消息只能被一个消费者使用)。

三,publish/subscribe发布订阅(共享资源)

2、生产者将消息发给broker,由交换机将消息賴发到绑定此交换机的每个队 列,每个绑定交换机的队列都将接收到消息。

四.routing路由模式

amqp.gen-S9b...

1.消息生产者将消息发送给交换机按照路由判断,路由是字符串(inf。)当前 产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上 路由key对应的消息队列,对应的消费者才能消费消息; 2.根据业务功能定义路由字符串

3. 从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列 中。

4. 业务场景:error通知:EXCEPTION;错误通知的功能;传统意义的错误通知; 客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中, 开发者可以自定义消费者,实时接收错误;

五.topic主题模式(路由模式的一种)

Topic模式

1 )生产者发送消息到交换机;

2 )交换机消息送达队列为topic方式;

3 )消费者扌莫糊匹配路由Key ,进行消息消费;

#匹配一个或多个

*匹配一个

—般使用#号匹配多个,*号用的t:做少

交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消 息消费

14. 如何保证RabbitMQ消息的顺序性?

拆分多个queue,每个queue —个consumer,就是多一些queue而已, 确实是麻烦点;或者就一个queue但是对应一个consumer,然后这个 consumer内部用内存队列做排队,然后分发给底层不同的worker来处理

15. 如何保证RabbitMQ消息的可靠传输?

消息不可靠的情况可能是消息丢失,劫持等原因;

丢失又分为:生产者丢失消息、消息列表丢失消息、消费者丢失消息; 生产者丢失消息:从生广者弄丢数橢这个用度来看,RabbitMQ提供 transaction和confirm模式来确保生产者不丢消息;

transaction机制就是说:发送消息前,开启事务(channel. txSelect ()), 然后发送消息,如果发送过程中岀现什么异常,事务就会回滚 〔channel. txRolIback ()),如果发送成功则提交事务 (channel. txCommit ())。然而,这种方式有个缺点:吞吐量下降;

confirm模式用的居多:一旦channe 1进入confirm模式,所有在该信道上 发布的消息都将会被指派一个唯一的ID (从1开始),一旦消息被投递到所 有匹配的队列之后;

rabbitMQ就会发送一个ACK给生产者(包含消息的唯一 ID),这就使得生 产者知道消息已经正确到达目的队列了 ;

如果rabbitMQ没能处理该消息,则会发送一个Nack消息给你,你可以进行 重试操作。

消息队列丢数据:消息持久化。

处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。

这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘 后,再给生产者发送一个Ack信号。

这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack 信号,生产者会自动重发。

那么如何持久化呢?

1. 将queue的持久化标识durable设置为true,则代表是一个持久的队列

2. 发送消息的时候将deliveryMode=2

这样设置以后,即使rabbitMQ挂了,重启后也能恢复数据

消费者丢失消息:消费者丢数据一般是因为釆用了自动确认消息模式,改为 手动确认消息即可!

消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消 息;

如果这时处理消息失败,就会丢失该消息;

解决方案:处理消息成功后,手动回复确认消息。

16.如何解决消息队列的延时以及过期失效问题?

消息积压处理办法:临时紧急扩容:

先修复consumer的问题,确保其恢复消费速度,然后将现有cnosumer都 胃掉。

新建一个topic, partition是原来的10倍,临时建立好原先10倍的 queue数量。

然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压 的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍 数量的queue。

接着临时征用10倍的机器来部署consumer,母一批consumer消费一个 临时queue的数据。这种做法相当于是临时将queue资源和consumer资 源扩大10倍,以正常的10倍速度来消费数据。

等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer机器来消费消息。

啊中消息失效:假设你用的是RabbitMQ, RabbtiMQ是可以设置过期时间 的,也就是TTLo如果消息在queue中积压超过一定的时间就会被 RabbitMQ给清理掉。这就不是说数据会大量积压在mq里,而是大量的数 据会直接搞丢。可以釆取一个方案,就是批量重导。

就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以 后,比如大家一起喝咖啡熬夜到晩上12点以后,用户都睡觉了。这个时候 我们就开始写程序,将丢失的那批数据,写个临时程序,一点一点的查岀 来,然后重新灌入mq里面去,把白天丢的数据给他补回来。也只能是这样 了。假设1万个订单积压在mq里面,没有处理,其中1000个订单都丢 了,你只能手动写程序把那1000个订单给查岀来,手动发到mq里去再补 —次。

mq消息队列块满了:如果消息积压在mq里,你很长时间都没有处理掉,此 时导致mq都快写满了,你临时写程序,接入数据来消费,消费一个丢弃一个,都不要了,快速消费掉所有的消息。然后走第二个方案,到了晩上再补 数据吧。

17. 设计MQ思路

比如说这个消息队列系统,可以从以下几个角度来考虑一下:

首先这个mq得支持可伸缩性吧,就是需要的时候快速扩容,就可以増加吞 吐量和容量,那怎么搞?设计个分布式的系统呗,参照一下kafka的设寸 理念,broker -> topic -> partition,母个 partition 放一个机器,就 存一部分数据。如果现在资源不够了,简单啊,给topic増加 partition,然后做数据迁移,増加机器,不就可以存放更多数据,提供更 高的吞吐量了?

其次你得考虑一下这个mq的数据要不要落地磁盘吧?那肯定要了,落磁盘 才能保证别进程挂了数据就丢了。那落磁盘的时候怎么落啊?顺序写,这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是 kafka的思路。

其次你考虑一下你的mq的可用性啊?这个事儿,具体参考之前可用性那个 环节讲解的kafka的高可用保障机制。多副本-〉leader & follower -> broker挂了重新选举leader即可对外服务。

能不能支持数据0丢失啊?

通过offset commit来保证数据的不丢失,以及数据的不会重复消费。

kafka自己记录了每次消费的offset数值,下次继续消费的时候,接看上次的

offset进行;肖斐即可,可以通过手动的提交offset,保证数据的不会丢失。

18. rabbitmq怎么避免消息丢失

rabbitMQ消息可能丢失的情况:

L发送方发出消息但没有进入队列。

将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都 会被指派一个唯一的ID。一旦消息被投递到目的队列后,或者肖息被写入磁盘后

(可持久化的消息),信道会发送一个确认给生产者(包念肖息唯一ID )。

2. 接收者接到消息,但处理过程出现错误。

当消费者获取消息后,会向RabbitMQ发送回执ACK ,告知消息我被接收。不 过这种回执ACK分两种情况:

自动ACK :消息一旦被接收,消费者自动发送ACK

如果消息不太重要,丢失也没有影响,那么自动ACK会比较方便

手动ACK :消息接收后,不会发送ACK ,需要手动调用

-如果消息非常重要,不容丢失。那么最好在消费完成后手动ACK ,否则接收消息 后就自动ACK , RabbitMQ就会把消息从队列中删除。如果此时f肖费者宕机,那 么消,諷丢失了。

3. 队列或者列机。

消息持久化,当然前提是队列和交换机必须持久化

19.rabbitmq怎么实现延迟消息队列

使用RabbitMQ来实现延迟任务必须先了解RabbitMQ的两个概念:消息的TTL 和死信Exchange ,通过这两者的组合来实现上述需求。如果队列设置了,消息也 设置了,那么会取小的。所以一个消息如果被路由到不同的队列中,这个消息死亡 的时间有可能不一样(不同的队列设置)O

延迟任务通过消息的TTL和Dead Letter Exchange来实现。我们需要建立2个 队列,一个用于发送消息,一个用于消息过期后的转发目标队列。

生产者输出消息到Queuel,并且这个消息是设置有有效时间的,比如3分钟。 消息会在Queuel中等待3分钟,如果没有消费者收掉的话,它就是被转发到 Queue2 , Queue2有消费者,收到,处理延迟任务。

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

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

相关文章

汽车MCU虚拟化--对中断虚拟化的思考(2)

目录 1.引入 2.TC4xx如何实现中断虚拟化 3.小结 1.引入 其实不管内核怎么变,针对中断虚拟化无非就是上面两种,要么透传给VM,要么由Hypervisor统一分发。汽车MCU虚拟化--对中断虚拟化的思考(1)-CSDN博客 那么,作为车规MCU龙头…

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(五)数据处理

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

Java学习中,如何理解注解的概念及常用注解的使用方法

一、简介 Java注解(Annotation)是一种元数据,提供了一种将数据与程序元素(类、方法、字段等)关联的方法。注解本身不改变程序的执行逻辑,但可以通过工具或框架进行处理,从而影响编译、运行时的…

Suryxin’s ACM退役记

序 我的记忆力很差,经历过的很多事情都已经记不太清了,其中有很多美好回忆也已经消散,我很惋惜没能留存一些照片和声音或是文字供我怀念,这就像《泰坦尼克号》一样,露丝和杰克感人肺腑的爱情故事,最后也仅…

东航携手抖音生活服务开启机票首播,推出国内、国际超值机票次卡

在民航暑运旺季到来之际,越来越多的用户选择提前做好旅行规划,囤下高性价比的出游商品。6月6日18点,中国东方航空(以下简称“东航”)将在抖音开启首次机票直播,推荐多款超值机票次卡及空中Wi-Fi等特色产品&…

SpringBoot发邮件服务如何配置?怎么使用?

SpringBoot发邮件需要的参数?邮件发送性能如何优化? 在SpringBoot项目中配置发邮件服务是一个常见的需求,它允许我们通过应用程序发送通知、验证邮件或其他类型的邮件。AokSend将详细介绍如何在SpringBoot中配置发邮件服务。 SpringBoot发邮…

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…

QT获取最小化,最大化,关闭窗口事件

QT获取最小化,最大化,关闭窗口事件 主程序头文件: 实现: changeEvent,状态改变事件 closeEvent触发点击窗口关闭按钮事件 其代码它参考: /*重写该函数*/ void MainWindow::changeEvent(QEvent *event) {…

蚓链数字化营销生态的影响力分享!

​家人们,今天来给大家分享一些关于数字化平台生态化对数字营销影响的具体案例。 比如某电商平台,通过生态化的建设,实现了精准的推荐算法。根据用户的浏览历史和购买行为,为他们推荐最符合需求的商品,大大提高了购买…

JeeSite 快速开发平台 Vue3 前端版介绍

JeeSite 快速开发平台 Vue3 前端版介绍: 它构建于 Vue3、Vite、Ant-Design-Vue、TypeScript 以及 Vue Vben Admin 等最前沿的技术栈之上,能助力初学者迅速上手并顺利融入团队开发进程。涵盖的模块包括组织机构、角色用户、菜单授权、数据权限、系统参数…

小程序开发平台——超级万能DIY商城小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 超级万能 DIY 商城小程序源码系统是一款集前端和后端分离的强大工具,为开发者提供了一站式的解决方案。它不仅具备完整的安装代码包,还附带详细的搭建教程,让即使是没有丰富技术经验的开发者也能轻松上手,快速构建自己的…

Vue3实战笔记(56)—实战:DefineModel的使用方法细节

文章目录 前言一、实战DefineModel二、思考原理总结 前言 今天写个小例子&#xff0c;实战DefineModel的使用方法细节 一、实战DefineModel 上文官方说的挺清楚&#xff0c;实战验证一下&#xff0c;新建DefineModel.vue&#xff08;这是儿子&#xff09;&#xff1a; <te…

珠海鸿瑞毛利率持续下滑:核心产品销量大降,偿债能力偏弱

《港湾商业观察》黄懿 日前&#xff0c;珠海市鸿瑞信息技术股份有限公司&#xff08;下称“珠海鸿瑞”&#xff09;收到了北京证券交易所发出的第三轮审核问询函。 此前&#xff0c;2020年11月&#xff0c;珠海鸿瑞曾向深交所报送上市申请。IPO申请文件获受理后&#xff0c;珠…

MySQL8 全文索引

文章目录 创建索引使用索引总结 创建索引 之前未尝试过使用MySQL8的全文索引&#xff0c;今天试一试看看什么效果&#xff0c;否则跟不上时代了都。   创建索引非常简单&#xff0c;写句SQL就行。 create table goods(id integer primary key auto_increment,name varchar(2…

知识图谱的应用---智能制造

文章目录 智能制造典型应用 智能制造 随着云计算、大数据、人工智能技术的快速发展&#xff0c;越来越多的新技术正在应用于传统工业领域&#xff0c;并在帮助企业实现产业转型、技术升级及效益提升方面起到了关键作用。目前在提升良品率方面&#xff0c;知识图谱通过深度计算所…

Selenium时间等待_显示等待

特点&#xff1a; 针对具体元素进行时间等待 可以自定义等待时长和间隔时间 按照设定的时间&#xff0c;不断定位元素&#xff0c;定位到了直接执行下一步操作 如在设定时间内没定位到元素&#xff0c;则报错&#xff08;TimeOutException&#xff09; 显示等待概念&#x…

【Python报错】已解决NameError: name ‘secrets‘ is not defined

解决Python报错&#xff1a;NameError: name ‘secrets’ is not defined 在使用Python进行安全编程时&#xff0c;我们经常需要使用secrets模块来生成安全的随机数。然而&#xff0c;如果你在尝试使用这个模块时遇到了NameError: name secrets is not defined的错误&#xff0…

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

安装TPMmanager

sudo apt-get install qt4-qmake sudo apt-get install libqt4-dev下载TPMManager&#xff0c;解压之后拖入Ubuntu&#xff0c;进入目录 https://gitcode.com/Rohde-Schwarz/TPMManager/overview?utm_sourcecsdn_github_accelerator&isLogin1 cd tpmmanager-master qmake…

【Spring Cloud】Gateway 服务网关核心架构的执行流程和断言

文章目录 基本概念执行流程断言内置路由断言工厂自定义路由断言工厂 总结 基本概念 路由(Route)是gateway中最基本的组件之一&#xff0c;表示一个具体的路由信息载体。主要定义了下面的几个信息&#xff1a; id&#xff1a;路由标识符&#xff0c;区别于其他Route。uri&…