我一直在尝试用 django 实现 celery,用 SQS 实现弹性 beantalk,但我仍然不知道应该如何在后台启动工作人员,看来我需要在 EB 之外创建一个 AMI。我什至走的是正确的道路吗?有没有更好的方法来处理并行任务?
1 回答
更新: 我找到了一个更简单、更稳定的替代解决方案。请参阅我在此问题中的回答:您如何使用 AWS Elastic Beanstalk 运行工作程序?
我只需要为我正在从事的项目弄清楚这一点。这需要一些修补,但最终解决方案很容易实施。files:
您可以使用ebextension 挂钩中的指令将三个文件“动态”添加到服务器。这三个文件是:
- 启动守护进程的脚本(位于 /etc/init.d/)
- 一个配置文件,配置守护进程启动脚本,位于 /etc/default/
- 将环境变量从您的应用程序复制到 celeryd 环境并启动服务的 shell 脚本(部署后)
启动脚本可以是存储库中的默认脚本,因此它直接来自 github。
您的项目必须采用该配置。您需要将自己的应用程序名称添加到CELERY_APP
设置中,并且可以通过设置将其他参数传递给工作人员CELERYD_OPTS
(例如,可以在此处设置并发值)。
然后,您还需要将项目的环境变量传递给工作守护程序,因为它需要与主应用程序相同的环境变量。一个例子是 celery 工作人员需要能够连接到 SQS 和可能的 S3 的 AWS 密钥。您可以通过简单地将环境变量从当前应用程序附加到配置文件来做到这一点:
cat /opt/python/current/env | tee -a /etc/default/celeryd
最后应该启动芹菜工人。这一步需要在代码库部署到服务器之后进行,因此需要在“发布”部署后激活。您可以通过使用未记录的部署后挂钩来做到这一点。任何 shell 文件/opt/elasticbeanstalk/hooks/appdeploy/post/
都将由 elasticbeanstalk 部署后执行。因此,您可以将service celeryd restart
命令添加到该文件夹中的脚本文件中。为方便起见,我将环境变量的复制和启动命令放在一个文件中。
请注意,您不能services:
直接使用该指令来启动守护程序,因为这将尝试在代码库部署到服务器之前启动 celeryd 工作程序,因此这将不起作用(因此是“发布”部署脚本)。
好的,所有这些放在一起,唯一需要的是./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
希望这可以帮助。