我一直在阅读rabbitMQ教程,我正在寻找一些关于我应该使用的设置的帮助.
我有一个任务列表1-50,我希望在一组4台计算机上运行一次(并且只运行一次),每台计算机都运行一个工作程序.我在https://www.rabbitmq.com/tutorials/tutorial-two-python.html上设置了类似于教程2的模板
并非所有计算机都可以运行所有任务(他们并未安装所有软件)
我想要实现的是允许过滤发送给工作人员的任务的设置.
我阅读了有关如何在广播情况下使用路由实现此目的的教程,但是我并不完全掌握将映射回到类似于教程2的简单推送模型需要做的事情(因为我不想广播工作).
在某些方面,我希望能够根据负载动态扩展每个盒子上的工人数量.
什么是我应该使用的最佳模型,是否有任何好的教程或写作,你可以建议了解这种方法?
干杯,罗布
RabbitMQ没有提供有选择地使用队列消息的方法.队列中的消费者将始终有机会接收该队列中的任何给定消息.因此,您必须将消息预过滤到队列中,以便完成特定类型的工作.完成后,您的消息使用者只会从队列中消耗他们可以处理的工作类型.
假设您有3种类型的工作要做:
如果您尝试将所有三种类型的工作的消息推送到单个队列中,那么您的消费者必须明智地知道它可以处理哪些类型.这不起作用.如果消费者nack无法处理,则消费者必须将消息重新发送到队列.但是,无法保证您的消息将由可以处理它的其他消费者接收.它可能会返回到同一个消费者,然后nack再次返回队列.
这是RabbitMQ中的选择性消费者反模式.
相反,您需要将消息预过滤到特定类型工作的队列中.您可以通过在exchange - > queue bindings中使用路由键来完成此操作.
使用上面的三种作业类型,您可以进行如下设置:
| exchange | routing key | queue | | -------- | ----------- | ----- | | jobs | job.a | job.a | | jobs | job.b | job.b | | jobs | job.c | job.c |
使用这些消息的代码需要知道它可以处理哪种类型的作业.然后,它只订阅该类型工作的队列.
假设您有两台消息使用者的计算机.计算机1可以处理JobA和JobB.计算机2可以处理JobB和JobC.在这种情况下,最终会有1台计算机处理JobA,2台计算机处理JobB,1台计算机处理JobC.总共只有2台计算机,但每台计算机都处理多个工作......但只有他们知道如何处理的工作.
您保证Computer1仅通过订阅job.a和job.b的队列来获取JobA和JobB.您系统中的任何其他消费者也是如此.
完成此操作后,可以轻松扩展工作人员数量.JobA需要更多员工吗?没问题.只需添加job.a队列的另一个使用者.
希望有所帮助!