Java面试——RabbitMQ系列总结

1.RabbitMQ是什么?

RabbitMQ是一款开源的,Erlang编写的,基于AMQP(高级消息队列协议)协议的消息中间件。

2.为什么要使用消息队列?

从本质上来说是因为互联网的快速发展,业务不断扩张,促使技术架构需要不断的演进。

从以前的单体架构到现在的微服务架构,成百上千的服务之间相互调用和依赖。从互联网初期一个服务器上有 100 个在线用户已经很了不得,到现在坐拥10亿日活的微信。此时,我们需要有一个「工具」来解耦服务之间的关系、控制资源合理合时的使用以及缓冲流量洪峰等等。因此,消息队列就应运而生了。

它常用来实现:异步处理服务解耦流量控制(削峰)

3.说说RabbitMQ中的几大组件

img

  • Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker。
  • Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等。
  • Connection:publisher/consumer 和 broker 之间的 TCP 连接Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。 l Channel 作为轻量级的Connection 极大减少了操作系统建立 TCP connection 的开销。
  • Exchange : message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout(multicast)。
  • Queue : 消息最终被送到这里等待 consumer 取走。
  • Binding : exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。
  • Producer:消息生产者,就是投递消息的一方。消息一般包含两个部分:消息体(payload)和标签(Label)。
  • Consumer:消费消息,也就是接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签。

4.消息队列有什么优缺点?

优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。缺点有以下几个:

  • 系统可用性降低:系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩 溃,你不就完了?
  • 系统复杂度提高:硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?
  • 怎么保证消息传递的顺序性?问题一大堆。
  • 一致性问题:A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致 了。

5.如何保证消息的可靠性?

消息到MQ的过程中搞丢,MQ自己搞丢,MQ到消费过程中搞丢。

生产者到RabbitMQ:事务机制和Confirm机制,注意:事务机制和 Confirm 机制是互斥的,两者不能共存,会导致 RabbitMQ 报错。

RabbitMQ自身:持久化、集群、普通模式、镜像模式。

RabbitMQ到消费者:basicAck机制、死信队列、消息补偿机制。

6.RabbitMQ中常见交换机类型有哪些?

  • fanout:把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
  • direct:把消息路由到BindingKey和RoutingKey完全匹配的队列中。
  • topic:
RoutingKey` 为一个 点号'.': 分隔的字符串。比如: `szh.name.love

BindingKeyRoutingKey一样也是点号“.“分隔的字符串。

BindingKey可使用 * 和 # 用于做模糊匹配,*匹配一个单词,#匹配多个或者0个

7.生产者发送消息的过程是怎样的?

  1. Producer先连接到Broker,建立连接Connection,开启一个信道(Channel)。
  2. Producer声明一个交换器并设置好相关属性。
  3. Producer声明一个队列并设置好相关属性。
  4. Producer通过路由键将交换器和队列绑定起来。
  5. Producer发送消息到Broker,其中包含路由键、交换器等信息。
  6. 相应的交换器根据接收到的路由键查找匹配的队列。
  7. 如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者。
  8. 关闭信道,关闭连接。

8.消费者接收消息的过程是怎样的?

  1. Producer先连接到Broker,建立连接Connection,开启一个信道(Channel)。
  2. Broker请求消费响应的队列中的消息,可能会设置响应的回调函数。
  3. 等待Broker回应并投递相应队列中的消息,接收消息。
  4. 消费者确认收到的消息,ack
  5. RabbitMQ从队列中删除已经确定的消息。
  6. 关闭信道,关闭连接。

9.交换机无法根据自身类型和路由键找到符合条件队列时,有哪些处理方法?

  • mandatory :true 返回消息给生产者。
  • mandatory : false 直接丢弃。

10.什么是死信队列?导致死信的原因有哪些?

死信,DLX,全称为 Dead-Letter-Exchange,死信交换器,死信邮箱。顾名思义就是无法被消费的消息,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。

  • 消息 TTL 过期
  • 队列达到最大长度 (队列满了,无法再添加数据到 mq 中)
  • 消息被拒绝 (basic.reject 或 basic.nack) 并且 requeue=false.

11.什么是延迟队列?使用场景有哪些?

存储对应的延迟消息,指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

  1. 订单在十分钟之内未支付则自动取消。
  2. 新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。
  3. 用户注册成功后,如果三天内没有登陆则进行短信提醒。
  4. 用户发起退款,如果三天内没有得到处理则通知相关运营人员。
  5. 预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议

12.什么是优先级队列?

  • 优先级高的队列会先被消费。
  • 可以通过 x-max-priority参数来实现。
  • 当消费速度大于生产速度且Broker没有堆积的情况下,优先级显得没有意义。

13.RabbitMQ中的事务机制?

RabbitMQ 客户端中与事务机制相关的方法有三个:

channel.txSelect 用于将当前的信道设置成事务模式。

channel.txCommit 用于提交事务 。

channel.txRollback 用于事务回滚,如果在事务提交执行之前由于 RabbitMQ 异常崩溃或者其他原因抛出异常,通过txRollback来回滚。

14.RabbitMQ中的发送确认机制?

生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式, 所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了。

15.如何保证RabbitMQ消息队列的高可用?

RabbitMQ 有三种模式:单机模式普通集群模式镜像集群模式

单机模式:就是demo级别的,一般就是你本地启动了玩玩儿的,没人生产用单机模式

普通集群模式:意思就是在多台机器上启动多个RabbitMQ实例,每个机器启动一个。

镜像集群模式:这种模式,才是所谓的RabbitMQ的高可用模式,跟普通集群模式不一样的是,你创建的queue,无论元数据(元数据指RabbitMQ的配置数据)还是queue里的消息都会存在于多个实例上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。

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

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

相关文章

商城系统php功能模块,yershop商城系统的支付模块问题

这个商城系统是用ThinkPHP框架进行开发的,但是有很多毛病就不吐槽了。最崩溃的毛病是商城的核心功能??支付功能有语法错误导致无法支付。如图:求教大神,这该怎么改,纠结了好久好久。。。。。在这里数组中使用C方法就报错。代码片…

php ini 长连接秒数,php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据...

$address "127.0.0.1";$port 9090; //调试的时候,可以多换端口来测试程序!set_time_limit(0);$sock socket_create(AF_INET, SOCK_STREAM, SOL_TCP);socket_set_block($sock);socket_bind($sock, $address, $port);socket_listen($sock, 4)…

php swoole udp,基于Swoole如何搭建UDP服务?

本节将会讲解如下2个问题:通过Swoole如何搭建UPD服务?对比TCP和UDP有什么不同?01通过Swoole如何搭建UPD服务新建一个文件命名为 udp_server.php,代码如下:在命令行执行如下命令就可以开启TCP服务:php udp_s…

php net-snmp trap,Net-snmp:接收Trap的api

Net-snmp:接收Trap的apiNet-snmp:接收Trap的apinet-snmp使用的是snmptrapd来接收trap,我想自己写程序接收trap,也看了snmptrapd.c代码,很繁琐。有没有更简单一点的例子。net-snmp作为管理端功能有点欠缺,可以使用snmp毕业论文-- B…

SpringBoot引入本地jar包

1.引入本地jar包并通过maven打包成jar包 第一步&#xff1a;创建lib包&#xff0c;将所需的本地jar包导入 第二步&#xff1a;在pom文件中引导路径 <dependency><groupId>com.penn</groupId><artifactId>excleutil</artifactId><version&g…

“2021-01-30T16:00:00.000Z“: expected format “yyyy-MM-dd HH:mm:ss“时间戳格式化

“2021-01-30T16:00:00.000Z”&#xff1a; T表示分隔符&#xff0c;Z表示的是UTC. UTC&#xff1a;世界标准时间&#xff0c;在标准时间上加上8小时&#xff0c;即东八区时间&#xff0c;也就是北京时间。 例如 &#xff1a; 北京时间&#xff1a;2021-01-31 00:00:00对应的国…

MyBatis JdbcType介绍

MyBatis JdbcType介绍 JdbcType介绍 数据库列字段都是有类型的&#xff0c;不同的数据库有不同的类型。为了表示这些数据类型&#xff0c;Java源码是采用枚举来定义的&#xff1a; public enum JDBCType implements SQLType {TINYINT(Types.TINYINT),SMALLINT(Types.SMALLIN…

php 物联网应用,蜂窝物联网的概念以及应用

所谓蜂窝物联网&#xff0c;就是蜂窝移动通信网物联网相结合的发展产物。如今蜂窝移动通信网络已经发展30多年了&#xff0c;高高的通信铁塔拔地而起&#xff0c;随处可见&#xff0c;比工业时代的烟囱可多多了&#xff0c;象征着辉煌的信息时代。蜂窝物联网建设原则 本期工程要…

JSONObject.parseObject()

java获取json中某个字段 import com.alibaba.fastjson.JSONObject; public class JsonTest {public static void main(String[] args) {// json串(以自己的为准)String str "{"id":"75","shoppingCartItemList":[{"id":"4…

python批量图片转pdf,用python 制作图片转pdf工具

最近因为想要看漫画&#xff0c;无奈下载的漫画是jpg的格式&#xff0c;网上的转换器还没一个好用的&#xff0c;于是乎就打算用python自己DIY一下&#xff1a;这里主要用了reportlab。开始打算随便写几行&#xff0c;结果为若干坑纠结了挺久&#xff0c;于是乎就想想干脆把代码…

Java中如何遍历Map对象的4种方法

在Java中如何遍历Map对象 *How to Iterate Over a Map in Java* 在java中遍历Map有不少的方法。我们看一下最常用的方法及其优缺点。 既然java中的所有map都实现了Map接口&#xff0c;以下方法适用于任何map实现&#xff08;HashMap, TreeMap, LinkedHashMap, Hashtable, 等…

大学本科 java教材,大学本科自学java之路——IO

大学本科自学java之路——IO大学本科自学java之路——IO我现在大三&#xff0c;大一&#xff0c;大二就是玩&#xff0c;现在大三准备考虑就业了&#xff0c;特写博客便于坚持自己学习一. 字节缓冲流的构造方法&#xff1a;BufferedOutputStream:该类实现缓冲输出流。 通过设置…

Map的value转化为其它类型

map的values() Collection<String> v map.values(); 转化为数组或者List集合 转化为List: List<String> lnew ArrayList<String>(map.values()); for(String s:l){System.out.print(s); }转化为数组 1.直接为Object[]数组 Object[] array map.values(…

下载的oracle如何解压,深度概述Ubuntu oracle下载解压

oracle经过长时间的发展&#xff0c;我发表对Ubuntu oracle个人讲解&#xff0c;叙述下Ubuntu oracle使用。Ubuntu 包含了非常好的翻译和容易使用的架构&#xff0c;这些由自由软件社团将不断的提供, 将尽可能的使大多数人方便使用 Ubuntu 。1. 先到 Ubuntu oracle 网站上下载了…

关于比较器Comparator排序时间的问题

​ 最近涉及一个需要按照时间排序的问题&#xff0c;由于在数据库层面order by太麻烦&#xff0c;所以就准备在代码层面解决&#xff0c;但是过程中遇到了一个很有意思的问题。 ​ 先介绍一下用的比较器的api&#xff1a; o1大于o2,则返回正数&#xff1b;o1等于o2,则返回0&…

Error running ‘transmission‘: Unable to open debugger port (127.0.0.1:52469): java.net.SocketExcepti

IDEA运行tomcat启动项目时报错。 开始还以为是这里的端口被占用的问题 然而实际上是tomcat的JMX端口的问题&#xff0c;将端口修改一下&#xff0c;就可以完美启动。 修改之后即可启动项目

oracle 11g 环境,Linux彻底清理Oracle 11g RAC环境方案

参考文档&#xff1a;Linux环境下11.2.0.3 rac的快速卸载脚本在Oracle 11.1和Oracle 10.1,10.2上&#xff0c;都是官方提供手工清理RAC环境的方法的(比如环境有问题&#xff0c;或者RAC安装失败&#xff0c;要清理后重新安装。虽然这些版本&#xff0c;也提供了卸载脚本&#x…

oracle常用用户权限,oracle创建新用户及授予常用权限

创建用户create user usernameidentified by usernamedefault tablespace tablespace_name;授予一般权限grant connect,resource,create any table,drop any table,create sequence,select any table, create any index, drop any index,alter any trigger, create any trigger…

synchronized 锁升级过程

synchronized 锁升级过程就是其优化的核心&#xff1a;偏向锁 -> 轻量级锁 -> 重量级锁 class Test{private static final Object object new Object(); public void test(){synchronized(object) {// do something } }}每个对象创建时都有各自的对象头&#…

oracle数据泵索引创建慢,IMPDP 很慢的原因探究

最近帮一个客户做数据迁移测试&#xff0c;数据库版本的10.2.0.4.0&#xff0c;操作系统是AIX到Linux&#xff0c;采用EXPDP/IMPDP方式进行全库导出和导入。客户的数据库有3.6T&#xff0c;导出时间花了30小时&#xff0c;但是导入却花了120小时&#xff0c;这个很不正常。因为…