【问题标题】:amqp exchange typesamqp 交换类型
【发布时间】:2011-05-13 23:18:58
【问题描述】:

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

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

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

干杯,

【问题讨论】:

    标签: python amqp kombu


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多