在elasticbeanstalk

时间:2016-10-19 00:48:48

标签: python django celery elastic-beanstalk celerybeat

我正在尝试找出构建Django应用程序的最佳方法,该应用程序使用Celery在自动扩展的AWS ElasticBeanstalk环境中处理异步和计划任务。

到目前为止,我只使用了Celery + Celerybeat的单个实例Elastic Beanstalk环境,这非常好用。但是,我希望在我的环境中运行多个实例,因为每个实例都会崩溃,并且在实例重新启动之前需要花费大量时间,但我无法将当前的体系结构扩展到多个实例实例,因为Celerybeat应该只在所有实例中运行一次,否则Celerybeat安排的每个任务都将被多次提交(对于环境中的每个EC2实例一次)。

我已阅读过有关多种解决方案的信息,但所有这些解决方案似乎都存在一些问题,而这些问题并不适用于我:

  • 使用django cache + locking:这种方法更像是一个快速解决方案,而不是真正的解决方案。如果您有大量计划任务并且需要添加代码来检查每个任务的缓存,则这不是解决方案。此外,任务仍然会多次提交,这种方法只能确保重复项的执行停止。
  • 对ebextensions使用leader_only选项:最初工作正常,但如果环境中的EC2实例崩溃或被替换,这将导致根本没有运行Celerybeat的情况,因为领导者仅在创建时定义一次环境。
  • 为Elastic Beanstalk工作层中的异步任务创建一个新的Django应用程序:很好,因为Web服务器和工作人员可以独立扩展,并且Web服务器性能不受工作人员执行的巨大异步工作负载的影响。但是,此方法不适用于Celery,因为工作层SQS守护程序会删除邮件并将邮件正文发布到预定义的URL。此外,我不喜欢有一个完整的额外Django应用程序,需要从主应用程序导入模型,如果在主应用程序中修改了任务,则需要单独更新和部署。

如何在没有任务复制的分布式Elastic Beanstalk环境中将Celery与计划任务一起使用?例如。如何确保在Elastic Beanstalk环境中始终在所有实例中运行一个实例(即使Celerybeat的当前实例崩溃)?

还有其他方法可以达到这个目的吗?在Django中使用Elastic Beanstalk的工作层环境的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

我想您可以将芹菜节拍单独选出来。

您的自动伸缩组运行多个django实例,但是celery不包含在伸缩组的ec2配置中。

您应该为芹菜拍子设置不同的实例集(或只有一个)

答案 1 :(得分:-4)

如果有人遇到类似问题:我最终切换到django的不同队列/任务框架。它被称为django-q,并在不到一个小时的时间内完成了工作。它具有我需要的所有功能,并且比Celery更好的Django集成(因为djcelery不再有效)。

Django-q非常易于使用,也比巨大的Celery框架更轻巧。我只能推荐它!