amqp交换类型

时间:2011-05-13 23:18:58

标签: python amqp kombu

我正在进入整个amqp的事情,我对在以下情况下使用哪种交换类型有疑问:

1)我需要创建一个工作池,每个工作人员在收到消息时都会执行某些操作。现在我想要不同的工人加入不同类型的任务;我可以通过以主题方式使用每个消息的路由键来指定。在消费者端,用kombu玩一下我注意到如果我指定相同的队列名但使用不同的路由键,我就无法“过滤”消息。例如,如果我有一个消费者使用'#'而另一个消费者使用'foo。#' - 两者都使用相同的队列名称,后一个消费者将在前消费者的队列中循环工作。这是预期的吗?我在同一台机器上运行两个消费者。

2)因此,我为每个消费者构建了唯一的队列名称,这次,每个消费者只能通过路由密钥获得我要求的内容。但是,因为它们是不同的队列,所以我可能不仅仅在一个消费者中获得任务。例如,如果消费者1具有键'#',而消费者2具有'foo。#';当消费者2接收(并确认)消息时,消费者1也获得相同的消息。这不是我想要的;我希望只有一个消费者才能收到消息。有没有办法在不写“任务经理”的情况下实现这一目标?

欢呼声,

1 个答案:

答案 0 :(得分:0)

对于大多数人来说,最好只使用主题交换,直到您完全理解AMQP的工作方式。只需为队列选择正确的绑定密钥,就可以获得扇出和直接行为。例如,如果使用“#”作为绑定密钥,则该队列的行为就像它连接到直接交换一样。如果将两个或多个队列绑定到相同的路由键,那么这些队列的功能就像扇出交换一样。

预计循环行为。这两个任务都订阅了完全相同的队列。绑定密钥不同的事实只是混淆了一切。可能无论谁最后绑定,都会为每个队列用户设置绑定密钥。最好不要那样做。我构建了一个系统,其中几个队列具有完全相同的工作代码的4到15个实例,从同一队列中拉出消息,然后从Web服务收集数据。我甚至让工作人员在不同的CPU上运行,尽管最终这对于性能不是必需的。

我不确定你为什么在绑定键中使用通配符。如果您有8个名为A到H的消费者,并且每个消费者执行不同的工作,那么为什么不发布带有路由键的消息work.A通过work.H然后使用相同的绑定键work.A到work.H.这样,如果你有多个worker B实例,它们都绑定到work.B并且没有消息被传递两次。

此外,如果您在处理完邮件后没有收到消息,那么它最终将返回队列并再次发送。希望您在成功处理消息后正在寻求帮助。不需要任务经理,只需更好地了解所有AMQP旋钮。