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

什么';使用Django和Elastic beanstalk实现并行任务的最佳方法是什么?,django,scheduled-tasks,celery,amazon-elastic-beanstalk,amazon-sqs,Django,Scheduled Tasks,Celery,Amazon Elastic Beanstalk,Amazon Sqs,我一直在尝试用django实现芹菜,用SQS实现elastic beanstalk,但我仍然不知道如何在后台启动工作人员,似乎我需要在EB之外创建AMI。我走的路对吗?有没有更好的方法来执行并行任务?更新: 我找到了一个更简单、更稳定的替代解决方案。请看我对这个问题的回答: 我只是需要为我正在进行的一个项目弄清楚这一点。这需要一些修补,但最终解决方案很容易实现。您可以使用ebextension钩子中的files:指令“动态”向服务器添加三个文件。这三个文件是: 启动daeomon的脚本(位于/e

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

更新: 我找到了一个更简单、更稳定的替代解决方案。请看我对这个问题的回答:

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

  • 启动daeomon的脚本(位于/etc/init.d/)
  • 配置守护进程启动脚本的配置文件,位于/etc/default中/
  • 一个shell脚本,用于将环境变量从应用程序复制到celeryd环境并启动服务(部署后)
  • 启动脚本可以是存储库中的默认脚本,因此它直接来自github

    您的项目必须采用该配置。您需要将自己的应用程序名称添加到
    CELERY\u应用程序
    设置中,您可以通过
    CELERYD\u选项
    设置将其他参数传递给工作程序(例如,可以在此处设置并发值)

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

    cat /opt/python/current/env | tee -a /etc/default/celeryd
    
    最后,芹菜工人应该开始了。此步骤需要在代码库部署到服务器之后进行,因此需要在“部署后”激活。您可以通过使用未记录的post-deploy钩子来实现这一点。
    /opt/elasticbeanstalk/hooks/appdeploy/post/
    中的任何shell文件都将由elasticbeanstalk post部署执行。因此,您可以将
    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