2009-05-10 7 views
9

長年のデスクトップアプリケーションの開発(私はDjango/Pythonを使用していますが、これは完全に一般的な質問です。だから、注意してください - これは超初心者の質問かもしれ...Webアプリケーションのバックグラウンドプロセス、初心者向けの設計に関する質問

私のユーザープロセスの1つは、(すなわち、ユーザは、サーバがそれを処理するために〜10分を必要とし、何かを入力)サーバーで重い処理を必要とします。デスクトップアプリケーションでは、ユーザー入力をミューテックスによって保護されたキューに投げ込み、専用のバックグラウンドスレッドを、そのミューテックスを使用するキューで低優先度のブロックで実行させます。

しかし、Webアプリケーションでは、すべてがHTTP要求との同期に向いているようです。

データベースを自分のキューとして使用すると仮定して、バックグラウンドプロセスを実行するためのベストプラクティスアーキテクチャは何ですか?

答えて

7

これには2つの考え方があります(少なくとも)。

  1. はキューに仕事を投げて、あなたのウェブスタックそれを扱う外部の何かを持っています。

  2. キューで作業をスローし、Webスタック内の別のものに処理させてください。

どちらの場合でも、ワークユニットをどこかのキュー(データベーステーブルなど)に作成して、処理単位で処理します。

私は通常、これらのことを処理する専用のWindowsサービスがある番号1で動作します。また、SQLジョブなどでこれを行うこともできます。

2のメリットは、すべてのコードを1つの場所(Web層)に保存することが容易にできることです。実行をトリガーするもの(作業ユニットを十分に高いタイムアウトで処理するWebページをロードするなど)が必要ですが、さまざまなメカニズムで簡単に実行できます。

1

一般的に言えば、特にWebサーバーに負荷がかかる場合は、別のサーバーでバックグラウンドプロセスを実行します。

2

はので:

1)これは共通の問題、

2)あなたは、あなたのプラットフォーム

に新しいしている - 私はあなたがにあなたのプラットフォームのために貢献したライブラリに見えることを示唆していますタスクを処理するソリューションを見つけます。ジョブのキューイングと処理に加えて、次の点も考慮する必要があります。ワーカーとWebスタック間のステータス通信。

これは、どのようにワーカープロセスが死なないことを確実にするためなどの仕事が進んでいる人間、

2)を保証する、仕事のために完了した割合の数を示してWebページを可能にします。

3)ジョブにエラーがある場合、ワーカープロセスは定期的に自動的に再試行しますか? ジョブが失敗した場合、あなたまたは運用担当者に通知されますか?

4)ジョブが増えるにつれ、追加のワーカーを追加して並列性を高めることができますか? さらに、他のサーバーにワーカーを追加できますか?

Django/Pythonでうまく解決できない場合は、別のプラットフォームから自分のソリューションに移植することも検討できます。私はRuby on Railsにdelayed_jobを使用します。ワーカープロセスはrunitによって管理されます。ジャンゴに長いプロセスを実行

よろしく、

ラリー