RoRにrakeタスクまたはrubyコードを異なる時間に2回実行する方法があるかどうかを知りたいです。たとえば、ユーザーが登録した場合、3日後にタスクを実行し、1週間後に同じタスクを実行しますが、それ以上は実行しません(「プロセスを停止」)。私はcrontabと、Resque、Stalker、Starlingなどの宝石を見ていましたが、この宝石が誰に役立つのかはっきりとはわかりません。私は、ユーザーごとにデーモンを実行し、タスクの実行をカウントすることを考えています。問題は、デーモンがリソースを「食べている」間ずっとアクティブになることです。できるだけ少ないリソースを使用する方法はありますか?後でHerokuで実行したいと思います。
3 に答える
私は通常、レコードの日付列(first_reminder_sent_at、user_responed_at、week_reminder_sent_atなど)を使用してこのタイプの問題を解決します。この場合、最初のアイテムの日付、ユーザーの応答、および1週間後のアイテムの日付。
レーキタスクを呼び出すためのcronタスクを作成します-3日以上、1週間未満、ユーザーが応答していない、日付が設定されていないすべてのユーザーを確認します。バックグラウンドジョブをキューに入れます。ジョブはメール(またはタスクが何であれ)を送信してから、レコードに日付フィールドを設定します。
rakeタスクを呼び出すためのcronタスク-1週間以上経過していて、ユーザーが応答しておらず、日付が設定されていないすべてのユーザーを調べます。リマインダーを送信し、バックグラウンドジョブで日付を設定します。
いつでもcronを試して、自分の作業を実行するrakeタスクを作成します。データベースに、rakeタスクがいつどのようにアクションを実行するかを示すトリガーフィールドを作成します。
Posixシステムにはat
、後で実行するジョブをスケジュールするための非常に簡単な方法であるコマンドがあります。他の回答で概説されているように、アプリケーションベースのキューイングメカニズムを使用して後の作業をスケジュールすることに問題はありませんが。at
はホスト固有であるため、クラスターを実行している場合、特にホストが一時的な場合は、おそらく不適切です。