2011-05-13 40 views
0

我进入全AMQP的事情,我有一个关于下使用哪种类型的交换类型的问题,以下情形的:AMQP交换类型

1)我有必要建立一个工作池,每个工人在收到消息时会做某些事情。现在我想让不同的工作者参与不同类型的任务;我可以通过以主题方式使用每条消息的路由键来指定。在消费者端,与kombu玩一下我注意到,如果我指定相同的队列名称,但使用不同的路由键我不能“过滤”消息。例如,如果我有一个使用'#'的消费者,另一个使用'foo。#' - 两个使用相同的队列名称,后一个消费者将与前一个消费者一起循环。这是预期的吗?我在同一台机器上运行两个用户。 2)因此,我为每个消费者构建了唯一的队列名称,这一次,每个消费者只会得到我要求的路由密钥。然而,因为它们是不同的队列,我可能不仅仅是一个消费者获得任务。例如,如果消费者1具有关键'#'并且消费者2具有'foo。#';当消费者2接收(并确认)消息时,消费者1也得到相同的消息。这不是我想要的;我想只有一个消费者只能得到这个消息。有没有办法在不写'任务管理器'的情况下实现这一点?

欢呼声,

回答

0

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

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

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

此外,如果您在处理完消息后没有回复消息,那么最终它会返回到队列中并重新递送。希望您在成功处理邮件后进行确认。不需要任务管理器,只需更好地了解所有AMQP旋钮。