RabbitMQ:理解消息通信的一些问题

本贴最后更新于 1628 天前,其中的信息可能已经时移世改

1.消息队列的发布订阅模型是怎样的?

生产者(Producter)创建消息,然后发送到代理服务器(Broker)
消费者连接到代理服务器上,并订阅到队列,Broker 会把消息的载荷发送非消费者。

image.png

2.信道(channel)是什么?

信道是 IO 多路复用的一种实现。

应用程序和 RabbitMQ 之间创建一个 TCP 连接。一旦 TCP 连接打开(通过认证),应用程序就可以创建一条 AMQP 信道。信道是简历在 TCP 连接上的虚拟连接。AMQP 命令都是通过信道发送出去的。

因为 TCP 的创建和销毁的代价很大,如果每个线程都单独创建一个 TCP 连接,那么会造成 TCP 的巨大浪费,并且很快就会耗尽操作系统的资源。

image.png

3.Broker 的结构包括什么

AMQP 消息路由必须有三个部分:交换机、队列和绑定。

消息从生产者发送到交换机,通过绑定的路由关系最终到达队列,被消费者消费。

绑定决定了消息从路由器路由到哪些队列。

image.png

4.队列如何把消息发送给消费者

  • 当消费者订阅了队列,消息会立即发送给这些消费者;

  • 如果消息到达了无人到达的队列,消息会在队列中等待,一旦有消费者订阅了该队列,那么消息会立即被发送。

5.当有多个消费者订阅了同一个队列,消息是如何分发的。

多个消费共同消费一份队列数据。通过轮询的方式。

6.消息何时从队列中被删除?

当消费者接受到消息,并且想 Broker 发送一个消息确认的时候(ack)。当队列的 auto_ack 被设置成为 true 的时候,一旦消费者接受到消息,RabbitMQ 会自动认为确认了消息。

所以为了保证消息不丢失,要关闭 auto_ack,并且在 consumer 的业务逻辑处理完成后再做 ack,这样可以防止程序意外退出,或者网络等因素到这的消息丢失。

7.reject 消息应用在什么场景?

  • 比不回复 ack 的效率更高。如果程序有 bug 而忘记了确认消息,RabbitMQ 不会给该消费者发送更多的消息了。

  • 这是因为在上一个消息未被确认之前,RabbitMQ 会认为这个消费者并没有准备好接收下一条消息;

  • 如果是确认前从断开和 RabbitMQ 的连接(或者从队列上取消订阅),RabbitMQ 会认为这条消息没有妥投,然后重新分发给下一个消费者,这样会有更多的建立/断开连接的操作。

  • reject 配合 require 参数设置为 false,来使用死信队列。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...