2016-07-29 16 views
0

私はAWS上でElastic Beanstalk/RDS/EC2/etcを使ってRailsで書かれたアプリケーションを持っています。AWS/EBSバックグラウンドジョブを

アプリには一定の時間が経過すると削除する必要のあるデータベースエントリがあり、宝石を使ってバックグラウンドタスクを作成することを考えていました。

しかし、私が見るすべての宝石は、プログラムで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). ロックを取得したプロセス以外のすべてのプロセスをブロックするには、分散型Mutexロック(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が、これを選ぶだけで.ebextensions/cron_tasks.txtファイルにcrontabの定義を入れて、あなたのGitのレポにも、この1を追加します。

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

それは悲しいですが、Amazon AWSのチームはまだElastic Beanstalkで環境でのRailsでのスケジューリングバックグラウンドジョブのための適切な、便利なソリューションを考え出すていなかったようです。 Worker Tierでは、独自のcron実装からのメッセージをリッスンする専用のエンドポイントをアプリケーションに追加する必要があります。これは、ホスティング固有のコードをコアアプリケーションロジック(ルート、コントローラ)に追加する必要があり、さらに多くのサーバーを実行する必要があるため、悪いことです。

Herokuのようなプラットフォームと比較した場合のAWSのもう一つの欠点は、SidekiqのようなRedisでサポートされているキューイングシステムと、cronのようなスケジューラを使って生成できるオンデマンドワーカーに対するワンクリックサポートの欠如です。

関連する問題