0

최근에 수동으로 스케일링하는 EC2 환경에서 내 Symfony 프로젝트를 Elastic Beanstalk로 옮겼습니다. 문제가 발생했습니다.Amazon ElasticBeanstalk의 단일 인스턴스 cronjob

나는 크롤 (cron) 작업을 통해 만기가 지난 많은 구독을 가져 와서 주문을 작성하고 요금을 청구하려고 시도합니다.이 작업은 일괄 적으로 잡아서 단일 서버에서만 실행된다는 것이 매우 중요합니다. Cron이 중복 실행되면 동일한 구독에 대해 여러 번 요금이 부과됩니다.

수동으로 확장 환경에서, 나는 단지 crontab을 가졌고 잠수함을 실행 한 주 서버를 가지고 있었지만 여기서는 실행할 수없는 것 같습니다.

기본 서버가없는 자동 크기 조정 환경에서이를 설정하는 방법에 대한 제안 사항이 있으십니까?

JMSJobQueueBundle을 살펴 봤지만 관리자가 crontab의 단일 인스턴스 만 실행하고있는 것으로 보입니다. 이는 자동 크기 조정 환경에서 중복 될 수 있습니다.

x 분마다 외부 서버에서 내 API에 ping을 보내고 ping하는 단일 인스턴스에서 작업을 시작하는 것이 가장 좋습니다. 이것은 또 다른 실패 지점을 소개하는 것 같습니다.

답변

2

경고와 마찬가지로 해결하려는 문제는 사소한 것이 아닙니다.

몇 가지 옵션 : 당신은 MySQL 데이터베이스에 연결하는 경우, 트랜잭션의 시작 부분에 잠금 장치 (https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock)을 취득하고 마지막에 잠금을 해제

  1. . 이렇게하면 여러 cronjob이 동시에 코드를 실행할 수 없게됩니다. 모든 것이 SQL 내부에서 처리되는 경우에만 작동합니다.

  2. 언급 한대로 AWS Lambda + CloudWatch Events를 사용하여 x 분마다 람다 함수를 트리거 할 수 있으며 람다는 http (s)를 통해 스크립트를 트리거 할 수 있습니다. 그러나 람다는 그것이 한 번 그렇게 정확하게 수행되는 것을 보장하지 않으므로 안전하지 않습니다.

  3. 분산 잠금 (예 : etcd, consul, redis, ...)을 획득하고 MySQL 데이터베이스에없는 것과 비슷한 방식으로 구현할 수있는 서비스를 사용하십시오. 그래도 이걸로 정확히 한 번이나 그렇게 할 수는 없습니다.

  4. cronjob을 별도의 ec2 인스턴스에 두십시오 (이 ec2 인스턴스가 작동하지 않을 경우 아무 것도 실행되지 않습니다. 그러나이 요구 사항을 이해하는 한 스크립트는 이후 15 분 실행하고 여전히 모든 일에 잡는다 수 있습니다.

분산 시스템에서 더 많은 "현대"접근 방식은 액션 나무 등을하는 것입니다.

+0

나는 노동자를 설정하려고 시도합니다. –