【问题标题】:rabbitmq filter work queuerabbitmq 过滤工作队列
【发布时间】:2015-07-31 16:30:57
【问题描述】:

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

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

并非所有计算机都可以运行所有任务(它们还没有安装软件)

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

我阅读了有关如何在广播情况下使用路由来实现这一点的教程,但是并没有完全理解我需要做什么才能将其映射回类似于教程 2 的更简单的推送模型(因为我不想要广播作业)。

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

我应该使用什么最好的模型,有没有什么好的教程或文章可以推荐来学习这种方法?

干杯, 抢

【问题讨论】:

    标签: python rabbitmq


    【解决方案1】:

    RabbitMQ 没有提供选择性地使用队列中的消息的方法。队列中的消费者将始终有机会接收该队列中的任何给定消息。因此,您必须将消息预过滤到队列中以完成特定类型的工作。完成此操作后,您的消息消费者只会从队列中消费他们可以处理的工作类型。

    假设你有 3 种工作要做:

    • 工作A
    • 工作B
    • 工作C

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

    这是 RabbitMQ 中的selective consumer anti-pattern

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

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

    |交流|路由键 |队列 | | -------- | ------------ | ----- | |职位 |工作.a |工作.a | |职位 |工作.b |工作.b | |职位 |工作.c |工作.c |

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

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

    您保证 Computer1 仅通过订阅 job.a 和 job.b 的队列来获取 JobA 和 JobB。您系统中的任何其他使用者也是如此。

    完成此操作后,扩展工作人员的数量就很容易了。您需要更多的 JobA 工人吗?没问题。只需添加 job.a 队列的另一个使用者。

    希望有帮助!

    【讨论】:

    • 感谢您提供如此详细且解释清楚的答案,这是有道理的,我会采用这种方法:) 链接也不错^^
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多