3

以下是队列的理想设计:

  • P制作人。插入数据的应用程序
  • X 交换。
  • C1-C3 消费者。从队列中读取的应用程序

队列详情:

  • A. 就像队列日志一样,如果没有客户端绑定,那么消息将被丢弃。
  • B. 这是一个工作队列。如果有条件匹配,它会做一些事情。
  • C. 也是一个工作队列。它将转换数据

A 是可选的,但 BC 将始终在队列中,直到某个客户端进程连接它。

理想的队列设计

问题是确定我应该使用哪种类型的交换。它是扇出、直接还是主题?因为如果没有连接客户端,我希望 A 队列丢弃消息,但 B & C 应该始终保留消息。

生产者应该向交易所写入一次,还是使用不同的路由键或主题多次写入?

4

1 回答 1

7

回答问题:我是否希望所有队列接收所有消息?

如果答案是肯定的,那么您应该使用扇出。如果答案是否定的,那么您应该使用直接或主题。直接或主题的全部意义在于,队列本身只会接收基于路由键与绑定键匹配的消息。

队列 A 应该由消费者 C1 实例化,并设置为自动删除和非持久性。这样,当 C1 断开连接时,队列将被删除,消息将被丢弃。

相反,队列 B 和 C 应该在交换时被实例化,或者单独地,或者由生产者。应该设置为非自动删除并且可能是持久的。如果您使用的是持久队列,您可能希望拥有持久消息(如果队列 A 不存在,请不要担心,即使持久消息在这里也不会成为问题)。这样,一旦生产者开始发送消息,队列就会开始排队,并且不会丢失任何消息,即使消费者尚未运行。

使用直接交换还是主题交换是个人喜好。我知道直接交换应该更快,而主题交换允许路由/绑定键有很大的灵活性。

我不是 100% 你最后一个问题的意思。每条消息只能写入一次交换。如果使用扇出,交换将负责正确地将消息路由到队列,就是这样。如果您使用的是直接或主题交换,那么它会使用绑定键来确保每个队列都接收到正确的消息。您不需要发送带有多个路由键的消息,如果您想做类似的事情,那么您的理解就会倒退。但是您可以从单个队列中获得多个绑定键到交换。

简单的例子。X 是直接交换。B有黑色装订键,C有1个黑色装订键和1个白色装订键。P 发送带有黑色或白色路由键的消息。如果它是黑色的,那么 B 和 C 都会收到消息,如果它是白色的,那么只有 C 会收到它。

于 2012-10-02T09:44:42.903 回答