Java面试题(六)RabbitMQ常见面试题

news2024/11/25 14:24:36

RabbitMQ常见面试题

  • RabbitMQ架构设计
  • RabbitMQ有哪些优点
  • RabbitMQ事物机制
  • RabbitMQ持久化机制
    • 持久化和非持久化
    • 什么时候需要持久化?
    • 落盘过程
    • 文件删除
  • RabbitMQ如何保证消息不丢失
  • RabbitMQ如何保证消息不被重复消费
  • RabbitMQ死信队列,延时队列
    • 死信队列
    • 延时队列
      • 应用场景
  • RabbitMQ如何保证消息的顺序
  • RabbitMQ高可用
  • RabbitMQ跟Kafka区别

RabbitMQ架构设计

在这里插入图片描述

  • Message:消息主体包括消息体和消息头组成,包括属性routing-key,priority,delivery-mode等
  • Publisher:消息生产者,向交换器发布消息的客户端应用程序
  • Exchange:交换器,用来接受生产者发送的消息并将这些消息路由给服务器中的队列,他主要的作业是按照什么规则,路由到哪个队列
  • Routing-key:路由关键字,exchange根据这个进行消息投递到哪个队列
  • Binding:用于队列和交换器之间的关联,一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则
  • Queue:消息的载体,所有消息都会投递到一个或者多个队列,等待消费者连接并消费
  • Connection:网络连接,生产者-MQ-消费者,都是通过TCP连接
  • Channel:信道,每个客户端连接都会建立对应的channel
  • Cconsumer:消费者,和队列连接的客户端程序取出消息
  • Virtual Host:虚拟主机
  • Broker:MQ的服务节点

RabbitMQ有哪些优点

  1. 异步
    如果一个用户下了个订单,首先会扣减库存,然后生成订单,然后调用短信服务发短信,然后调用积分服务增加积分等等操作;如果这些操作是同步执行的话,例如扣库存5ms,创建订单1ms,发短信3ms,积分增减3ms,一共要花12ms;
    如果这个时候使用消息队列的异步操作来实现,用户只需要扣库存和生成订单(6ms),剩余的发短信增减积分的操作交给消息队列来完成,这样就大大提高的请求响应的速度
    在这里插入图片描述

  2. 解耦
    如果现在我们在下单的时候新增2个功能,例如营销服务和数据分析,那么这个时候就不需要改前面订单处理的那块逻辑,只需要新增2个功能,并作为消息的消费者就可以了,实现的功能的解耦
    在这里插入图片描述

  3. 削峰
    如果某一个时间段有大量的请求到后端服务,例如有1W个请求,但是后端只能承受1千个请求,那怎么办?此时可以用mq来实现流量削峰,把这1W个请求放在队列里面按顺序执行,用时间换空间,保证请求能正常执行,只不过是按顺序执行,这样就避免了后端压力过大导致服务崩溃。
    在这里插入图片描述

RabbitMQ事物机制

通过对信道设置事物提交和回滚

//通知服务器开启事物模式
channel.txSelect();
//发送消息
channel.basicPublish
//提交事物
channel.txCommit();
//回滚事物
channel.txRollback();

消费者使用事物

//手动提交ack,以事物提交或回滚为准
aotuAck=false
//不支持事物,事物回滚无效,对了已经删除消息了
aotuAck=true

RabbitMQ持久化机制

持久化和非持久化

  • 队列持久化:通过设置queueDeclare参数来持久化
  • 消息持久化:通过设置MessageProperties.PERSISTENT_PLAIN来实现持久化
  • exchange持久化:通过设置exchangeDeclare来实现持久化

什么时候需要持久化?

  • 只要有消息生产并发给MQ就需要持久化磁盘
  • 内存空间不足,需要将部分内容中的消息持久化到磁盘

落盘过程

  • 写入文件前会先写入Buffer,大小为1M,如果Buffer满了,就会把Buffer数据写入文件
  • 有个固定的刷盘时间,25ms,不管Buffer是否满了,都会每隔25ms把数据刷到磁盘
  • 消息保存在$MNESIA/msg_store_persistent/x.rdq文件中,其中x是一个从1开始的编号,文件大小是16M,超过大小会生成新的文件,文件编号+1,文件格式是
<<Size:64, MsgId:16/binary, MsgBody>>

MsgId:是MQ通过gen生成GUID
MsgBody:包括消息exchange,routing-key,消息内容,消息对应的协议等

文件删除

  • 当所有文件中的已经被删除的的消息比例 大于阀值(GARAAGE_FRACTION=0.5)时会触发文件合并操作,把数据都合到一个文件里面,其余的空文件会删除掉,提高磁盘利用率
  • 当consumer消费完消息后,返回ack确认后,MQ会从文件中删除这条消息,当这个文件没有数据时,或者都是删除的消息时,会删除该文件

RabbitMQ如何保证消息不丢失

  1. 确保消息的生产者发送到MQ
  2. 确保消息路由到正确的队列
  3. 确保消息在队列正确的存储
  4. 确保消息从队列中正确的投递到消费者
    在这里插入图片描述
// 消息发送确认的开关打开
setPublisherConfirms(true);
// 设置消息确认回调方法,发送成功会返回ack
confirmCallback();
//开启消息发送失败通知
setMandatory(true);
//消息路由失败后回调通知
setReturnCallback();

RabbitMQ如何保证消息不被重复消费

先说下哪些情况会造成消息的重复

  1. MQ收到消息后出问题了,宕机或者网络中断,导致生产者并没有收到确认消息,生产者会再次发送消息给MQ,直到返回确认消息
  2. MQ因负载过高,返回成功消息的时候超时,这是生产者会再次发送消息
  3. MQ把消息投递给消费者,此时消费者出问题了,宕机或者网络中断,没有返回确认结果,所以MQ会重复投递,直到消费者返回确认消息
  4. MQ把消息投递给消费者后,MQ宕机或者网络中断了,此时MQ重启后会重新投递消息造成消息重复

那么如何解决重复消费问题呢?

  1. 可以通过乐观锁机制,每次消息消费的时候带上一个版本号,消费者处理的时候每次都会比较版本号
  2. 去重表:利用数据库的唯一索引来保证数据的唯一性,例如订单ID每次处理订单消息的就存到这个去重表里面,如果有重复的订单ID进来,在去重表里面就重复,就不会执行了,解决了重复消费的问题

RabbitMQ死信队列,延时队列

死信队列

  • 消息被consumer消费后,返回了nack信息,并且队列的requeue属性被设置为false,消息就会投递到死信队列
  • 消息在队列中的存活时间超过设置的TTL时间
  • 消息队列的消息数量已经超过最大队列长度

如果没有妹纸死信队列,那这些消息会被丢弃的
只需要配置一个死信将换机,然后分配单独的routing-key,然后绑定到对应的死信队列,这样死信队列里面的消息就不会被丢弃

延时队列

应用场景

  • 购买火车票下单后30分钟支付
  • 预定会议室后,提前5分钟发送提醒参会

MQ并没有延时队列的功能,只不过可以通过设置消息的TTL时间,来实现所谓的延时消息,现在有个订单,30分钟后支付成功并扣库存,清空购物车,此时就可以把消息的过期时间设置为30分钟,30分钟过期之后会进入私信队列,然后我们把死信队列提前配置好,对死信队列中的消息进行处理就行,从而实现了延时30分钟处理的功能

RabbitMQ如何保证消息的顺序

例如现在有一个队列,对应3个consumer,那么假如现在有3个消息(msg1,msg2,msg3)投递到3个 consumer上,此时如果msg2被先消费,那么就会造成顺序错乱,这显然是不允许的,那么应该怎么解决呢?

可以创建3个队列,对应3个consumer,那么每个消费者对应固定的队列,也就是1个队列对应一个消费者,然后每个队列的里面消息都是按顺序执行,按照list来排队

RabbitMQ高可用

  • 单机模式:就是一个节点,这种基本不会在生产环境中使用
  • 普通集群模式:就是所有节点只有其中一个节点的队列会有数据,其他的节点是没有数据的,这样做的优点是节省了存储空间,但是也降低了服务的可用
  • 镜像模式:所有节点都会复制队列的数据,这样每个节点的数据都一样,一旦主节点挂了,从节点就会切换成主节点
  • 主备模式:一个节点处于服务状态,另一个备用,一旦主服务挂了,备用就切换成主服务

RabbitMQ跟Kafka区别

  • RabbitMQ:是Erlang语言开发,轻量级,开箱即用的特点,非常容易使用和部署,社区活跃,支持编程语音比较多。缺点是消息如果堆积的比较多的话性能会下降,相比于Kafka的处理性能也很一般,每秒只能处理几万到十几万消息,还有就是二次扩展开发成本高,因为是Erlang语言开发的

  • Kafka:依赖Zookeeper,兼容性比较好,性能最高,支持扩展,Scaka和Java开发;缺点是Kafka会有消息延时,就是消息不会立马发送出去,而是攒一波消息一起发送出去

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

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

相关文章

如何使用 ChatGPT 进行教学,教师可以利用 ChatGPT 的 5 种方式

我们听说过很多关于学生如何使用 ChatGPT 撰写论文和布置家庭作业的信息。 我们一直在讨论围绕这个问题的担忧,并争先恐后地为 ChatGPT 寻找 AI 检测工具,据传 OpenAI 也在致力于此。 但是关于教师如何将 ChatGPT 用于他们自己的工作的讨论并不多。 在从教师的角度对 Chat…

20221222 Coppeliasim的视频导出功能

Video exporter CoppeliaSim的视频记录器可以对the page, scene hierarchy and model browser areas进行录屏&#xff0c;保存成视频文件。Dialogs, menu bar, toolbars and popup menus &#xff08;对话框、菜单栏、工具栏和弹出菜单&#xff09;不会被录进去. 默认情况下&am…

【C++11】包装器

目录 1.function包装器 1.1什么是函数包装器(function)&#xff1f; 1.2为啥使用函数包装器(function)&#xff1f; 2.bind包装器 2.1绑定普通函数和调整传参顺序 2.2绑定类成员函数 1.function包装器 头文件#include<functional> 1.1什么是函数包装器(function)&a…

2022年终总结

不知不觉就到了年末&#xff0c;感叹时间过的真快。 我自己坚持写了七年多的博客&#xff0c;但这其实是我第一次去写年终总结。也不知道怎么写&#xff0c;就简单聊聊。 写博客的初衷就是个人收获&#xff0c;学习的记录&#xff0c;分享出来如果能帮到别人那就更好了。毕竟…

(一)LTspice简介2

文章目录前言一、LTspice的仿真过程二、spice的模型三、LTspice的工具栏和快捷键四、LTspice中的数量级前言 上一节我们学习了LTspice的安装&#xff0c;很简单&#xff0c;无脑安装 &#xff08;一&#xff09;LTspice安装 这一节我们继续学习LTspice的简介&#xff0c;主要包…

题:A-B 数对(二分)

A-B 数对 - 洛谷 题目背景 出题是一件痛苦的事情&#xff01; 相同的题目看多了也会有审美疲劳&#xff0c;于是我舍弃了大家所熟悉的 AB Problem&#xff0c;改用 A-B 了哈哈&#xff01; 题目描述 给出一串正整数数列以及一个正整数 CC&#xff0c;要求计算出所有满足 A…

通过Wireshark分析Apache服务器的SSL协议工作过程

文章目录一、实验环境二、为Apache服务器启用SSL1.获取SSL证书2.修改httpd.conf配置文件3.修改httpd-ssl.conf配置文件4.启动Apache服务三、SSL/TLS工作过程分析一、实验环境 操作系统&#xff1a;macOS Ventura 13.0.1 Apache&#xff1a;Apache/2.4.54 (Unix)&#xff0c;此…

喜提JDK的BUG一枚、多线程的情况下请谨慎使用这个类的stream遍历。

前段时间在 RocketMQ 的 ISSUE 里面冲浪的时候&#xff0c;看到一个 pr&#xff0c;虽说是在 RocketMQ 的地盘上发现的&#xff0c;但是这个玩意吧&#xff0c;其实和 RocketMQ 没有任何关系。 纯纯的就是 JDK 的一个 BUG。 我先问你一个问题&#xff1a;LinkedBlockingQueue…

vue3 antd table表格的样式修改(二)利用rowClassName给table添加行样式

vue3 antd项目实战——修改ant design vue组件中table表格的默认样式&#xff08;二&#xff09;知识调用场景复现修改table表格的行样式一、rowClassName添加行样式二、表格的不可控操作写在最后知识调用 文章中可能会用到的知识链接vue3ant design vuets实战【ant-design-vu…

Autosar MCAL-SPI配置及使用

文章目录前言SPI协议基础Autosar SPI专有名词SpiDriverSpiChannelSpiChannelIdSpiChannelTypeSpiDataWidthSpiDefaultDataSpiEbMaxLengthSpiIbNBuffersSpiTransferStartSpiExternalDeviceSpiBaudrateSpiAutoCalcBaudParamsSpiCsIdentifierSpiCsPolaritySpiCsSelectionSpiDataSh…

前端工程师可以分成 4 种,你属于哪一种?

在这篇文章中&#xff0c;探讨四种常见的前端工程&#xff0c;1&#xff09;产品工程师&#xff0c;2&#xff09;UI 基建工程师&#xff0c;3&#xff09;设计师&#xff0c;4&#xff09;工具基建工程师&#xff0c;你属于哪一种&#xff1f; 产品工程师 产品工程师负责公司…

6.s081 学习实验记录(二)xv6 and unix utilities

文章目录一、boot xv6二、sleep三、pingpong四、primes五、find六、xargs该实验主要用来熟悉xv6以及其系统调用 一、boot xv6 实验目的&#xff1a; 启动xv6系统&#xff0c;并使用提供的命令ls&#xff0c;列出系统所有的文件ctrl p&#xff0c;打印当前运行的进程ctrl a…

Ubuntu22.04使用kubeadm安装k8s 1.26版本高可用集群

目录阿里云ACK集群的架构ACK实例的创建过程如下安装前的准备主机规划基线准备所有k8s master、worker节点安装kubeadmkubectlkubelet创建集群负载均衡器HAproxy安装keepalived 和haproxy配置haproxy配置keepalivedkubeadm部署第一台master节点Calico网络组件一键安装安装完成阿…

mPEG-Biotin,甲氧基-聚乙二醇-生物素科研实验用试剂

​​ 英文名称&#xff1a;mPEG-Biotin 中文名称&#xff1a;甲氧基-聚乙二醇-生物素 mPEG生物素可通过与链霉亲和素和抗生物素结合进行聚乙二醇化&#xff0c;具有高亲和力和特异性。生物素通过稳定的酰胺连接物与线性PEG结合。 提示&#xff1a;避免频繁的溶解和冻干&…

node.js+uni计算机毕设项目基于微信的同学会小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

GraphQL在Django中的使用

简介 特点 请求你所要的数据&#xff0c;不多不少获取多个资源&#xff0c;只用一个请求描述所有的可能&#xff0c;类型系统几乎所有语言支持 谁在用 文档 Graphene-PythonGraphQL | A query language for your API 背景 传统restful的接口定义类型多&#xff0c;试图简…

WordPress 添加百度主动推送代码,加速网站收录保护原创文章

WordPress是世界上使用人数最多开源程序之一&#xff0c;它的优点有很多&#xff0c;譬如&#xff0c;简单易用、样式丰富&#xff0c;模板众多&#xff0c;安全性能高&#xff0c;对搜索引擎友好&#xff0c;收录快、扩展性强&#xff0c;功能强大等等&#xff0c;其中我最喜欢…

JVM的类加载机制

一、类加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内****&#xff0c;然后在堆区创建一个java.lang.Class对象&#xff0c;用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象&…

六、应用层(三)文件传输协议(FTP)

将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中&#xff0c;是一项基本的网络应用&#xff0c;即文件传送。 文件传送协议FTP&#xff08;File Transfer Protocal&#xff09;是因特网上使用得最广泛的文件传送协议。 FTP提供交互式的访问&#xff0c;允许…

欢祝圣诞——北斗星的爱!

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ ★★给大家推荐两首我很喜欢的歌曲&#xff0c;第一首是标题同名歌曲&#xff1a;1.张杰的《北斗星的爱》&#xff1b;另一首是&#xff1a;2.张杰的《星星》&#xff0c;这两首歌真的很震撼很好听&#xff01; 我…