Celery - 在一台服务器上运行不同的工作人员

Posted

技术标签:

【中文标题】Celery - 在一台服务器上运行不同的工作人员【英文标题】:Celery - run different workers on one server 【发布时间】:2011-07-24 17:02:17 【问题描述】:

我有两种任务: Type1 - 一些高优先级的小任务。 类型 2 - 大量低优先级的繁重任务。

最初我使用默认路由进行简单配置,没有使用路由键。这还不够——有时所有工作人员都忙于 Type2 任务,因此 Task1 被延迟了。 我添加了路由键:

CELERY_DEFAULT_QUEUE = "default"
CELERY_QUEUES = 
    "default": 
        "binding_key": "task.#",
    ,
    "highs": 
        "binding_key": "starter.#",
    ,

CELERY_DEFAULT_EXCHANGE = "tasks"
CELERY_DEFAULT_EXCHANGE_TYPE = "topic"
CELERY_DEFAULT_ROUTING_KEY = "task.default"

CELERY_ROUTES = 
        "search.starter.start": 
            "queue": "highs",
            "routing_key": "starter.starter",
        ,

所以现在我有 2 个队列 - 具有高优先级和低优先级的任务。

问题是 - 如何以不同的并发设置启动 2 个 celeryd?

以前 celery 用于守护进程模式(根据to this),所以只需要 /etc/init.d/celeryd start 的开头,但现在我必须运行 2 个具有不同队列和并发性的不同 celeryd。我该怎么做?

【问题讨论】:

【参考方案1】:

更新:

在 Celery 4.x 中,以下将正常工作:

celery multi start 2 -Q:1 celery -Q:2 starters -A $proj_name

或者,如果您想指定实例的名称,您可以:

celery multi start name1 name2 -Q:name1 celery -Q:name2 queue_name -A $proj_name

但是,如果我们使用celery multi,我发现它不会在屏幕上打印详细日志,因为它似乎只是启动这些实例的脚本快捷方式。

我想如果我们通过给它们不同的节点名称但-A 相同的$proj_name 手动启动这些实例,它也会起作用,尽管这有点浪费时间。

顺便说一句,根据official document,您可以通过以下方式杀死所有芹菜工人:

ps auxww | grep 'celery worker' | awk 'print $2' | xargs kill -9

【讨论】:

【参考方案2】:

似乎答案 - celery-multi - 目前没有很好的记录。

我需要的可以通过以下命令完成:

celeryd-multi start 2 -Q:1 default -Q:2 starters -c:1 5 -c:2 3 --loglevel=INFO --pidfile=/var/run/celery/$USER%n.pid --logfile=/var/log/celeryd.$USER%n.log

我们所做的是启动 2 个工作人员,它们正在侦听具有不同并发的不同队列(-Q:1 是默认值,Q:2 是 starters ) -c:1 5 -c:2 3

【讨论】:

【参考方案3】:

另一种选择是给工作进程一个唯一的名称——使用-n 参数。

我有两个 Pyramid 应用程序在相同的物理硬件上运行,每个都有自己的 celery 实例(在它们自己的 virtualenvs 中)。

他们都有 Supervisor 控制他们,两者都有一个独特的 supervisord.conf 文件。

app1:

[program:celery]                                            
autorestart=true                                            
command=%(here)s/../bin/celery worker -n $HOST.app1--app=app1.queue -l debug
directory=%(here)s     

[2013-12-27 10:36:24,084: WARNING/MainProcess] celery@maz.local.app1 ready.

应用程序2:

[program:celery]                                 
autorestart=true                                 
command=%(here)s/../bin/celery worker -n $HOST.app2 --app=app2.queue -l debug
directory=%(here)s                               

[2013-12-27 10:35:20,037: WARNING/MainProcess] celery@maz.local.app2 ready.

【讨论】:

我想做类似的事情,我有多个工作实例。我试过阅读路由任务页面,但不太明白。您如何将任务分配给每个特定的工作人员? 任务会自动路由到正确的工作人员,因为 'maz' 的工作人员在一个虚拟环境中,而 'clockworkelves' 的工作人员在另一个虚拟环境中。 如果我希望两个实例都从同一个队列中提取,我假设此设置可以工作? 我不确定。虽然如果你看看我的 github 项目。您可以将 nginx 设置为具有两个虚拟主机,这样您就可以确定。 github.com/mazzaroth/initpyr【参考方案4】:

基于上述答案,我制定了以下 /etc/default/celeryd 文件(最初基于此处文档中描述的配置:http://ask.github.com/celery/cookbook/daemonizing.html),该文件适用于在同一台机器上运行两个 celery worker,每个 worker服务不同的队列(在这种情况下,队列名称是“默认”和“重要”)。

基本上,这个答案只是上一个答案的扩展,因为它只是显示了如何做同样的事情,但对于 celery 处于守护进程模式。请注意,我们在这里使用 django-celery:

CELERYD_NODES="w1 w2"

# Where to chdir at start.
CELERYD_CHDIR="/home/peedee/projects/myproject/myproject"

# Python interpreter from environment.
#ENV_PYTHON="$CELERYD_CHDIR/env/bin/python"
ENV_PYTHON="/home/peedee/projects/myproject/myproject-env/bin/python"

# How to call "manage.py celeryd_multi"
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi"

# How to call "manage.py celeryctl"
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl"

# Extra arguments to celeryd
# Longest task: 10 hrs (as of writing this, the UpdateQuanitites task takes 5.5 hrs)
CELERYD_OPTS="-Q:w1 default -c:w1 2 -Q:w2 important -c:w2 2 --time-limit=36000 -E"

# Name of the celery config module.
CELERY_CONFIG_MODULE="celeryconfig"

# %n will be replaced with the nodename.
CELERYD_LOG_FILE="/var/log/celery/celeryd.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"

# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE="settings"

# celerycam configuration
CELERYEV_CAM="djcelery.snapshot.Camera"
CELERYEV="$ENV_PYTHON $CELERYD_CHDIR/manage.py celerycam"
CELERYEV_LOG_FILE="/var/log/celery/celerycam.log"

# Where to chdir at start.
CELERYBEAT_CHDIR="/home/peedee/projects/cottonon/cottonon"

# Path to celerybeat
CELERYBEAT="$ENV_PYTHON $CELERYBEAT_CHDIR/manage.py celerybeat"

# Extra arguments to celerybeat.  This is a file that will get
# created for scheduled tasks.  It's generated automatically
# when Celerybeat starts.
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule"

# Log level. Can be one of DEBUG, INFO, WARNING, ERROR or CRITICAL.
CELERYBEAT_LOG_LEVEL="INFO"

# Log file locations
CELERYBEAT_LOGFILE="/var/log/celerybeat.log"
CELERYBEAT_PIDFILE="/var/run/celerybeat.pid"

【讨论】:

谢谢!这很有帮助。 你刚刚救了我的命,在整个网络上很难找到这个野兽的完整配置。您需要创建一篇博客文章,成千上万的人会很高兴! 请将ask.github.com/celery/cookbook/daemonizing.html 替换为ask.github.io/celery/cookbook/daemonizing.html,因为现有的一个域已被折旧且无法正常工作。

以上是关于Celery - 在一台服务器上运行不同的工作人员的主要内容,如果未能解决你的问题,请参考以下文章

VBS 在一台服务器上运行 .xlsm 工作簿中的 VBA 宏,但在另一台服务器上运行良好

配置apache虚拟主机,实现在一台服务器上运行多个网站

getResource 在一台服务器上返回 null 但在另一台服务器上不返回

配置Apache虚拟主机,实现在一台服务器上运行多个网站

在一台 apache 服务器上设置多个 IP 地址

为啥 django sqlite3 数据库在一台机器上与另一台机器上的工作方式不同?