gpt4 book ai didi

python - rabbitmq 过滤器工作队列

转载 作者:行者123 更新时间:2023-11-28 21:50:38 30 4
gpt4 key购买 nike

我一直在阅读 rabbitMQ 教程,我正在寻找一些关于我应该使用的设置的帮助。

我有一个任务列表 1-50,我想在一组 4 台计算机上运行一次(并且只运行一次),每台计算机运行一个 worker。我已经在 https://www.rabbitmq.com/tutorials/tutorial-two-python.html 设置了一个类似于教程 2 的模板。

不是所有的电脑都可以运行所有的任务(他们还没有安装软件)

我想要实现的是允许过滤发送给工作人员的任务的设置。

我阅读了有关如何使用路由在广播情况下实现此目的的教程,但是我不太明白我需要做什么才能将其映射回类似于教程 2 的更简单的推送模型(因为我不想要广播工作)。

在未来的某个时候,我希望能够根据负载动态地调整每个盒子上的工作人员数量。

我应该使用的最佳模型是什么?是否有任何好的教程或文章可供您推荐以了解此方法?

干杯,罗布

最佳答案

RabbitMQ 不提供有选择地使用队列中消息的方法。队列上的消费者将始终有机会接收该队列中的任何给定消息。因此,您必须将消息预先过滤到队列中,以便完成特定类型的工作。一旦你这样做了,你的消息消费者只会从队列中消费他们可以处理的工作类型。

假设您有 3 种类型的工作要做:

  • 工作A
  • 工作B
  • 求职

如果您尝试将所有三种类型的工作的消息推送到一个队列中,那么您的消费者必须清楚它可以处理哪些消息。这是行不通的。如果您的消费者无法处理消息,则它必须 nack 将消息放回队列。但是不能保证您的消息会被可以处理它的不同消费者接收。它可能会返回到同一个消费者,消费者随后会再次将其nack 返回到队列中。

这是 selective consumer anti-pattern在 RabbitMQ 中。

相反,您需要将消息预先过滤到特定类型工作的队列中。您可以通过在交换 -> 队列绑定(bind)中使用路由键来做到这一点。

使用上面的三种作业类型,您可以进行如下设置:

| exchange | routing key | queue || -------- | ----------- | ----- || jobs     | job.a       | job.a || jobs     | job.b       | job.b || jobs     | job.c       | job.c |

使用这些消息的代码需要知道它可以处理哪种类型的作业。然后,它只订阅该类型工作的队列。

假设您有 2 台计算机是消息使用者。计算机 1 可以处理 JobA 和 JobB。计算机 2 可以处理 JobB 和 JobC。在这种情况下,最终有 1 台计算机处理 JobA,2 台计算机处理 JobB,1 台计算机处理 JobC。总共只有 2 台计算机,但每台计算机都处理多项工作……不过,只有他们知道如何处理的工作。

您保证 Computer1 仅通过订阅 job.a 和 job.b 的队列来获得 JobA 和 JobB。这同样适用于您系统中的任何其他消费者。

完成此操作后,扩展工作器的数量就很容易了。在 JobA 上你需要更多的 worker 吗?没问题。只需添加作业的另一个消费者。一个队列。

希望对您有所帮助!

关于python - rabbitmq 过滤器工作队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31750966/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com