RabbitMQ面试题
1.RabbitMQ是什么?
1 RabbitMQ是实现了高级队列协议的消息中间件。 2 3 什么是消息队列? 4 就是使用队列进行通信的组件。
2.RabbitMQ特点?
1 可靠性: RabbitMQ使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等。 2 3 灵活的路由 : 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能, RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路 4 由功能,可以将多个 交换器绑定在一起, 也可以通过插件机制来实现自己的交换器。 5 6 扩展性: 多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展 集群中节点。 7 8 高可用性 : 队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队 列仍然可用。 9 10 多种协议: RabbitMQ除了原生支持AMQP协议,还支持STOMP, MQTT等多种消息 中间件协议。 11 12 多语言客户端 :RabbitMQ 几乎支持所有常用语言,比如 Java、 Python、 Ruby、 PHP、 C#、 JavaScript 等。 13 14 管理界面 : RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集 群中的节点等。 15 16 令插件机制 : RabbitMQ 提供了许多插件 , 以实现从多方面进行扩展,当然也可以编写自 己的插件。
3.AMQP是什么?
1 RabbitMQ就是 AMQP 协议的 Erlang 的实现(当然 RabbitMQ 还支持 STOMP2、 MQTT3 等协议 )
#4.AMQP协议3层?
1 Module Layer:协议最高层,主要定义了一些客户端调用的命令,客户端可以 2 用这些命令实现自己的业务逻辑。 3 4 Session Layer:中间层,主要负责客户端命令发送给服务器,再将服务端应答 5 返回客户端,提供可靠性同步机制和错误处理。 6 7 TransportLayer:最底层,主要传输二进制数据流,提供帧的处理、信道服用、 8 错误检测和数据表示等。
5.AMQP模型的几大组件?
1 交换器 (Exchange):消息代理服务器中用于把消息路由到队列的组件。 2 队列 (Queue):用来存储消息的数据结构,位于硬盘或内存中。 3 绑定 (Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。
6.说说生产者Producer和消费者Consumer?
1 Producer是消息投递的一方。 2 Consumer是消息获取的一方。 3 4 (自由发挥...)
7.为什么需要消息队列?
1 本质上来说是由于互联网技术的高速发展,互联网技术架构不断演进而催生的产物。 2 3 随着技术架构从单体架构到微服务架构,服务的增多使得需要一个工具来解耦,合理利用以及缓冲流量洪峰等。 4 5 作用:异步处理、服务解耦、流量控制
8.说说Broker服务节点、Queue队列、Exchange交换器?
1 Broker:可以看做是RabbitMQ下的一个服务节点。 2 Queue:Broker内部的组件,是存储消息的数据结构,多个消费者可以订阅同一个队列,该队列中的消息会被订阅该队列的消费者轮询接收。 3 Exchange:交换机用来接收消息并将消息根据RoutingKey发送给与该交换机绑定的指定队列,如果没有指定队列消息将会返回给生产者或者直接丢弃。
9.消息队列有什么优缺点?
1 1:系统可用性降低,一旦MQ崩溃,整个系统也会崩溃 2 2:系统复杂度提高,要解决消息丢失,消息重复消费的问题 3 3:消息传递的顺序性问题 4 4:一致性问题
10.如何保证消息的可靠性?
1 生产者到RabbitMQ:事务机制和Confirm机制,注意:事务机制和 Confirm 机制是互斥的,两者不能共存,会导致 RabbitMQ 报错。 2 3 RabbitMQ自身:持久化、集群、普通模式、镜像模式。 4 5 RabbitMQ到消费者:basicAck机制、死信队列、消息补偿机制。
11.什么是RoutingKey路由键?
1 RoutingKey路由键是用来将客服端发送的消息通过绑定交换机路由给该交换机绑定的指定的队列中。
12.Binding绑定?
1 将Exchange与若干个Queue绑定,绑定时设置RoutingKey用来将以后交换机接收的消息根据消息的RoutingKey路由到指定的Queue中。
13.交换器4种类型?
Fanout:广播方式,绑定该类型交换机的队列都将收到该交换机收到的所有消息。
Direct:点对点方式,只会将绑定关系RoutingKey与消息RoutingKey完全一致才会发送给该队列。
Topic:通配符方式,通过*(代表一个单词,单词之间.隔开)#(多个单词)进行路由。
Headers:不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定
时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,
direct,topic 的路由键都需要要字符串形式的。
匹配规则x-match有下列两种类型: x-match = all :表示所有的键值对都匹配才能接受到消息 x-match = any :表示只要有键值对匹配就能接受到消息
14.生产者消息运转?
1:与Broker的连接,创建信道(Channel) 2:创建EXchenge和Queue并设置属性 3:将Exchange与Queue进行绑定 4:生产者将消息发送至Broker,其中包含交换机名,路由键等 5:指定路由器接收消息并根据路由键查找指定队列 6:如果找到则将消息放入指定队列,如果没找到则将消息返回给生产者或者直接丢弃 7:关闭信道 8:关闭连接
15.消费者接收消息过程?
1:消费者与Broker进行连接,开启信道(Channel) 2:监听Broker中指定的队列,并设置回调函数 3:等待Broker相应并投递队列消息 4:消费者接收消息并响应ack 5:Broker从队列中删除消息 6:关闭信道 7:关闭连接
16.交换器无法根据自身类型和路由键找到符合条件队列时,有哪些处理?
1 mandatory :true 返回消息给生产者。 2 mandatory: false 直接丢弃。
17.死信队列?
1 当一个队列中的消息过期,被拒收,或者队列满后再次收到消息,则该类消息会被发送到另一个交换机,则该交换机就成为死信交换机,与该交换机绑定的队列为死信队列。
18.导致的死信的几种原因?
1 消息被拒(Basic.Reject /Basic.Nack) 且 requeue = false。 2 消息TTL过期。 3 队列满了,无法再添加。
19.延迟队列?
1 队列中存储消息后,不会立刻被消费者获取到,而是等待指定时间后将消息发送给消费者。
20.优先级队列?
优先级高的队列会先被消费。 可以通过x-max-priority参数来实现。 当消费速度大于生产速度且Broker没有堆积的情况下,优先级显得没有意义
21.事务机制?
1 RabbitMQ 客户端中与事务机制相关的方法有三个: 2 3 channel.txSelect 用于将当前的信道设置成事务模式。 4 channel . txCommit 用于提交事务 。 5 channel . txRollback 用于事务回滚,如果在事务提交执行之前由于 RabbitMQ 异常崩溃或者其他原因抛出异常,通过txRollback来回滚。
22.发送确认机制?
1 生产者把信道设置为confirm模式时,所有通过该信道发送的消息都会包含一个ID,当消息投递到所有匹配队列后,RabbitMQ会相应一个ACK给生产者并携带该消息的ID,这样生产者就确认消息
2 到达指定位置。
23.消费者获取消息的方式?
1 推送Consume(实时监听) 2 拉取Get(死循环发送请求,效率低)
24.消费者某些原因无法处理当前接受的消息如何来拒绝?
1 channel .basicNack 2 channel .basicReject
25.消息传输保证层级?
1 At most once:最多一次。消息可能会丢失,但不会重复传输。 2 3 At least once:最少一次。消息绝不会丢失,但可能会重复传输。 4 5 Exactly once: 恰好一次,每条消息肯定仅传输一次。
26.了解Virtual Host吗?
1 每一个RabbitMQ服务器都能创建虚拟的消息服务器,也叫虚拟主机(virtual host),简称vhost。 2 3 默认为“/”。
27.集群中的节点类型?
1 内存节点:ram,将变更写入内存。 2 3 磁盘节点:disc,磁盘写入操作。 4 5 RabbitMQ要求最少有一个磁盘节点。
28.队列结构?
通常由以下两部分组成
rabbit_amqqueue_process:负责协议相关的消息处理,即接收生产者发布的消息、向消费者交付消息、处理消息的确认(包括生产端的 confirm 和消费端的 ack) 等。
backing_queue:是消息存储的具体形式和引擎,并向 rabbit amqqueue process提供相关的接口以供调用。
29.RabbitMQ中消息可能有的几种状态?
1 alpha: 消息内容(包括消息体、属性和 headers) 和消息索引都存储在内存中 。 2 3 beta: 消息内容保存在磁盘中,消息索引保存在内存中。 4 5 gamma: 消息内容保存在磁盘中,消息索引在磁盘和内存中都有 。 6 7 delta: 消息内容和索引都在磁盘中 。
30.在何种场景下使用了消息中间件?
1 接口之间耦合比较严重 2 面对大流量并发时,容易被冲垮 3 存在性能问题
31.生产者如何将消息可靠投递到MQ?
1 生产者把消息发送给MQ 2 MQ持久化消息后,会发送ack给生产者,如果由于网络等原因生产者未能及时获取到ack,则在等待时间超时后,生产者重新发送消息 3 生产者获取到ack,认为已经发送成功
32 . MQ如何将消息可靠投递到消费者?
1 1.MQ将消息push给Client(或Client来pull消息) 2 3 2.Client得到消息并做完业务逻辑 4 5 3.Client发送Ack消息给MQ,通知MQ删除该消息,此处有可能因为网络问题导致Ack失败,那么Client会重复消息,这里就引出消费幂等的问题; 6 7 4.MQ将已消费的消息删除
33.如何保证RabbitMQ消息队列的高可用?
RabbitMQ 有三种模式:单机模式,普通集群模式,镜像集群模式。
单机模式:就是demo级别的,一般就是你本地启动了玩玩儿的,没人生产用单机模式
普通集群模式:意思就是在多台机器上启动多个RabbitMQ实例,每个机器启动一个。
镜像集群模式:这种模式,才是所谓的RabbitMQ的高可用模式,跟普通集群模式不一样的是,你创建的queue,无论元数据(元数据指RabbitMQ的配置数据)还是queue里的消息都会存在于多个实例
上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。
34.消息幂等性实现原理?
使用全局 MessageID 判断消费方使用同一个,解决幂等性问题。
或者使用业务逻辑保证唯一(比如订单号码)
通常判断方式:
可以给定每条消息一个唯一的MessageID,消费者每次消费消息后把MessageID存储在Redis中,每次消费前去Redis中查询有无记录,如果有则不重复消费。