我一直在尝试用Django实现芹菜,并使用SQS实现弹性beantalk,但是我仍然不知道该如何在后台启动工作程序,似乎我需要在EB之外创建AMI。我是否在走正确的道路?有更好的方法来执行并行任务吗?

最佳答案

更新:
我找到了一个更简单,更稳定的替代解决方案。看到我对这个问题的回答:How do you run a worker with AWS Elastic Beanstalk?

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

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

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

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

    然后,您还需要将项目的环境变量传递给worker守护程序,因为它需要与主应用程序相同的环境变量。一个示例是芹菜工作者必须能够连接到SQS以及可能连接到S3的AWS密钥。您只需将当前应用程序中的env var附加到配置文件即可:
    cat /opt/python/current/env | tee -a /etc/default/celeryd
    

    最后,芹菜工作者应该开始工作。在将代码库部署到服务器之后,需要执行此步骤,因此需要在“后期”部署中激活它。您可以使用未记录的部署后挂钩来做到这一点。 /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
    

    希望这可以帮助。

    10-06 01:20