0

레일스로 작성된 Elastic Beanstalk/RDS/EC2/등을 사용하는 AWS 응용 프로그램이 있습니다.AWS/EBS Rails의 백그라운드 작업

응용 프로그램에는 특정 시간이 지나면 삭제해야하는 일부 데이터베이스 항목이 있으며 배경 작업을 만드는 데 보석을 사용하려고합니다.

그러나 내가 보는 모든 보석은 프로그래밍 방식으로 cron 작업을 만드는 방법 일뿐입니다. Elastic Beanstalk을 사용하면 사용중인 서버 인스턴스가 확장/변경되므로 cron 작업이 손실됩니다. Rails에서 백그라운드 작업을 설정하는 또 다른 방법이 있습니까?

+0

레일스에 익숙하지 않지만 약간의 도움이 될 수 있습니다. https://github.com/collectiveidea/delayed_job – error2007s

+0

이것은 가까이에 있지만 일정한 간격으로 실행되도록 설정해야합니다. 매분, 매일 오후 11시 등) – jfefes

+0

RDS 버전은 언급하지 않았지만 MySQL 또는 MariaDB의 경우에는 내장 된 [이벤트 스케줄러] (https://dev.mysql.com/doc/refman /5.6/en/event-scheduler.html) ... –

답변

0

일반적으로 container_commands을 사용하여이 문제를 해결합니다.이 정보는 응용 프로그램의 .ebextensions 폴더에있는 .config 파일에서 구성 할 수 있습니다. The idea is that the code is executed on so-called 'leader' instance in your webservers pool. It is not considered as a bulletproof solution but does the job and mostly works (it will fail when autoscaling comes into play though). 분산 된 뮤텍스 잠금 (redis-mutex 또는 데이터베이스 백업)을 사용하여 잠금을 얻은 프로세스를 제외한 모든 프로세스를 차단합니다.

#create config file, use numbers/names that suit your needs: 
#.ebextensions/02_container_commands.config 
container_commands: 
    01_cron_tasks: 
    command: "cat .ebextensions/cron_tasks.txt > /etc/cron.d/yourapp && chmod 644 /etc/cron.d/yourapp" 
    leader_only: true 

크론은 .ebextensions/cron_tasks.txt 파일은 crontab 정의를 넣어하고 힘내의 repo에이 일을 추가,이를 선택합니다.

0 5 * * * root bash -l -c "su -m webapp; cd /var/app/current && rake your_rake_task" 

그것은 슬픈 일이지만 아마존 AWS 팀은 여전히 ​​탄성 콩 줄기 환경에서 레일과 스케줄링 배경 작업에 대한 적절한, 편리한 솔루션을 마련하지 않은 것으로 보인다. Worker Tier에서는 자신의 cron 구현에서 메시지를 수신하는 전용 엔드 포인트를 앱에 추가해야합니다. 이는 핵심 애플리케이션 로직 (라우트, 컨트롤러)에 호스팅 관련 코드를 추가해야하고 더 많은 서버가 실행되어야하기 때문에 바람직하지 않습니다.

Heroku와 같은 플랫폼과 비교할 때 AWS의 또 다른 단점은 Sidekiq과 같은 Redis 기반 대기열 처리 시스템과 cron과 같은 스케줄러를 통해 생성 될 수있는 주문형 작업자에 대한 원 클릭 지원이 부족하다는 것입니다.