2012-10-02 144 views
3

下面是队列的期望的设计:的RabbitMQ AMQP队列设计

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

队列细节应用:

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

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

Desirable queue design

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

而且生产者应该一次性写入交换机,还是用不同的路由键或话题写入多个时间?

回答

7

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

如果答案是肯定的,那么你应该使用扇出。如果答案是否定的,那么你应该使用直接或主题。直接或主题的要点是队列本身只会根据路由密钥与绑定密钥的匹配来接收消息。

队列A应该由消费者C1实例化,并设置为自动删除且不耐用。当C1断开队列时,这种方式将被删除,消息将被丢弃。

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

是否使用直接或话题交换是个人偏好。我知道直接交换应该更快,而话题交换允许路由/绑定密钥具有很大的灵活性。

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

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

+0

生产者是否可以创建队列?会不会引入耦合? –

+0

是否有可能有几个消费者连接到B和C,并只处理每个消息一次? (我的意思是,如果B上有两个消费者,则消息仅由其中的一个处理) –

+0

技术上,消费者创建队列没有问题。但它是一个具体的用例,我上面描述的那个。这取决于,如果您希望队列从一开始就处于活动状态,您可以手动创建一次。鉴于它与制片人一样容易创作。我在这里看不到什么大问题。 – robthewolf