0

我正在进入整个 amqp 的事情,我有一个关于在以下场景下使用哪种类型的交换类型的问题:

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

2) 鉴于此,我为每个消费者构造了唯一的队列名称,这一次,每个消费者只得到我通过路由键请求的内容。但是,由于它们是不同的队列,我可能会在不止一个消费者中获得一项任务。例如,如果消费者 1 有键 '#',而消费者 2 有 'foo.#';当消费者 2 接收(并确认)一条消息时,消费者 1 也会收到相同的消息。这不是我想要的;我希望只有一个消费者只收到消息。有没有办法在不编写“任务管理器”的情况下实现这一目标?

干杯,

4

1 回答 1

0

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

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

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

此外,如果您在处理消息后不确认消息,那么最终它将返回队列并再次传递。希望您在成功处理消息后确认。不需要任务管理器,只需更好地了解所有 AMQP 旋钮即可。

于 2011-08-20T06:43:06.087 回答