autoscaling AWS ElasticBeanstalk 환경에서 Celery를 사용하여 Django 응용 프로그램을 구성하여 비동기 및 예약 된 작업을 처리하는 가장 좋은 방법을 찾으려고합니다.elasticbeanstalk에서 autoscaled django 응용 프로그램을위한 셀레 비트의 여러 인스턴스
지금까지 Celery + Celerybeat와 함께 Elastic Beanstalk 환경을 한 번 사용했지만이 작업은 완벽하게 잘 수행되었습니다. 그러나 모든 인스턴스가 충돌하고 인스턴스가 백업 될 때까지 많은 시간이 걸리기 때문에 여러 인스턴스가 내 환경에서 실행되기를 원하지만 현재 아키텍처를 둘 이상의 인스턴스로 확장 할 수 없기 때문에 Celerybeat는 모든 인스턴스에서 한 번만 실행되도록되어 있으므로 셀리 비트가 예약 한 모든 작업은 여러 번 제출됩니다 (환경의 모든 EC2 인스턴스에 대해 한 번).
내가 여러 솔루션에 대해 읽고,하지만 그들 모두가 나를 위해 작동하지 않는 문제를 갖고있는 것 같다 :
- 장고 캐시 + 잠금을 사용 :이 방법은 더 빠른 수정에 비해 같다 진정한 해결책. 예약 된 작업이 많고 모든 작업에 대한 캐시를 확인하는 코드를 추가해야하는 경우 솔루션이 될 수 없습니다. 또한 작업은 여러 번 제출되지만이 방법은 중복 실행이 중지되는지 확인합니다.
- ebextensions와 함께 leader_only 옵션 사용 : 처음에는 잘 작동하지만 환경의 EC2 인스턴스가 충돌하거나 대체되는 경우 리더가 생성시 한 번만 정의되기 때문에 Celerybeat가 전혀 실행되지 않는 상황이 발생할 수 있습니다 환경의
- Elastic Beanstalk 작업자 계층에서 비동기 작업만을위한 새로운 Django 응용 프로그램 만들기 : 웹 서버와 작업자를 독립적으로 확장 할 수 있고 작업자가 수행 한 거대한 비동기 작업로드의 영향을받지 않기 때문에 웹 서버 성능이 좋지 않습니다. 그러나 작업자 계층 SQS 데몬이 메시지를 제거하고 메시지 본문을 미리 정의 된 URL에 게시하기 때문에이 방법은 Celery에서 작동하지 않습니다. 또한 주 앱에서 모델을 가져와야하는 Django 앱이 추가로 필요하다는 생각이 들지 않으므로 주 앱에서 작업을 수정하면 별도로 업데이트하고 배포해야합니다.
작업 중복없이 분산 된 Elastic Beanstalk 환경에서 예약 된 작업으로 Celery를 사용하는 방법은 무엇입니까? 예 : 어떻게 Elastic Beanstalk 환경에서 (심지어 Celerybeat가있는 현재 인스턴스가 충돌하더라도) 정확히 하나의 인스턴스가 모든 인스턴스에서 실행되고 있는지 확인할 수 있습니까?
다른 방법이 있습니까? Django에서 Elastic Beanstalk의 Worker Tier Environment를 사용하는 가장 좋은 방법은 무엇입니까?
솔루션을 찾았습니까? 나는 동일한 문제가 있었음 –