RabbitMQ AMQP队列设计

3
以下是具有以下特点的队列理想设计:
  • P 生产者,插入数据的应用程序
  • X 交换机
  • C1-C3 消费者,从队列中读取数据的应用程序
队列详情:
  • A. 就像队列日志一样,如果没有客户端绑定,则消息将被丢弃。
  • B. 这是一个工作队列。当满足某些条件时,它会执行某些操作。
  • C. 也是一个工作队列。它将转换数据。
A 是可选项,但 B 和 C 始终在队列中,直到某个客户端进程连接它们。
问题是确定我应该使用哪种类型的交换机。是 fanout、direct 还是 topic?因为我希望 A 队列在没有连接客户端时丢弃消息,而 B 和 C 应始终保留消息。
此外,生产者应该一次写入一次到交换机,还是使用不同的路由键或主题多次写入?
1个回答

7
回答问题:我是否希望所有队列都接收所有消息?
如果是,则应使用fanout。如果不是,则应使用direct或topic。直接或主题的整个重点在于,队列本身只会根据路由键与绑定键匹配来接收消息。
消费者C1应实例化队列A,并设置为自动删除和非持久化。这样,当C1断开连接时,队列将被删除,消息将被丢弃。
相反,当交换机创建时,应该创建队列B和C,可以分别创建,也可以由生产者创建。它们应该设置为非自动删除,可能是持久化的。如果您正在使用持久性队列,则可能需要具有持久性消息(即使队列A不存在,持久性消息也不会成为问题)。这样,一旦生产者开始发送消息,队列就会开始排队,即使消费者尚未运行,也不会错过任何消息。
使用直接或主题交换的选择是个人喜好。我知道直接交换应该更快,而主题交换允许使用多个路由/绑定键。
我不完全明白您最后一个问题的意思。每个消息只应写入一次交换机。如果使用fanout,则交换机将负责将消息正确路由到队列,仅此而已。如果您正在使用直接或主题交换,则取决于绑定键来确保每个队列接收正确的消息。您不应发送带有多个路由键的消息,如果您希望执行此类操作,则在理解上出现了一些问题。但是,您可以从单个队列向交换机拥有多个绑定键。
简单示例。 X是直接交换。 B具有绑定键黑色,C具有一个绑定键黑色和一个绑定键白色。 P使用路由键black或white发送消息。如果是黑色,则B和C都将接收到消息;如果是白色,则只有C会收到消息。

生产者创建队列可以吗?这样不会引入耦合吗? - Jean-Philippe Caruana
是否可能有多个消费者连接到B和C,并仅处理每条消息一次?(我的意思是,如果B上有2个消费者,则该消息仅由其中一个处理) - Jean-Philippe Caruana
从技术上讲,消费者创建队列没有问题。但这只是一种特定的用例,如我所描述的那样。如果您希望队列从一开始就存在,则可以手动创建它一次。考虑到从生产者创建队列同样容易,我认为这里并不存在大问题。 - robthewolf
如果有多个消费者连接到同一个队列,则该队列中的消息只会被其中一个消费者消费。这是以轮询方式完成的,因此您可以并行处理消息。队列仅包含一份消息副本,因此只能由特定连接到该队列的一个消费者处理一次。请在RMQ文档中了解工作队列的相关内容。 - robthewolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接