Celery任务、工作进程与队列的组织
我有一些独立的任务,目前我把它们放在不同的工作者那里。
为了让大家更容易理解,我来举个例子。假设我有三个独立的任务,分别是 sleep
(睡觉)、eat
(吃饭)、smile
(微笑)。每个任务可能需要在不同的配置下运行。所以,我觉得把这些任务分开放在不同的文件夹里,配上不同的工作者会更好。有些任务可能还需要在不同的服务器上运行。
我计划将来添加更多的任务,而每个任务都会由不同的开发者来实现。
在这种情况下,每个任务都有多个工作者在处理。
现在,问题来了,我想问的是:
当我启动三个 smile
任务时,其中一个会被 smile
的工作者抓取并执行。但下一个任务却会被 eat
的工作者抓取,结果就不会被执行了。
那么,通常的做法是什么呢?我是不是应该把每个任务放到不同的队列里,让工作者只监听自己的队列呢?
2 个回答
0
在类似的设置中,我决定为不同的任务使用特定的队列。这样,我就可以决定哪个工作者监听哪个队列(而且这个设置还可以动态改变!)。
1
这个答案要看几个因素:
- 命令的顺序需要保持吗?
如果需要保持顺序,最好的办法是把命令放成一种序列化的消息,这样每条取到的消息就可以在你的应用程序中按顺序执行。如果顺序不是问题,你可以尝试在一个主题交换中发布不同类型的消息,让不同的工作者按照预定的模式来接收这些消息。这样的话,你可以轻松地添加一个新任务,比如“喝水”,而不需要改动现有的运输结构或工作者。
- 你打算在不同的机器上扩展队列以提高处理能力吗?
如果你的任务流量非常大(也就是频率很高),那么为每种任务类型创建不同的队列可能是个好主意。这样,当你需要扩展时,可以把每个队列放在兔子集群的不同节点上。