RabbitMQ面试题详解
一、RabbitMQ的应用场景有哪些?
1.异步处理
场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式
(1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西;
(2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间;
假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回
(3)消息队列
引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理
由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。
2.应用解耦
场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.
这种做法有一个缺点:
当库存系统出现故障时,订单就会失败。(这样马云将少赚好多好多钱^ ^)
订单系统和库存系统高耦合.
引入消息队列
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。
就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失(马云这下高兴了).
3.流量削峰
流量削峰一般在秒杀活动中应用广泛
场景:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
作用:
1.可以控制活动人数,超过此一定阀值的订单直接丢弃(我为什么秒杀一次都没有成功过呢^^)
2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
二、消息的角色有哪些?
1.生产者、消费者和代理角色。
生产者:消息的创建者,负责创建消息和推送消息到服务器;
消费者:消息的接收方,用于处理数据和确认消息(ACK);
代理:rabbitmq本身,类似于“快递”角色,本身不生产消息。
三、RabbitMQ有哪些重要的组件?
ConnectionFactory连接管理器:程序与rabbitmq建立连接的管理器,在程序代码中使用
channel:信道,消息推送使用的通道
exchange:交换器,用于接受、分配消息
queue:队列,用于存储生产者生产的消息
routingKey:路由键,把生产者的消息分配到交换器上
bindingKey:绑定键,把交换器的消息绑定到队列上
四、RabbitMQ中vhost的作用是什么?
vhost可以理解为虚拟broker,即mq服务器,内部含独立的queue、exchange、binding等
五、RabbitMQ如何发送消息?
客户端和服务端要创建tcp连接,当创建成功后客户端会和mq服务器创建一条amqp信道,信道都有唯一的id,发布订阅都通过信道完成。
六、RabbitMQ怎样确保消息的稳定性?
提供了事务的功能,通过将channel信道设置为confirm(确认)模式。
七、如何避免消息丢失?
1.消息的持久化机制
2.消费者接收数据时设置的ACK消息确认机制
3.消息补偿机制
4.设置集群镜像模式
八、持久化有什么缺点?
缺点是降低了服务器的吞吐量,因为使用的是硬盘存储而非内存,可尽量使用ssd硬盘来缓解吞吐量的问题。
九、如何实现延迟消息队列?
通过消息过去后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能。
十、集群有什么用?
高可用:某个服务器出现问题,整个mq还可以继续使用;
高容量:集群可以承载更多的消息量;
十一、节点类型有哪些?
磁盘节点:消息存储到磁盘;
内存节点:消息存储在内存中,重启服务器后消息丢失,性能高于磁盘类型;
十二、集群搭建需要注意什么?
各节点之间使用“- link”连接,不能忽略;
各节点使用的erlang cookie值必须相同,相当于秘钥,用于各节点之间的认证;
整个集群中必须包含一个磁盘节点;
十三、集群中唯一的磁盘节点崩溃了会发生什么情况?
集群可以正常运行,但不能更改任何东西。
十四、RabbitMQ 对集群节点的停止有顺序要求吗?
有,应该先关闭内存节点,最后再关闭磁盘节点,顺序相反的话,会导致消息的丢失。
十五、RabbitMQ 有几种广播类型?
direct(默认模式):发送方把消息发送给订阅方,如果有多个订阅者,默认采取轮询的方式进行消息发送;通过routingKey和exchange决定的那个唯一的queue可以接收消息;
headers:与 direct 类似,只是性能很差,此类型几乎用不到。
fanout:分发模式,将消息发送给所有订阅者;所有绑定到此exchange的queue都可以接收消息(纯广播、绑定到RabbitMQ的接 受者都能收到消息);
topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收到;所有符合routingKey(此时可以是一个表达式)所bind的queue可以接收消息;