Celery任务、工作进程与队列的组织

3 投票
2 回答
1067 浏览
提问于 2025-04-18 02:00

我有一些独立的任务,目前我把它们放在不同的工作者那里。

为了让大家更容易理解,我来举个例子。假设我有三个独立的任务,分别是 sleep(睡觉)、eat(吃饭)、smile(微笑)。每个任务可能需要在不同的配置下运行。所以,我觉得把这些任务分开放在不同的文件夹里,配上不同的工作者会更好。有些任务可能还需要在不同的服务器上运行。

我计划将来添加更多的任务,而每个任务都会由不同的开发者来实现。

在这种情况下,每个任务都有多个工作者在处理。

现在,问题来了,我想问的是:

当我启动三个 smile 任务时,其中一个会被 smile 的工作者抓取并执行。但下一个任务却会被 eat 的工作者抓取,结果就不会被执行了。

那么,通常的做法是什么呢?我是不是应该把每个任务放到不同的队列里,让工作者只监听自己的队列呢?

2 个回答

0

在类似的设置中,我决定为不同的任务使用特定的队列。这样,我就可以决定哪个工作者监听哪个队列(而且这个设置还可以动态改变!)。

1

这个答案要看几个因素:

  • 命令的顺序需要保持吗?

如果需要保持顺序,最好的办法是把命令放成一种序列化的消息,这样每条取到的消息就可以在你的应用程序中按顺序执行。如果顺序不是问题,你可以尝试在一个主题交换中发布不同类型的消息,让不同的工作者按照预定的模式来接收这些消息。这样的话,你可以轻松地添加一个新任务,比如“喝水”,而不需要改动现有的运输结构或工作者。

  • 你打算在不同的机器上扩展队列以提高处理能力吗?

如果你的任务流量非常大(也就是频率很高),那么为每种任务类型创建不同的队列可能是个好主意。这样,当你需要扩展时,可以把每个队列放在兔子集群的不同节点上。

撰写回答