rabbitmq 过滤器工作队列
rabbitmq filter work queue
我一直在阅读 rabbitMQ 教程,我正在寻找有关我应该使用的设置的帮助。
我有一个任务列表 1-50,我希望在一组 4 台计算机上 运行 执行一次(且仅执行一次),每台 运行 一个工人。我已经在 https://www.rabbitmq.com/tutorials/tutorial-two-python.html
设置了一个类似于教程 2 的模板
并不是所有的电脑都能运行所有的任务(他们还没有安装软件)
我想要实现的是允许过滤发送给工作人员的任务的设置。
我阅读了有关如何在广播情况下使用路由实现此目的的教程,但是我不太明白我需要做什么才能将其映射回类似于教程 2 的更简单的推送模型(因为我不知道我不想广播招聘信息)。
在某个时候,我希望能够根据负载动态地调整每个盒子上的工人数量。
我应该使用的最佳模型是什么?是否有任何好的教程或文章可供您推荐以了解此方法?
干杯,
罗布
RabbitMQ 不提供有选择地使用队列中消息的方法。队列上的消费者将始终有机会接收该队列中的任何给定消息。因此,您必须将消息预先过滤到队列中,以便完成特定类型的工作。一旦你这样做了,你的消息消费者只会从队列中消费他们可以处理的工作类型。
假设您有 3 种类型的工作要做:
- 工作A
- 工作B
- 工作 C
如果您尝试将所有三种类型的工作的消息推送到一个队列中,那么您的消费者必须清楚它可以处理哪些消息。这是行不通的。如果您的消费者无法处理消息,则它必须 nack
将消息放回队列。但是不能保证您的消息会被可以处理它的不同消费者接收。它可能会返回到同一个消费者,然后消费者会 nack
它再次回到队列中。
这是 RabbitMQ 中的 selective consumer anti-pattern。
相反,您需要将消息预先过滤到特定类型工作的队列中。您可以通过在交换 -> 队列绑定中使用路由键来做到这一点。
使用上面的三种作业类型,您可以进行如下设置:
| 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。系统中的任何其他消费者也是如此。
完成此操作后,扩展 worker 的数量就很容易了。在 JobA 上你需要更多的工人吗?没问题。只需添加 job.a 队列的另一个消费者。
希望对您有所帮助!
我一直在阅读 rabbitMQ 教程,我正在寻找有关我应该使用的设置的帮助。
我有一个任务列表 1-50,我希望在一组 4 台计算机上 运行 执行一次(且仅执行一次),每台 运行 一个工人。我已经在 https://www.rabbitmq.com/tutorials/tutorial-two-python.html
设置了一个类似于教程 2 的模板并不是所有的电脑都能运行所有的任务(他们还没有安装软件)
我想要实现的是允许过滤发送给工作人员的任务的设置。
我阅读了有关如何在广播情况下使用路由实现此目的的教程,但是我不太明白我需要做什么才能将其映射回类似于教程 2 的更简单的推送模型(因为我不知道我不想广播招聘信息)。
在某个时候,我希望能够根据负载动态地调整每个盒子上的工人数量。
我应该使用的最佳模型是什么?是否有任何好的教程或文章可供您推荐以了解此方法?
干杯, 罗布
RabbitMQ 不提供有选择地使用队列中消息的方法。队列上的消费者将始终有机会接收该队列中的任何给定消息。因此,您必须将消息预先过滤到队列中,以便完成特定类型的工作。一旦你这样做了,你的消息消费者只会从队列中消费他们可以处理的工作类型。
假设您有 3 种类型的工作要做:
- 工作A
- 工作B
- 工作 C
如果您尝试将所有三种类型的工作的消息推送到一个队列中,那么您的消费者必须清楚它可以处理哪些消息。这是行不通的。如果您的消费者无法处理消息,则它必须 nack
将消息放回队列。但是不能保证您的消息会被可以处理它的不同消费者接收。它可能会返回到同一个消费者,然后消费者会 nack
它再次回到队列中。
这是 RabbitMQ 中的 selective consumer anti-pattern。
相反,您需要将消息预先过滤到特定类型工作的队列中。您可以通过在交换 -> 队列绑定中使用路由键来做到这一点。
使用上面的三种作业类型,您可以进行如下设置:
| 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。系统中的任何其他消费者也是如此。
完成此操作后,扩展 worker 的数量就很容易了。在 JobA 上你需要更多的工人吗?没问题。只需添加 job.a 队列的另一个消费者。
希望对您有所帮助!