タスクの大規模な動的コレクション用のスケジューラが必要です。現在、resque-scheduler、rufus-scheduler、およびclockworkを見ています。どちら (またはどの代替手段) を使用するかを選択する際のアドバイスに感謝します。
いくつかの詳細:
- 定期的に実行される大量のタスク (最大 100K) があります。
- 最短の実行期間は 1 時間です。
- 新しいタスクが時々表示される場合があります。既存のタスクは変更または削除される場合があります。
- ここでは、遅延の最小化のスケジューリングはミッション クリティカルではありません (スケーラビリティと持続可能性が最も重要です)。
- タスクの実行は重い操作ではなく、簡単に並列化できます。
要約すると、動的に変化する大規模なタスクのコレクションを処理できる、Ruby プロジェクト用の cron のようなものが必要です。
更新:私は 1 日かけてライブラリのスケジューリングを試しましたが、新しく得た経験を簡単にまとめたいと思います。
Clockwork と resque-scheduler ライブラリは、より詳細なドキュメントを備えたより成熟したプロジェクトであるため、ここでは注意を払いませんでした。Resque-scheduler は rufus-scheduler に基づいていますが、Clockwork はそれに触発されており、どちらも私が探しているソリューションに使用できます。
どちらも、個別のプロセスで実行されることになっているスタンドアロン サービスであり、1 回または繰り返し実行するようにスケジュールされた実質的に無制限の量のタスクを処理できます。タスクはスレッド内で実行されます。
クロックワークの長所:
- データベースから (ActiveRecord または任意のソースを介して) スケジュールされたタスクをロードする機能があります。
- また、DB からのデータ更新をポーリングすることにより、スケジュールされたタスクを動的に更新できます。
時計仕掛けの短所:
- ここでは、DB ポーリングがボトルネックになる可能性があります。
- ポーリング間隔は 1 分 (およびすべてのタスクを再スケジュールする時間) で、少し遅すぎます。
- スケジュールされたタスクのアドレス指定 (スケジュール解除または変更) は文書化されていないため、この機能を使用することは私にはハックのように見えます。
ZeroMQ メッセージによるスケジューリング制御を可能にするために、Clockwork (これはスケジューリングを制御する gem のコア部分です) の代替の Manager クラスを実装しました。したがって、私のプロジェクトのメイン サービスは、「毎日これを実行する」または「タスク #10 のスケジュールを解除する」などのコマンドをスケジューラに送信でき、スケジューラは各リクエストをすぐに実行します。
resque-scheduler の経験はあまりありませんが、現時点では、より優れたソリューションのように見えます。
resque-scheduler の長所:
- Redis ベースの永続性。マニュアルは、スケジュールされたタスクがサービスの再起動後に救出される可能性があると主張しています.
- クリーンな API による動的スケジューリング。
Resque.remove_schedule(name)
特定のタスクをドロップするために呼び出すだけです。 - ウェブ UI。あまり重要ではありませんが、あると便利です。
resque スケジューラ:
- Redis をインストールする必要があります。
よく見ると何か他のものが現れるかもしれませんが、現時点では他に何もありません。
それが私が今持っているものです。ところで、スケジューリング関連の Ruby gems へのリンクをGitHubに多数公開しました。