使用 Django 和 Elastic beanstalk 实现并行任务的最佳方法是什么?



我一直在尝试用django和SQS实现芹菜,但我仍然不知道我应该如何在后台启动工人,似乎我需要在EB之外创建一个AMI。我走的路对吗?有没有更好的方法来并行处理任务?

更新:我找到了一个更简单、更稳定的替代解决方案。看看我对这个问题的回答:如何使用AWS Elastic Beanstalk运行一个worker ?

我只是需要弄清楚我正在做的一个项目。这需要一些修补,但最终解决方案很容易实现。你可以使用ebeextension钩子中的files:指令"动态"地向服务器添加三个文件。这三个文件是:

  1. 启动daemon的脚本(位于/etc/init.d/)
  2. 配置文件,配置守护进程启动脚本,位于/etc/default/
  3. 一个shell脚本,它将env变量从你的应用程序复制到celeryd的环境中,并启动服务(部署后)

启动脚本可以是存储库中的默认脚本,因此它直接来自github。

配置必须被您的项目采用。你需要在CELERY_APP设置中添加你自己的应用程序的名称,你可以通过CELERYD_OPTS设置传递额外的参数给worker(例如,并发值可以在那里设置)。

然后,您还需要将项目的环境变量传递给worker守护进程,因为它需要与主应用程序相同的环境变量。例如,芹菜工作程序需要能够连接到SQS和S3的AWS密钥。你可以简单地将当前应用程序中的env变量附加到配置文件中:

cat /opt/python/current/env | tee -a /etc/default/celeryd

最后,应该启动celery worker。此步骤需要在代码库部署到服务器之后进行,因此需要在"部署后"激活它。您可以通过使用未归档的部署后钩子来实现这一点。/opt/elasticbeanstalk/hooks/appdeploy/post/中的任何shell文件都将在部署后由elasticbeanstalk执行。因此,可以将service celeryd restart命令添加到该文件夹中的脚本文件中。为方便起见,我将环境变量的复制和start命令放在一个文件中。

请注意,您不能直接使用services:指令来启动守护进程,因为这将尝试在代码库部署到服务器之前启动celeryd worker,因此这将不起作用(因此使用"post"部署脚本)。

好了,所有这些放在一起,唯一需要做的就是在代码库的主目录中创建一个文件./ebextensions/celery.config,其中包含以下内容(当然适用于代码库):

files:
  "/etc/init.d/celeryd":
    mode: "000755"
    owner: root
    group: root
    source: https://raw2.github.com/celery/celery/22ae169f570f77ae70eab03346f3d25236a62cf5/extra/generic-init.d/celeryd
  "/etc/default/celeryd":
    mode: "000755"
    owner: root
    group: root
    content: |
      CELERYD_NODES="worker1"
      CELERY_BIN="/opt/python/run/venv/bin/celery"
      CELERY_APP="yourappname"
      CELERYD_CHDIR="/opt/python/current/app"
      CELERYD_OPTS="--time-limit=30000"
      CELERYD_LOG_FILE="/var/log/celery/%N.log"
      CELERYD_PID_FILE="/var/run/celery/%N.pid"
      CELERYD_USER="ec2-user"
      CELERYD_GROUP="ec2-user"
      CELERY_CREATE_DIRS=1
  "/opt/elasticbeanstalk/hooks/appdeploy/post/myapp_restart_celeryd.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      # Copy env vars to celeryd and restart service
      su -c "cat /opt/python/current/env | tee -a /etc/default/celeryd" $EB_CONFIG_APP_USER
      su -c "service celeryd restart" $EB_CONFIG_APP_USER
services: 
  sysvinit:
    celeryd:
      enabled: true
      ensureRunning: false

相关内容

  • 没有找到相关文章

最新更新