1、RabbitMQ的使用场景?
- 跨系统的异步通讯,所有需要异步通讯的地方都可以使用消息队列。
- 多应用之间松耦合,由于消息是平台无关和语言无关的,而且语义上也不是函数调用的方式,所以更适用于多应用间的松耦合的接口。
- 应用内的同步变异步,高峰值的大量消息可以放在消息队列中慢慢处理,可以达到一定的削峰的作用。
使用消息队列的作用:削峰,异步,解耦
2、RabbitMQ有哪些重要的角色?
- 生产者:消息的生产者,负责创建和推送数据到消息服务器
- 消费者:消息的接收方,用于处理数据和确认消息
- 代理:就是RabbitMQ本身,达到了一个快递的作用。
面试相关问题:使用MQ怎么保证消息的不重,不漏?
不重:避免消息重复的问题,订单系统作为消费者,会接受所有订阅的消息,不进行是否重复的判断,在处理消息的时候会通过数据在业务含义上的幂等来实现。
不漏:对于消息的不漏,主要是依赖阿里消息组件提供监控机制和订单系统与源系统的每日落库数据资损来共同确保不丢失消息。组件提供的监控机制,可以判断生产者的消息是否正常的投递到了代理消息队列中,可以判断代理消息队列中向消费者投递的消息是否被正常接收到了,未接收到可以重复投递。
3、RabbitMQ有哪些重要的组件?
- connectionFactory 连接管理器:应用程序与rabbit之间建立连接的管理器。程序代码中使用。
- channel 信道:消息推送使用的通道。
- Exchange 交换器:用于接收和分配消息。
- Queue 队列:用于存储生产者的消息。
- RoutingKey 路由键:用于把生产者的数据分配到交换机上。
- BindingKey 绑定键:用于把交换机的消息绑定到队列上。
4、RabbitMQ中的vhost的作用?
vhost可以理解为mini-RabbitMQ-server。其内部含均含有独立的queue,exchange,binding等,并且拥有独立的权限系统,可以做到vhost范围的用户控制,从RabbitMQ的全局角度,vhost可以作为不同权限的隔离手段,即不同的应用可以跑到不同的vhost中。
5、RabbitMQ的消息是怎么发送的?
- 首先需要客户端连接到RabbitMQ的server,这样才可以发布或者订阅消息。
- 客户端与server之间,建立一个TCP连接,通过用户名密码进行验证
- 验证通过后,二者之间会建立一个channel(信道),每个信道都有唯一的id,消息的订阅和发布都需要通过该信道。
6、RabbitMQ是怎么确保消息的稳定性的?
- 提供事务功能
- 将channel设置为confirm模式
7、RabbitMQ怎么避免消息丢失?
- 消息持久化
- ACK确认机制
- 设置集群镜像模式
- 消息补偿机制
8、要保证消息持久化成功的条件有哪些?
- 声明队列必须设置为持久化
- 消息推送投递模式必须设置为持久化
- 消息已经到达持久化交换器
- 消息已经到达持久化队列
消息以上四个条件都满足才能保证消息的持久化成功。
9、RabbitMQ的持久化有哪些缺点?
持久化的缺点就是会降低服务器的吞吐量,因为他使用的是磁盘存储而非内存存储。
10、RabbitMQ有那几种广播方式?
- fanout:纯广播,所有绑定在RabbitMQ的接受者都可以收到消息
- direct:通过RoutingKey和exchange决定哪一个特定的queue可以接收到消息
- topic:所有符合RoutingKey的RoutingKey绑定的queue都可以接收到消息
11、RabbitMQ怎么实现延迟消息队列?
- 通过RabbitMQ队列的特性来实现,需要使用到消息存活时间和 死信交换机。通过消息过期后进入 死信交换机,再由交换器转发到延迟消息队列,实现延迟功能
- 使用RabbitMQ-delayed-message-exchange插件实现延迟功能
12、RabbitMQ集群有什么用?
集群主要有以下两个用途:
- 高可用:某个服务器出现了问题,整个RabbitMQ还可以继续使用。
- 高容量:集群可以承载更多的消息。
13、RabbitMQ节点类型有哪些?
- 磁盘节点:消息会存储到磁盘
- 内存节点:消息都存在内存中,重启服务器消息就会消失,但是性能会高于磁盘类型
14、RabbitMQ 集群搭建需要注意哪些问题?
15、RabbitMQ每个节点是其他节点的完全拷贝吗?
不是,原因有以下两个:
- 存储空间的考虑:如果每一个节点都拥有队列完整的拷贝,那么新增节点,不但不会增加存储空间,还会增加更多的冗余数据;
- 性能的考虑:如果每一条消息都完整的拷贝到每一个集群节点,那新增的节点并没有提升处理消息的能力,最多是保持和的那个节点相同的性能,甚者不如单个节点;
16、RabbitMQ集群中唯一一个磁盘节点崩溃了会发生什么情况?
如果唯一一个节点崩溃了,则不能进行以下操作:
- 不能创建队列
- 不能创建交换机
- 不能创建绑定
- 不能添加用户
- 不能更改权限
- 不能添加和删除集群节点
集群的唯一一个节点崩溃了,集群是可以保持运行的,但是不可以做任何修改。
17、RabbitMQ对集群节点停止顺序有要求吗?
对于节点的停止是有要求的,需要先关闭内存节点,在关闭磁盘节点,否则会造成消息的丢失。