web-dev-qa-db-ja.com

cronジョブの代替手段、またはスケジュールされたタスクのパフォーマンスを改善するその他の方法

私は、ユーザーが特定のアクションを実行し、適切な条件がテーブルで満たされた後にユーザーが評価を得るソーシャルネットワーキングWebサイトに取り組んでいます。レーティングは、「総労働時間」と「獲得した合計ポイント」に基づいて計算されます。 cron phpには、7つのテーブルをINNER JOINするSQLがあります。これを最新に保つために、cronを実行してテーブルエントリを1日に1回チェックして値を更新します。

これは合計15個のcronの1つにすぎません。それらのいくつかはマンドリルで電子メールを送るだけです、1つはニュースレターを送信し、近​​い将来より多くのニュースレターがあります。

現在、サイトにアクティブなイベントがある場合(イベントネットワーキングサイトの一種ですが、管理機能とオンサイト管理機能があります)、約2000人以上のユーザーとそのデータがこれらのプロセスに関与しています。しかし、ますますすぐにあります。

以前に2つのcronが原因でサーバーを本当に台無しにした2つのサーバークラッシュがありました。そのうちの1つはユーザーの評価を更新するものです。問題があった2番目のcronは、ユーザーが2つのテーブルで作業した合計時間を更新することでした。これらのような他のデータを自動的に更新するには、さらに多くのスケジュールされたタスクが必要になります。

いくつかの調査の後、私は-である脂肪コントローラーを見つけました

他のプログラム(通常はスクリプト)を繰り返し実行するために使用される並列実行ハンドラー。CRONに少し似ています。これは、通常、繰り返し実行する必要があるWebサイトのバックグラウンド処理を実行するスクリプトの実行を処理するように設計されています。

(ここで述べたように- http://fat-controller.sourceforge.net/index.html

以前にcronジョブとして使用された5つのphpスクリプトを実行するパフォーマンスを、それらをcronジョブとして実行する場合と比較する方法に関するアイデアはありますか?また、指定した時間/日で実行する必要があるcronジョブの一部(つまり、週末ではなく、ユーザーにメールを送信するなど)は、Fat Controllerなどのツールで可能ですか?または、年に1回実行するようにタスクを設定することは可能ですか?

この種のプロセスを処理するための最良の方法に関する推奨事項は、本当にありがたいです。

3
Ekin

私はいつもcronが好きでした。私はそれが理解しやすいと思います、そして(ほとんどの* nixアプリのように)それは1つのことだけをします-現在の日付/時刻がパターンに一致したときにスクリプトを起動します。

ただし、これらのスクリプトが行うことは、まったく別の話です。それらが適切に記述され、テストされている場合、それらは素晴らしいものになる可能性があります-日常業務の重要なコンポーネントです。

不十分に書かれていると、(他のアプリと同様に)システムのパフォーマンスが低下する可能性があります。

私が見たcron置換のほとんどは、「より安定した」または「よりパフォーマンスの高い」ものではなく、使いやすく作成されています。 cron自体は非常に安定しており、負荷のかかる作業を行わないため、パフォーマンスは実際には問題になりません。

もし私があなただったら、cronに実行を要求しているスクリプトをよく見て、データベースも調べます。高価なデータベース呼び出しがあったり、インデックスが欠けていたりすることがあります。

2
Dan Pichelman

私はRailsサーバーを実行します。このサーバーは、かなりの数のバックグラウンド処理を処理する必要があります。私たちは、実行する必要のあるジョブとそれらが実行する処理の量、またはスケジュールする方法に応じて、さまざまなアプローチを使用します。それら。

開始するには、ジョブを同時に実行できる必要があります。基本的には、すべてのジョブをユーザーとして扱い、トランザクションやレコードロックなど、複数のユーザーが使用するのと同じテクニックを使用するようにします。

基本的に3つのアプローチがあります。

シンプルなcronジョブ。これは、非常に定期的に(1時間ごと、1日に1回)実行され、多くの処理が必要なジョブに使用します(奇妙な理由により、Railsスクリプトをコマンドラインから実行し、同じスクリプトを実行します) aRailsコントローラー内では、後者のケースでメモリが多く使用されることがあり、実行速度も少し遅くなります)

2番目のアプローチは、「ファットコントローラー」と呼ばれるものです。このコントローラーは、cronジョブによって呼び出されます(cron.hourlyから単純なcurlまたはwgetを実行するだけです)。これは、特定の時間に実行する単純なタスクの場合、または他のジョブが実行されない場合にのみ可能です。 (ここでは簡単なトリックを使用します。コントローラーが起動すると、一時ファイルが書き込まれ、終了時に削除されます。起動時にファイルが存在する場合、ファイルはまったく実行されず、データのインポートに予想よりも時間がかかる場合の競合を回避します) 。

3番目のバリアントはquequです。基本的には、後でまたは夜に実行できるいくつかの要求を書き込むテーブル(メールの送信、画像の変換...)です。その後、別のcronジョブがこのキューでの作業を開始します。 (Railsには、この種の作業を整理するのに役立ついくつかの素晴らしいライブラリがあります。)

2