所以我有一个Web服务(flask + MySQL + celery),我正在试图找出将它在Elastic Beanstalk上部署到单独的Web Server和Worker环境/层的正确方法。我目前通过在与Web服务器相同的实例上启动worker(使用this answer)来工作,但显然我想让工作人员在一个单独的自动扩展环境中运行。请注意,芹菜任务依赖于主服务器代码(例如,进行查询等),因此它们不能分开。基本上它是一个有两个入口点的应用程序。
我能想到的唯一方法是让code / config-script检查一些env变量(例如ENV_TYPE =“worker”或“server”)以确定是否启动标准烧瓶应用程序或芹菜工人。 另一个需要注意的是,当我希望/期望它们同时部署时,我必须将我的代码“eb部署”到两个独立的环境(服务器和工作者),因为两者都使用相同的代码库。
如果之前有人问过这个道歉,但是我已经四处寻找并且找不到任何东西,我觉得这很令人惊讶,因为这似乎是一个常见的用例。
编辑刚刚找到this的答案,这解决了我对部署两次的担忧(我猜它在技术上部署一次,然后更新两个环境,很容易编写脚本)。但是我关于如何将应用程序引导到服务器与工作模式的问题仍然存在。
答案 0 :(得分:3)
关于引导,如果为Elastic Beanstalk环境(docs here)设置环境变量,那么在使用脚本重新部署代码时,永远不必再次触摸它。如果创建新环境,则只需添加环境变量。
因此,在启动时,您可以在Python中检查该ENV变量,然后从那里进行引导并加载您需要的内容。
我的偏好不是通过指定“worker”或“server”来创建枚举,而是为ENV_WORKER=1
之类的env变量做一个布尔值。它将消除输入错误的可能性,并且更容易阅读。
if os.environ.get('ENV_WORKER') is not None:
# Bootstrap worker stuff here
else:
# Specific stuff for server here