所以我在Django Elastic Beanstalk应用程序中有一个功能如下:
在我刚刚设置本地cron作业的测试实例中。我刚刚在我的Django应用程序的特定URL上调用wget
,它将运行命令。
我的问题是如何在多实例Elastic Beanstalk应用程序中处理这个问题。我的EB应用程序只有一个实例应该运行此命令。我想避免数据库上的竞争条件和多个实例对外部API的冗余调用。即只有一个实例应该写入数据库。
然而,谷歌搜索显示设置cron工作是很尴尬的,特别是如果你像我这样的新EB。最有希望的探测方法似乎是cron.yaml
方法,但似乎没有一个例子可以在网上的任何地方设置一个cron worker环境。
我的理解是:
我的问题是你如何确保只有一个实例运行此命令?我是否对cron.yaml
的工作原理有正确的认识,或者我有什么遗漏
答案 0 :(得分:3)
只有一个实例将运行该命令,因为cron作业实际上并不在cron守护程序中运行。
很少有概念可以帮助您快速了解亚马逊的Elastic Beanstalk心态。
队列中的消息一次只能通过工作环境中一个的实例获取一次。
现在,cron.yaml
文件实际上只是告诉领导者在计划中指定的时间在队列中创建具有特殊属性的消息。然后,当它找到此消息时,它仅作为对指定URL的POST请求被分派到一个实例。
当我在工作环境中使用Django时,我创建了一个cron
应用程序,其中包含映射到我想要的操作的视图。例如,如果我想定期轮询Facebook端点,我可能会在views.py中调用/cron/facebook/poll/
函数poll_facebook()
如果我有一个cron.yaml如下,它会每小时轮询Facebook一次:
version: 1
cron:
- name: "pollfacebook"
url: "/cron/facebook/poll/"
schedule: "0 * * * *"