RabbitMq相关面试题

news2024/11/27 4:20:58

文章目录

    • 消息队列有没有接触过? 简单介绍一下?
    • 消息中间件模式分类 ?
    • 使用MQ有什么好处?
    • MQ如何选型 ?
    • 你们项目中用到过 MQ 吗?谈谈你对 MQ 的理解?
    • MQ消费者消费消息的顺序一致性问题?
    • RabbitMQ如何保证数据⼀致性?
    • 你们如何解决消息堆积问题?
    • RabbitMQ消费者自动扩展数量 ?
    • 上千万条消息在mq中积压了几个小时还没解决 ?
    • 如何确保消息正确地发送⾄RabbitMQ?
    • 如何确保消息接收⽅消费了消息?
    • 如何避免消息重复投递或重复消费?
    • rabbitmq设置过期时间,部分消息丢失 ?
    • 如何确保消息不丢失?
    • 消息怎么路由?
    • RabbitMQ结构 ?
    • RabbitMQ交换器有哪些类型?

消息队列有没有接触过? 简单介绍一下?

了解,消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构;目前使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

消息中间件模式分类 ?

  • 点对点(P2P)
    一条消息只能被一个消费者消费。
  • 发布、订阅
    一条消息可以同时被多个消费者消费;生产者和消费者有时间上的依赖性,生产者在生产的消息的时候,应该至少有一个
    消费者处于在线状态。

使用MQ有什么好处?

流量削锋
把消息压入RabbitMQ中可以缓冲系统压力。比如现在系统只能接受2000请求,但是一下子有10000个请求过来,那么这个请求就会压在RabbitMQ中,那么就可以慢慢进行消费了。

异步消息
以前是先去发短信,再去发邮件。引入RabbitMQ之后,我们就可以进行在发短信的同时再去发邮箱。

应用解耦
当多个系统耦合在一起的时候,系统的消息会发送给连在一起的系统,但是这个消息有些系统可能是不需要的。所以引入了之后,很方便将这个系统进行解耦,每个系统需要的就在消息队列解耦。

MQ如何选型 ?

在这里插入图片描述

中⼩型公司⾸选RabbitMQ:管理界⾯简单,⾼并发。

⼤型公司可以选择RocketMQ:更⾼并发,可对Rocketmq进⾏定制化开发。
⽇志采集功能,⾸选kafka,专为⼤数据准备。

你们项目中用到过 MQ 吗?谈谈你对 MQ 的理解?

我们项目中使用 MQ 主要是做一些异步的操作,比如说我们的接口是属于 http 协议接口,
它是同步调用,如果说接口响应比较慢的情况下,会导致客户端同步阻塞等待,客户
端同步阻塞等待的情况下,会引发客户端超时,客户端一旦发生超时,就会导致客户端触发
一些重试的策略,而在触发重试的策略过程中会导致业务可能会发生重复执行,所以我们就
需要注意一些幂等性问题,而接口因为它执行比较耗时,所以呢,我们会将一些执行比较耗
时的业务逻辑代码把他直接改成使用 mq 异步去实现,能够提高就是我们的 http 协议接口
的响应速度,比如说异步的去扣库存呢,异步的去发短信呢这些场景下我们都是使用到 MQ
来进行实现落地的。

MQ消费者消费消息的顺序一致性问题?

生产者投递消息过程当中可以设定一个消息 key,相同的业务逻辑呢可以设定一个相同的消息 key 在做 hash 的时候最终都会落地到同一个分区来就行存放,最终就被同一个消费者进行消费,所以想解决消息顺序这些问题,它的核心思想就是,让我们的这个消息投递存放到同一个分区里面,最终被同一个消费者消费。

RabbitMQ如何保证数据⼀致性?

  1. ⽣产者确认机制:消息持久化后异步回调通知⽣产者,保证消息已经发出去;
  2. 消息持久化:设置消息持久化;
  3. 消费者确认机制:消费者成功消费消息之后,⼿动确认,保证消息已经消费。

你们如何解决消息堆积问题?

消息堆积呢是一种常见的问题,尤其是在高并发的场景下,可以说是经常遇到了,生产者投递消息的这个速率,比我们的消费者消费速率明显不匹配,比如说我们最高峰的时候 生产者 它投递消息的时候一次性的 1s 内可能投递到将近几万条消息,但是我们的消费者他只有一个,而消费者消费消息的过程中是单个消费者的消费的速率比较慢,所以当时我们为了解决这个问题我们第一是先将我们的消费者做成集群的形式来进行消费,第二呢每个消费者,他一般都是批量的形式来进行消费,这样的话就可以提高我们的消费者他的消费速率,如果以后我们跟不上的情况呢,我们可以不断的横向扩张,对于我们的消费者不断的做集群,然后批量消费,这样就可以增加我们消费者的消费速率,从而可以解决我们的消息堆积的问题。

RabbitMQ消费者自动扩展数量 ?

SimpleMessageListenerContainer可根据RabbitMQ消息堆积情况⾃动扩展消费者数量。

上千万条消息在mq中积压了几个小时还没解决 ?

  1. 先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉;
  2. 新建⼀个topic,partition是原来的10倍,临时建⽴好原先10倍或者20倍的queue数量;
  3. 然后写⼀个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据;消费之后不做
    耗时的处理,直接均匀轮询写⼊临时建⽴好的10倍数量的queue;
  4. 接着临时征⽤10倍的机器来部署consumer,每⼀批consumer消费⼀个临时queue的数据;
  5. 这种做法相当于是临时将queue资源和consumer资源扩⼤10倍,以正常的10倍速度来消费数据;
  6. 等快速消费完积压数据之后,得恢复原先部署架构,重新⽤原先的consumer机器来消费消息。

如何确保消息正确地发送⾄RabbitMQ?

RabbitMQ使⽤发送⽅确认模式,确保消息正确地发送到RabbitMQ。
发送⽅确认模式:将信道设置成confirm模式(发送⽅确认模式),则所有在信道上发布的消息
都会被指派⼀个唯⼀的ID。⼀旦消息被投递到⽬的队列后,或者消息被写⼊磁盘后(可持久化
的消息),信道会发送⼀个确认给⽣产者(包含消息唯⼀ID)。如果RabbitMQ发⽣内部错误
从⽽导致消息丢失,会发送⼀条nack(not acknowledged,未确认)消息。
发送⽅确认模式是异步的,⽣产者应⽤程序在等待确认的同时,可以继续发送消息。当确认消息
到达⽣产者应⽤程序,⽣产者应⽤程序的回调⽅法就会被触发来处理确认消息。

如何确保消息接收⽅消费了消息?

接收⽅消息确认机制:消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操
作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
这⾥并没有⽤到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也
就是说,只要连接不中断,RabbitMQ给了Consumer⾜够⻓的时间来处理消息。
特殊情况:

  1. 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,
    然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要根据bizId去重)
  2. 如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会
    给该消费者分发更多的消息。

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

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

rabbitmq设置过期时间,部分消息丢失 ?

采取批量重导⽅法:将丢失的那批数据查询导⼊到mq⾥⾯。

如何确保消息不丢失?

消息持久化的前提是:将交换器/队列的durable属性设置为true,表示交换器/队列是持久交换器/
队列,在服务器崩溃或重启之后不需要重新创建交换器/队列(交换器/队列会⾃动创建)。
如果消息想要从Rabbit崩溃中恢复,那么消息必须:

  1. 在消息发布前,通过把它的 “投递模式” 选项设置为2(持久)来把消息标记成持久化
  2. 将消息发送到持久交换器
  3. 消息到达持久队列
    RabbitMQ确保持久性消息能从服务器重启中恢复的⽅式是,将它们写⼊磁盘上的⼀个持久化⽇志
    ⽂件,当发布⼀条持久性消息到持久交换器上时,Rabbit会在消息提交到⽇志⽂件后才发送响应
    (如果消息路由到了⾮持久队列,它会⾃动从持久化⽇志中移除)。⼀旦消费者从持久队列中消
    费了⼀条持久化消息,RabbitMQ会在持久化⽇志中把这条消息标记为等待垃圾收集。如果持久化
    消息在被消费之前RabbitMQ重启,那么Rabbit会⾃动重建交换器和队列(以及绑定),并重播持
    久化⽇志⽂件中的消息到合适的队列或者交换器上。

消息怎么路由?

从概念上来说,消息路由必须有三部分:交换器、路由、绑定。⽣产者把消息发布到交换器上;绑定决
定了消息如何从交换器路由到特定的队列;消息最终到达队列,并被消费者接收。

  1. 消息发布到交换器时,消息将拥有⼀个路由键(routing key),在消息创建时设定。
  2. 通过队列路由键,可以把队列绑定到交换器上。
  3. 消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有
    不同的路由规则)。
  4. 如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进⼊ “⿊
    洞”。

RabbitMQ结构 ?

在这里插入图片描述
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投⼊到⼀个或多个队列。
Binding:绑定,它的作⽤就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进⾏消息投递。
vhost:虚拟主机,⼀个broker⾥可以开设多个vhost,⽤作不同⽤户的权限分离。
producer:消息⽣产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接⾥,可建⽴多个channel,每个channel代表⼀个会话

RabbitMQ交换器有哪些类型?

direct:如果路由键完全匹配,消息就被投递到相应的队列
fanout:如果交换器收到消息,将会⼴播到所有绑定的队列上
topic:可以使来⾃不同源头的消息能够到达同⼀个队列。 使⽤topic交换器时,可以使⽤通配
符,⽐如:“*” 匹配特定位置的任意⽂本, “.” 把路由键分为了⼏部分,“#” 匹配所有规则等。特别
注意:发往topic交换器的消息不能随意的设置选择键(routing_key),必须是由"."隔开的⼀系列
的标识符组成
headers交换器:根据发送消息内容的headers属性进⾏匹配(由于性能很差,不实⽤)

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

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

相关文章

蓝桥杯-单片机类客观题真题解析

2017年第八届(国赛) 选项A 用于中断 选项B code :程序存储区(64KB) idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同,是用类似C中的指针方式访问的。 data:固定指前面0x00-0x7f的128个RAM,可以直接读写的,速度最快,生…

如何降低输电线路在线监控摄像头的功耗呢?

输电线路视频/图像监测装置通过安装在线路杆塔上的摄像头,将线路走廊、通道、杆塔、绝缘子、导线、金具等的图像,经无线公网(4G/3G)传输到监控中心平台上,使管理者和运维人员通过办公电脑,就可实时掌握现场…

内存检测工具Dr.Memory在Windows上的使用

之前在https://blog.csdn.net/fengbingchun/article/details/51626705 中介绍过Dr.Memory,那时在Windows上还不支持x64,最新的版本对x64已有了支持,这里再总结下。 Dr.Memory源码地址https://github.com/DynamoRIO/drmemory,最新发…

计算机网络概念——应用层email协议

1. email的工作方式。电子邮件中有四个重要的组成部分:邮件服务器(电子邮件体系结构的核心,为其用户提供邮箱服务(管理、维护用户报文的服务),并起到邮件服务器间相互通信的作用)、用户代理&…

apisix 初体验

文章目录前言一、参考资料二、安装1.安装依赖2.安装apisix 2.53.apisix dashboard三、小试牛刀3.1 上游(upstream)3.2 路由(route)四、遇到的问题前言 APISIX 是一个微服务API网关,具有高性能、可扩展性等优点。它基于…

JavaEE15-Spring Boot统一功能处理

目录 1.统一用户登录权限效验 1.1.最初用户登录验证 1.2.Spring AOP用户统一登录验证的问题 1.3.Spring拦截器 1.3.1.创建自定义拦截器,实现 HandlerInterceptor 接口并重写 preHandle(执行具体方法之前的预处理)方法 1.3.2.将自定义拦…

2023养老展,CBIAIE第十届中国北京国际老年产业博览会

8月招商季,第十届中国(北京)国际老年产业博览会再次盛大举办; CBIAIE北京国际老年产业博览会位域优势: ——北京,中国首都,世界一线城市,地处中国北部、华北平原北部,东…

安装PhpStorm2020.3

1、卸载旧软件 如果已安装软件,先打开文件安装目录,找到Uninstall.exe点击卸载 删除.jetbrains目录 点击软件“PhpStorm-2020.3.exe”安装 打开软件 打开一个新建的空文件夹,预加载 将BetterIntelliJ.zip拖动到idea的编辑区域 然后…

Python爬虫之Scrapy框架系列(13)——实战ZH小说爬取数据入MySql数据库

目录:1 数据持久化存储,写入Mysql数据库①定义结构化字段:②重新编写爬虫文件:③编写管道文件:④辅助配置(修改settings.py文件):⑤navicat创库建表:⑥ 效果如下&#xf…

Pspice-介绍

根据B站:【PSpice简单入门教程】 https://www.bilibili.com/video/BV19Z4y157tA/?share_sourcecopy_web&vd_sourcec20b4c8e2a733bf3f410c58538211a7f(一)原理图仿真的原因仿真节省经费,比如蒙特卡罗分析,最坏情况…

R语言raster包批量拼接、融合大量栅格图像

本文介绍基于R语言中的raster包,遍历文件夹,读取文件夹下的大量栅格遥感影像,并逐一对每一景栅格图像加以拼接、融合,使得全部栅格遥感影像拼接为完整的一景图像的方法。 其中,本文是用R语言来进行操作的;如…

【MongoDB】多级嵌套数组的操作 含Mongo Shell 和 MongoTemplate的增删改细节

文章目录1.前言2.数据准备3.Mongo Shell操作实践3.1.第一层数组操作3.1.1.新增元素3.1.2.修改元素3.1.2.1.批量修改元素中的坑3.1.3.使用$[<identifier>]做批量修改3.1.4.移除元素3.2.第二层数组操作3.2.1.新增与移除元素3.2.2.修改元素中的字段值3.2.2.1.易错点4.Mongo …

基于yolo的小球位置实时检测

基于yolo的小球位置实时检测 Yolo安装 操作系统&#xff1a;ubuntu 安装cuda和opencv git clone https://github.com/pjreddie/darknet.git cd darknet 修改Makefile文件&#xff0c;使GPU1&#xff0c;OPENCV1 make 2. 数据集处理 2.1 制作数据集 将小球放在摄像头前…

分布式高级篇2 —— 商城业务 (1)

一、商品上架 一、商品上架1、sku 在 ES 中存储模型分析2、nested 嵌套类型3、商品上架业务代码&#xff08;1&#xff09;构建 sku 基本属性&#xff08;2&#xff09;构造 sku 检索属性&#xff08;3&#xff09;远程调用查询库存&#xff08;4&#xff09; 远程调用上架接口…

【干货】Python:time库的用法

【干货】Python&#xff1a;time库的用法1. time库概述2. time库的运用2.1 时间处理2.1.1 time()2.1.2 gmtime()2.1.3 localtime()2.1.4 ctime()2.2 时间格式化2.2.1 mktime()2.2.2 strftime()2.2.3 strptime()2.3 计时3. 习题4. 本文代码编译环境及版本5. 更新日志6. 参考1. t…

【CSS面试题】2023前端最新版css模块,高频15问

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;博主收集的CSS面试题 目录 一、CSS必备面试题 1.CSS3新特性 2.CSS实现元素两个盒子垂…

内网穿透-frp

frp的作用 1.利用处于内网或防火墙后的机器&#xff0c;对外网环境提供 http 或 https 服务。 2.对于 http, https 服务支持基于域名的虚拟主机&#xff0c;支持自定义域名绑定&#xff0c;使多个域名可以共用一个80端口。 3.利用处于内网或防火墙后的机器&#xff0c;对外网环…

【Python】Python学习笔记(二)基本输入输出

Python娘来源&#xff1a;https://next.rikunabi.com/tech/docs/ct_s03600.jsp?p002412 目录print()函数不进行自动换行的print()函数打印输出多个字符串只进行换行input()函数使用format方法格式化字符串字符串与数值转换字符串转换为数值数值转换为字符串总结参考资料print(…

SpringCloud(13)— 分布式缓存(Redis集群)

分布式缓存(Redis集群) 前言 单节点Redis的问题 1.数据丢失 Redis基于内存存储&#xff0c;服务器重启可能会导致数据丢失 2.并发能力 单节点Redis的并发能力虽然已经很不错&#xff0c;但是依然无法满足大型的高并发场景 3.故障恢复 如果Redis宕机&#xff0c;则服务将不…

C# 调用Python

一、简介 IronPython 是一种在 NET 和 Mono 上实现的 Python 语言&#xff0c;由 Jim Hugunin&#xff08;同时也是 Jython 创造者&#xff09;所创造。 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python是…