2016-07-29 92 views
0

我在AWS上使用用Rails編寫的Elastic Beanstalk/RDS/EC2/etc上的應用程序。Rails中的AWS/EBS後臺作業

該應用程序有一些數據庫條目需要在特定時間後刪除,並且正在考慮使用gem創建後臺任務。

但是,我看到的所有寶石只是以編程方式創建cron任務的方式。使用Elastic Beanstalk時,正在使用的服務器實例將進行縮放/更改,因此cron任務將丟失。有沒有另一種方法來在Rails中設置後臺作業?

+0

不熟悉Rails,但看看這可能是一些幫助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 

cron將會挑這個,只是把crontab中定義.ebextensions/cron_tasks.txt文件,這也是一個添加到您的Git回購。

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

這是可悲的,但它似乎是亞馬遜AWS團隊仍然沒有拿出對Elastic魔豆的環境中使用Rails調度後臺作業合適,方便的解決方案。他們的Worker Tier要求您在應用程序中添加一個專用的端點,以監聽來自其cron實現的消息。這很糟糕,因爲它迫使您將特定於主機的代碼添加到核心應用程序邏輯(路由,控制器),並且需要運行更多的服務器。

與Heroku等平臺相比,AWS的另一個缺點是缺少一鍵支持Redis支持的排隊系統,如Sidekiq和可以通過類似cron的調度程序產生的按需工作人員。