RabbitMQ
一、rabbitMQ 的使用场景
- 跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列。
- 多个应用之间的耦合,由于消息是平台无关和语言无关的,而且语义上也不再是函数调用,因此更适合作为多个应用之间的松耦合的接口。
- 应用内的同步变异步,比如订单处理,就可以由前端应用将订单信息放到队列,后端应用从队列里依次获得消息处理,高峰时的大量订单可以积压在队列里慢慢处理掉。由于同步通常意味着阻塞,而大量线程的阻塞会降低计算机的性能。
- 消息驱动的架构(EDA),系统分解为消息队列,和消息制造者和消息消费者,一个处理流程可以根据需要拆成多个阶段(Stage),阶段之间用队列连接起来,前一个阶段处理的结果放入队列,后一个阶段从队列中获取消息继续处理。
- 应用需要更灵活的耦合方式。
- 跨局域网、甚至跨城市的通讯。
二、rabbitMQ 有哪些重要角色
生产者、消费者、代理
- 生产者:消息的创建者,负责创建和推送数据到消息服务器
- 消费者:消息的接收方,用于处理数据和确认消息
- 代理:就是RabbitMQ 本身,用于扮演 “快递” 角色,本身不产生消息,只负责传递消息。
三、rabbitMQ 有哪些重要的组件
- connectionFactory(连接管理器):应用程序与Rabbit 之间建立的管理器,程序代码中使用。
- Channel(信道):消息推送使用的通道
- Exchange(交换器):用于接受、分配消息
- Queue(队列):用于存储生产者的消息
- RoutingKey(路由键):用于把生产者的数据分配到交换器上
- BindingKey(绑定键):用于把交换器的消息绑定到队列上
四、rabbitMQ 中 vhost 的作用
vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;
vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;
当在RabbitMQ中创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派vhost内的队列、交换器和绑定,vhost之间是绝对隔离的。
五、rabbitMQ 的消息是怎么发送的
- 客户端必须连接到 rabbitMQ 服务器上才能发布和消费消息
- 客户端和 rabbit server 之间会创建一个 tcp 连接,一旦 tcp 打开并通过认证
- 你的客户端和 rabbitMQ 就创建了一条 amqp 信道,信道是创建在“真实” tcp 上的虚拟连接
- amqp 命令都是通过信道发送出去的,每个信道都会有一个唯一的 id ,不论是发布信息还是订阅队列都是通过信道完成的。
六、rabbitMQ 怎么保证消息的稳定性
通过事务,设置为confirm(确认)模式
七、rabbitMQ 怎么避免消息丢失
- 消息持久化
- ACK确认机制
- 设置集群镜像模式
- 消息补偿机制
八、要保证消息持久化成功的条件有哪些?
-
声明队列必须设置持久化
durable
设置为 true -
消息推送投递模式必须设置持久化,
deliveryMode
设置为 2(持久) -
消息已经到达持久化交互器
-
消息已经到达持久化队列
以上四个条件都满足才能保证消息持久化成功
九、rabbitMQ 持久化有什么缺点
缺点就是降低了服务器的吞吐量,因为使用的是磁盘而不是内存存储,从而降低了吞吐量
十、rabbitMQ 怎么实现延迟消息队列
通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能;
十一、rabbitMQ 集群有什么作用
- 高可用:某个服务器出席那问题,整个 RabbitMQ 还可以继续使用
- 高容量:集群可以承载更多的信息量
十二、rabbitMQ 节点的类型有哪些
- 磁盘节点:消息会存储到磁盘
- 内存节点:消息存内存上,重启服务器消息丢失,但性能高于磁盘类型
十三、rabbitMQ 每个节点是其他节点的完整拷贝吗?
不是,原因有二:
- 存储空间考虑:如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而会增加更多冗余数据
- 性能考虑:如果每条消息都需要完整拷贝到每一个集群节点,那新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟。
十四、rabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况
崩溃后,集群可以保持运行,但是不能更改任何东西。
十五、rabbitMQ 对集群节点停止顺序有要求吗?
对顺序有要求,应该先关闭内存节点,再关闭磁盘节点,如果顺序相反的话,可能会造成消息丢失。