1. RabbitMQ 的使用场景有哪些?程序员
抢购活动,削峰填谷,防止系统崩塌。面试
延迟信息处理,好比 10 分钟以后给下单未付款的用户发送邮件提醒。sql
解耦系统,对于新增的功能能够单独写模块扩展,好比用户确认评价以后,新增了给用户返积分的功能,这个时候不用在业务代码里添加新增积分的功能,只须要把新增积分的接口订阅确认评价的消息队列便可,后面再添加任何功能只须要订阅对应的消息队列便可。bash
2. RabbitMQ 有哪些重要的角色?服务器
RabbitMQ 中重要的角色有:生产者、消费者和代理:cookie
生产者:消息的建立者,负责建立和推送数据到消息服务器;jvm
消费者:消息的接收方,用于处理数据和确认消息;tcp
代理:就是 RabbitMQ 自己,用于扮演“快递”的角色,自己不生产消息,只是扮演“快递”的角色。性能
3. RabbitMQ 有哪些重要的组件?学习
ConnectionFactory(链接管理器):应用程序与Rabbit之间创建链接的管理器,程序代码中使用。
Channel(信道):消息推送使用的通道。
Exchange(交换器):用于接受、分配消息。
Queue(队列):用于存储生产者的消息。
RoutingKey(路由键):用于把生成者的数据分配到交换器上。
BindingKey(绑定键):用于把交换器的消息绑定到队列上。
4. RabbitMQ 中 vhost 的做用是什么?
vhost:每一个 RabbitMQ 都能建立不少 vhost,咱们称之为虚拟主机,每一个虚拟主机其实都是 mini 版的RabbitMQ,它拥有本身的队列,交换器和绑定,拥有本身的权限机制。
5. RabbitMQ 的消息是怎么发送的?
首先客户端必须链接到 RabbitMQ 服务器才能发布和消费消息,客户端和 rabbit server 之间会建立一个 tcp 链接,一旦 tcp 打开并经过了认证(认证就是你发送给 rabbit 服务器的用户名和密码),你的客户端和 RabbitMQ 就建立了一条 amqp 信道(channel),信道是建立在“真实” tcp 上的虚拟链接,amqp 命令都是经过信道发送出去的,每一个信道都会有一个惟一的 id,不管是发布消息,订阅队列都是经过这个信道完成的。
6. RabbitMQ 怎么保证消息的稳定性?
提供了事务的功能。
经过将 channel 设置为 confirm(确认)模式。
7. RabbitMQ 怎么避免消息丢失?
把消息持久化磁盘,保证服务器重启消息不丢失。
每一个集群中至少有一个物理磁盘,保证消息落入磁盘。
8. 要保证消息持久化成功的条件有哪些?
声明队列必须设置持久化 durable 设置为 true.
消息推送投递模式必须设置持久化,deliveryMode 设置为 2(持久)。
消息已经到达持久化交换器。
消息已经到达持久化队列。
以上四个条件都知足才能保证消息持久化成功。
9. RabbitMQ 持久化有什么缺点?
持久化的缺点就是下降了服务器的吞吐量,由于使用的是磁盘而非内存存储,从而下降了吞吐量。可尽可能使用 ssd 硬盘来缓解吞吐量的问题。
10. RabbitMQ 有几种广播类型?
direct(默认方式):最基础最简单的模式,发送方把消息发送给订阅方,若是有多个订阅者,默认采起轮询的方式进行消息发送。
headers:与 direct 相似,只是性能不好,此类型几乎用不到。
fanout:分发模式,把消费分发给全部订阅者。
topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收到。
11. RabbitMQ 怎么实现延迟消息队列?
延迟队列的实现有两种方式:
经过消息过时后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能;
使用 RabbitMQ-delayed-message-exchange 插件实现延迟功能。
12. RabbitMQ 集群有什么用?
集群主要有如下两个用途:
高可用:某个服务器出现问题,整个 RabbitMQ 还能够继续使用;
高容量:集群能够承载更多的消息量。
13. RabbitMQ 节点的类型有哪些?
磁盘节点:消息会存储到磁盘。
内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型。
14. RabbitMQ 集群搭建须要注意哪些问题?
各节点之间使用“--link”链接,此属性不能忽略。
各节点使用的 erlang cookie 值必须相同,此值至关于“秘钥”的功能,用于各节点的认证。
整个集群中必须包含一个磁盘节点。
15. RabbitMQ 每一个节点是其余节点的完整拷贝吗?为何?
不是,缘由有如下两个:
存储空间的考虑:若是每一个节点都拥有全部队列的彻底拷贝,这样新增节点不但没有新增存储空间,反而增长了更多的冗余数据;
性能的考虑:若是每条消息都须要完整拷贝到每个集群节点,那新增节点并无提高处理消息的能力,最可能是保持和单节点相同的性能甚至是更糟。
16. RabbitMQ 集群中惟一一个磁盘节点崩溃了会发生什么状况?
若是惟一磁盘的磁盘节点崩溃了,不能进行如下操做:
不能建立队列
不能建立交换器
不能建立绑定
不能添加用户
不能更改权限
不能添加和删除集群节点
惟一磁盘节点崩溃了,集群是能够保持运行的,但你不能更改任何东西。
17. RabbitMQ 对集群节点中止顺序有要求吗?
RabbitMQ 对集群的中止的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点。若是顺序刚好相反的话,可能会形成消息的丢失。
结语
就以这段话自勉、共勉吧。越努力、越幸运,若是你不是官二代、富二代、红二代,那么请记住:勤奋才是改变你命运的惟一捷径。
欢迎在留言区留下你的观点,一块儿讨论提升。若是今天的文章让你有新的启发,学习能力的提高上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入程序员知识码头技术群,在公众号后台回复“加群”便可。
猜你还想看
6.每日3分钟技术干货 | 面试题+答案 | Mysql篇(一)
关注「程序员知识码头」,收看更多精彩内容复制代码