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