RabbitMq相关面试题
文章目录
- 消息队列有没有接触过? 简单介绍一下?
- 消息中间件模式分类 ?
- 使用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如何保证数据⼀致性?
- ⽣产者确认机制:消息持久化后异步回调通知⽣产者,保证消息已经发出去;
- 消息持久化:设置消息持久化;
- 消费者确认机制:消费者成功消费消息之后,⼿动确认,保证消息已经消费。
你们如何解决消息堆积问题?
消息堆积呢是一种常见的问题,尤其是在高并发的场景下,可以说是经常遇到了,生产者投递消息的这个速率,比我们的消费者消费速率明显不匹配,比如说我们最高峰的时候 生产者 它投递消息的时候一次性的 1s 内可能投递到将近几万条消息,但是我们的消费者他只有一个,而消费者消费消息的过程中是单个消费者的消费的速率比较慢,所以当时我们为了解决这个问题我们第一是先将我们的消费者做成集群的形式来进行消费,第二呢每个消费者,他一般都是批量的形式来进行消费,这样的话就可以提高我们的消费者他的消费速率,如果以后我们跟不上的情况呢,我们可以不断的横向扩张,对于我们的消费者不断的做集群,然后批量消费,这样就可以增加我们消费者的消费速率,从而可以解决我们的消息堆积的问题。
RabbitMQ消费者自动扩展数量 ?
SimpleMessageListenerContainer可根据RabbitMQ消息堆积情况⾃动扩展消费者数量。
上千万条消息在mq中积压了几个小时还没解决 ?
- 先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉;
- 新建⼀个topic,partition是原来的10倍,临时建⽴好原先10倍或者20倍的queue数量;
- 然后写⼀个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据;消费之后不做
耗时的处理,直接均匀轮询写⼊临时建⽴好的10倍数量的queue; - 接着临时征⽤10倍的机器来部署consumer,每⼀批consumer消费⼀个临时queue的数据;
- 这种做法相当于是临时将queue资源和consumer资源扩⼤10倍,以正常的10倍速度来消费数据;
- 等快速消费完积压数据之后,得恢复原先部署架构,重新⽤原先的consumer机器来消费消息。
如何确保消息正确地发送⾄RabbitMQ?
RabbitMQ使⽤发送⽅确认模式,确保消息正确地发送到RabbitMQ。
发送⽅确认模式:将信道设置成confirm模式(发送⽅确认模式),则所有在信道上发布的消息
都会被指派⼀个唯⼀的ID。⼀旦消息被投递到⽬的队列后,或者消息被写⼊磁盘后(可持久化
的消息),信道会发送⼀个确认给⽣产者(包含消息唯⼀ID)。如果RabbitMQ发⽣内部错误
从⽽导致消息丢失,会发送⼀条nack(not acknowledged,未确认)消息。
发送⽅确认模式是异步的,⽣产者应⽤程序在等待确认的同时,可以继续发送消息。当确认消息
到达⽣产者应⽤程序,⽣产者应⽤程序的回调⽅法就会被触发来处理确认消息。
如何确保消息接收⽅消费了消息?
接收⽅消息确认机制:消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操
作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
这⾥并没有⽤到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也
就是说,只要连接不中断,RabbitMQ给了Consumer⾜够⻓的时间来处理消息。
特殊情况:
- 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,
然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要根据bizId去重) - 如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会
给该消费者分发更多的消息。
如何避免消息重复投递或重复消费?
在消息⽣产时,MQ内部针对每条⽣产者发送的消息⽣成⼀个inner-msg-id,作为去重和幂等的依
据(消息投递失败并重传),避免重复的消息进⼊队列;在消息消费时,要求消息体中必须要有
⼀个bizId(对于同⼀业务全局唯⼀,如⽀付ID、订单ID、帖⼦ID等)作为去重和幂等的依据,避
免同⼀条消息被重复消费。
rabbitmq设置过期时间,部分消息丢失 ?
采取批量重导⽅法:将丢失的那批数据查询导⼊到mq⾥⾯。
如何确保消息不丢失?
消息持久化的前提是:将交换器/队列的durable属性设置为true,表示交换器/队列是持久交换器/
队列,在服务器崩溃或重启之后不需要重新创建交换器/队列(交换器/队列会⾃动创建)。
如果消息想要从Rabbit崩溃中恢复,那么消息必须:
- 在消息发布前,通过把它的 “投递模式” 选项设置为2(持久)来把消息标记成持久化
- 将消息发送到持久交换器
- 消息到达持久队列
RabbitMQ确保持久性消息能从服务器重启中恢复的⽅式是,将它们写⼊磁盘上的⼀个持久化⽇志
⽂件,当发布⼀条持久性消息到持久交换器上时,Rabbit会在消息提交到⽇志⽂件后才发送响应
(如果消息路由到了⾮持久队列,它会⾃动从持久化⽇志中移除)。⼀旦消费者从持久队列中消
费了⼀条持久化消息,RabbitMQ会在持久化⽇志中把这条消息标记为等待垃圾收集。如果持久化
消息在被消费之前RabbitMQ重启,那么Rabbit会⾃动重建交换器和队列(以及绑定),并重播持
久化⽇志⽂件中的消息到合适的队列或者交换器上。
消息怎么路由?
从概念上来说,消息路由必须有三部分:交换器、路由、绑定。⽣产者把消息发布到交换器上;绑定决
定了消息如何从交换器路由到特定的队列;消息最终到达队列,并被消费者接收。
- 消息发布到交换器时,消息将拥有⼀个路由键(routing key),在消息创建时设定。
- 通过队列路由键,可以把队列绑定到交换器上。
- 消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有
不同的路由规则)。 - 如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进⼊ “⿊
洞”。
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属性进⾏匹配(由于性能很差,不实⽤)
相关文章:
RabbitMq相关面试题
文章目录消息队列有没有接触过? 简单介绍一下?消息中间件模式分类 ?使用MQ有什么好处?MQ如何选型 ?你们项目中用到过 MQ 吗?谈谈你对 MQ 的理解?MQ消费者消费消息的顺序一致性问题?R…...
树莓派开机自启动Python脚本或者应用程序
树莓派开机自启动Python脚本或者应用程序前言一、对于Python脚本的自启动方法1、打开etc/rc.local文件2、编辑输入需要启动的指令3、重启树莓派验证二、对于需要读写配置文件的应用程序的自启前言 在树莓派上写了一些Python脚本,还有一个java 的jar包想要在树莓派上…...
全国青少年编程等级考试scratch四级真题2022年9月(含题库答题软件账号)
青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手1、运行下列程序,说法正确的是?( )A.列表…...
NodeJS与npm版本不一致时降级npm的方法
首先查看 Node.js 与 npm 版本对应关系:Node.js与npm版本查看。 安装 cnpm: npm install -g cnpm 查看一下 npm 和 cnpm 的镜像: npm config get registry cnpm config get registry 2 如果不是 https://registry.npm.taobao.org/ 的话就修…...
《C++ Primer Plus》第16章:string类和标准模板库(8)
关联容器 关联容器(associative container)是对容器概念的另一个改进。关联容器将值与键关联在一起,并使用键来查找值。例如,值可以表示雇员信息(如姓名、地址、办公室号码、家庭电话和工作电话、健康计划等ÿ…...
Linux安装达梦8数据库
Linux安装达梦8数据库 服务器系统:centos7 数据库版本:达梦8 先获取安装包:https://eco.dameng.com/download/?_blank 选择相应版本下载,下载完解压之后会得到一个iso文件,把他上传到服务器上,建议上传到/opt目录下…...
[数据库]初识数据库
●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…...
Redis的缓存雪崩、击穿、穿透和解决方案
2.5 缓存穿透问题的解决思路 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护…...
52000000
选择题(共52题,合计52.0分) 1. 敏捷团队在项目执行过程中会用到一种叫做“看板”的可视化工具,它可显示WIP, 帮助识别瓶颈和过度承诺, 从而使团队能够优化工作流。请从下列选项中选择WIP的最佳解释?() A 等待初步加工的材料的库存 B 目前正…...
内网资源探测
✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :内网安全 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是…...
Java后端内部面试题(前一部分)
面试题 基础篇 1、Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) 2、面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把…...
关于如何抄引擎源码
前两天,后台有网友发私信给我,问我如何抄引擎源码。我一愣,感觉像吃饭喝水一样自然。 抄源码的好处就不说了,抄之前不懂的内容,抄完后就懂了,至少懂一部分了。当然也可以只读不抄,不过ÿ…...
差分模拟信号转单端输出电路设计
需求分析: 1.差分输入0~16V -Vpp电压量; 2.输入频率0~1.2KHz; 3.单端对应输出0~3V的模拟量; 4.输出频率对应0~1.2KHz; 5.供电范围3~5V。 针对以上需求,设计如下图所示电路。 1.电路功能: …...
Java中的clone方法
注解定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注可以被嵌入到字节码中。注解的分类:内置注解Override :重写方法,引用时没有该方法时会编译错误public class …...
数据结构—二叉树、完全二叉树的性质
# 1 若一棵度为4的树中度为1、2、3、4的结点个数分别为4、3、2、2,则该树的总结点个数是多少? 正确答案: 答案:结点总数nn0n1n2n3n4,又由于除根结点外,每个结点都对应一个分支,所以总的分支数等…...
JDBC编程复习
文章目录JDBC1.概念2.原理3. 如何使用JDBC编程1. 下载mysql的jdbc驱动2. 项目中引入驱动4. JDBC使用1. 和数据库建立连接2.获取连接3. Statement对象4. 释放资源JDBC 1.概念 JDBC,即Java Database Connectivity,java数据库连接。是Java提供的API用来执行SQL语句&a…...
c++基础入门二
一、数组的引用int main() {int a 10, b 20;int ar[10] { 1,2,3,4,6,7 };int& x ar[0];int& p[5] ar;//errorint(&p)[10] ar;//引用整个数组的大小sizeof(ar)int(*p)[10] &ar;//typesize表示整个数组//只有在这三种情况下代表整个数组,其他情…...
企业数字化转型的产品设计思路
数字化转型的核心是全面重塑企业的管理模式和经营模式,是迈向数字经济时代的方式。一、到底什么是数字化转型?数字化转型并不神秘。数字化转型是一种经营方式、一种经营理念,是将企业相关的人、物料、设备、资金等要素进行系统运转࿰…...
Linux日志分析常用命令
一:常用命令1、tail参数: tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ] 参数说明: -f 该参数用于监视File文件增长。 -c Number 从 Number 字节位置读取指定文件 -n Number 从 Number 行位置读取指…...
Allegro如何使用Snake命令走蛇形线操作指导
Allegro如何使用Snake命令走蛇形线操作指导 在做PCB设计的时候,遇到不规则BGA的时候,蛇形走线是惯用的走线方式,类似下图 Allegro支持蛇形走线,具体操作如下 首先把过孔打好,尽量上下左右间距一致,不容易出现偏差,如下图在Command命令栏下方输入snake,然后回车...
在 Eclipse 中创建 Maven 项目
1.在 Eclipse 中配置 MavenEclipse 中默认自带 Maven 插件,但是自带的 Maven 插件不能修改本地仓库,所以通常我们不使用自带的 Maven ,而是使用自己安装的,在 Eclipse 中配置 Maven 的步骤如下: 1) 点击 Eclipse 中的 …...
flex 布局相关属性的使用
简单概述 为元素添加 display:flex; 的属性后,当前元素被视为弹性布局的盒子容器(box),其子元素被视为弹性布局项目(item)。item 会在 box 内灵活布局,解决了对齐、分布、尺寸等响应式问题。 演示 demo <template><div class&quo…...
【C++】类和对象(第一篇)
文章目录1. 面向过程和面向对象初步认识2.类的引入3.类的定义3.1 类的两种定义方式3.2 成员变量命名规则建议4. 类的访问限定符及封装4.1 访问限定符4.2 封装5. 类的作用域6. 类的实例化7. 类对象模型7.1 类对象大小的计算7.2 类对象的存储方式猜测7.3 结构体内存对齐规则复习8…...
springboot 接入websocket实现定时推送消息到客户端
目录说明代码实现说明 如标题,举例需求场景: 前端与后端websocket连接上后,多用户登录,后端根据不同用户定时发消息给前端用于展示 代码实现 1、 <dependency><groupId>org.springframework.boot</groupId>…...
虚拟机磁盘重新分区增加Docker磁盘空间
目录一、简介二、重新分区 挂载目录2.1 增加虚拟机硬盘空间2.2 重新分区2.3 格式化新分区2.4 挂载docker目录三、重新拉取一、简介 今天在使用docker pull 拉取镜像时,报了no such file or directory的信息,原来是Docker的磁盘空间满了 #查看Docker Roo…...
Java开发学习(四十八)----MyBatisPlus删除语句之逻辑删除
1、逻辑删除 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多个合同,是一个一(员工)对多(合同)的表 员工ID为1的张业绩,总共签了三个合同&a…...
RabbitMq
一、四大核心概念生产者:产生数据发送消息的程序是生产者交换机:交换机是RabbitMQ非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这…...
Qt学习笔记
文章目录一、C指针函数驼峰命名法、下划线命名法编程报错二、C三、Qt语法Qt历史、Qt应用Qt特色快捷键Qt类的族谱QWidgetQPushButtonQDebug对象树Qt窗口坐标信号和槽Qt自带的信号的槽自定义的信号和槽Qt4版本 vs Qt5版本 的connect写法函数指针解决重载问题拓展类型转换QString …...
洛谷——P1091 合唱队形
【题目描述】 n 位同学站成一排,音乐老师要请其中的 n−k 位同学出列,使得剩下的 k 位同学排成合唱队形。 合唱队形是指这样的一种队形:设 kk 位同学从左到右依次编号为 1,2, … ,k,他们的身高分别为,, … ,,则…...
使用logstash把mysql同步到es,Kibana可视化查看
1:首先需要电脑本地有es环境,并且要牢记版本后,后续安装的logstash和Kibana一定要版本对应 查看es版本:http://localhost:9200/ 2:安装对应版本的logstash:找到自己对应ES版本,然后解压 Logst…...
公司网站建设的定位语要怎么取/网站建设关键词排名
原因 之前有文件没有正常关闭分析 用vim打开一个文件时,会产生一个cmd.swap文件,用于保存数据。 当文件非正常关闭时,可用此文件来恢复。 当文件正常关闭时,此文件会被删除。当文件非正常关闭时,不会被删除,…...
自学网课程设置/搜索引擎优化关键词
Django框架下多国语言支持设置,步骤如下:1、安装GNU gettext toolsDjango是通过gettext组建支持多国语言的,因此需要安装下载地址为:http://mlocati.github.io/gettext-iconv-windows/ window平台下载Binaries版本(编译…...
企业门户网站开发价格/5118和百度指数
本文实例讲述了Python实现的圆形绘制。分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 import numpy as np import matplotlib.pyplot as plt # # 圆的基本信息 # 1.圆半径 r 2.0 # 2.圆心坐标 a, b (0., 0.) # # 方法一&#x…...
网站没有设置关键词/google推广技巧
在模拟和数字PCB设计中,旁路或去耦电容(0.1uF)应尽量靠近器件放置。供电电源去耦电容(10uF)应放置在电路板的电源线入口处。所有情况下,这些电容的引脚都应较短。 在模拟布线设计中,旁路电容通常用于旁路电源上的高频信号,如果不加…...
删掉cache wordpress/万网域名查询官网
原文 对于我们CSS开发者来说经常听到一些关于LESS和SASS的信息,但是我们并不知道这都是什么意思,这篇文章就是为我们而准备的.在调查这些语言后,我已经发现它们都是一些js文件,运行后会产生相应CSS文件给我们.为什么我们要使用LESS和SASS它们呢,因为我们可以避免CSS中需要的重复…...
html5怎末做意见反馈网站/微博热搜榜排名今日
gzip 讲解语法:gzip [-d#] filename 其中#为1-9的数字-d:解压缩时使用-#:压缩等级,1 压缩最差,9 压缩最好,6 为默认[rootlocalhost ~]# [ -d test ] && rm -rf test [rootlocalhost ~]# mkdir test…...