非同期ジョブを実行する目的でデータベースに残るdelayed_job
とbackground_job
のような宝石は本当に好きではありません。それはちょうど私にとっては汚いようです。一時的なものはデータベースに属しません。
大規模なスケーラビリティの必要がない場合でも、私は非同期タスクを処理するためのメッセージキューのファンです。メッセージキューは複雑なシステムにとって理想的な「lingua franca」です。メッセージキューでは、ほとんどの場合、構築している技術や言語に制限はありません。統合が常に大きな苦痛である「エンタープライズ」環境では、並行性の低いメッセージキューの使用のメリットはおそらく最も顕著です。さらに、非同期ワークフローに複数のステップが含まれる場合は、メッセージキューが理想的です。 RabbitMQは私の個人的なお気に入りです。
たとえば、検索エンジンを構築するシナリオを考えてみましょう。インデックスに登録するURIを送信できます。当然のことながら、要求に応じてページを取得して索引付けすることは望ましくありません。つまり、メッセージキューの周りに構築します。フォームの送信先はURIを取り、それをインデックスに登録するメッセージキューにスローします。次の利用可能なスパイダプロセスは、キューからURIをポップし、ページを取得し、すべてのリンクを見つけ出し、未知の場合はキューに戻し、コンテンツをキャッシュします。最後に、キャッシュされたコンテンツを処理するインデクサプロセス用の新しいメッセージが2番目のキューにプッシュされます。 Indexerプロセスは、そのメッセージをキューからポップし、キャッシュされたコンテンツを索引付けします。過度に単純化された検索エンジンはたくさんの作業ですが、あなたはその考えを得ています。
実際のデーモンは、私自身のライブラリ(ChainGang)には部分的ですが、実際はKernel.fork()のラッパーで、セットアップとティアダウンのコードを処理するのに便利な場所です。それはまだあまり行われていません。デーモンの部分は、メッセージキューよりもはるかに重要ではありません。
Rails環境に関しては、読者のための練習として残した方がよいでしょう。なぜなら、メモリ使用量は長期実行プロセスの重要な要素になるからです。あなたはあなたがする必要のないものをロードしたくない。ちなみに、これはDataMapperがActiveRecordのバットを確実にキックする1つの領域です。環境の初期化は十分に文書化されており、依存関係の数が大幅に少なくなり、キット全体とキャブドールが大幅に現実的になります。
私がcron + rakeについて気に入らないことの1つは、レーキが実質的に標準出力に印刷されることが保証され、cronジョブが出力を生成する場合にcronが過度に混乱する傾向があることです。私はすべてのcronタスクを適切な名前のディレクトリに入れて、それらをラップするレーキタスクを作成して、手動で実行するのは簡単です。レーキがこれを行うのは残念です。なぜなら、依存関係を利用するという選択肢が本当に好きだからです。いずれにしても、cronを介してスクリプトを実行するのではなく、スクリプトを直接参照するだけです。
私は現在、非同期プロセスに大きく依存するWebアプリケーションを構築中です。私は、Railsを使用しないことを非常に嬉しく思っています。
私は、Yehudaがこの回答を受け入れている間に、私が他の人にとって最高になるためには何が最善のものかは考えていないと付け加えたいと思います。ひどいシステム管理者としての私の優先課題は、システム管理者の作業を減らすことです:)より高性能なソリューションが必要な場合や、必要な場合は、もっと難解なキューイングシステムを試してみてください。 –