1.消息队列的发布订阅模型是怎样的?
生产者(Producter)创建消息,然后发送到代理服务器(Broker)
消费者连接到代理服务器上,并订阅到队列,Broker 会把消息的载荷发送非消费者。
2.信道(channel)是什么?
信道是 IO 多路复用的一种实现。
应用程序和 RabbitMQ 之间创建一个 TCP 连接。一旦 TCP 连接打开(通过认证),应用程序就可以创建一条 AMQP 信道。信道是简历在 TCP 连接上的虚拟连接。AMQP 命令都是通过信道发送出去的。
因为 TCP 的创建和销毁的代价很大,如果每个线程都单独创建一个 TCP 连接,那么会造成 TCP 的巨大浪费,并且很快就会耗尽操作系统的资源。
3.Broker 的结构包括什么
AMQP 消息路由必须有三个部分:交换机、队列和绑定。
消息从生产者发送到交换机,通过绑定的路由关系最终到达队列,被消费者消费。
绑定决定了消息从路由器路由到哪些队列。
4.队列如何把消息发送给消费者
-
当消费者订阅了队列,消息会立即发送给这些消费者;
-
如果消息到达了无人到达的队列,消息会在队列中等待,一旦有消费者订阅了该队列,那么消息会立即被发送。
5.当有多个消费者订阅了同一个队列,消息是如何分发的。
多个消费共同消费一份队列数据。通过轮询的方式。
6.消息何时从队列中被删除?
当消费者接受到消息,并且想 Broker 发送一个消息确认的时候(ack)。当队列的 auto_ack 被设置成为 true 的时候,一旦消费者接受到消息,RabbitMQ 会自动认为确认了消息。
所以为了保证消息不丢失,要关闭 auto_ack,并且在 consumer 的业务逻辑处理完成后再做 ack,这样可以防止程序意外退出,或者网络等因素到这的消息丢失。
7.reject 消息应用在什么场景?
-
比不回复 ack 的效率更高。如果程序有 bug 而忘记了确认消息,RabbitMQ 不会给该消费者发送更多的消息了。
-
这是因为在上一个消息未被确认之前,RabbitMQ 会认为这个消费者并没有准备好接收下一条消息;
-
如果是确认前从断开和 RabbitMQ 的连接(或者从队列上取消订阅),RabbitMQ 会认为这条消息没有妥投,然后重新分发给下一个消费者,这样会有更多的建立/断开连接的操作。
-
reject 配合 require 参数设置为 false,来使用死信队列。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于