10

長年のデスクトップ アプリケーション開発の後、初めての Web アプリケーションを構築しています (Django/Python を使用していますが、これは完全に一般的な質問かもしれませんが、よくわかりません)。注意してください - これは超初心者の質問かもしれません...

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

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

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

4

4 に答える 4

7

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

  1. 作業をキューに投げて、Web スタックの外にある別の何かに処理させます。

  2. 作業をキューに投げて、Web スタック内の別のものに処理させます。

いずれの場合も、どこか (データベース テーブルなど) のキューにワーク ユニットを作成し、何らかのプロセスに処理させます。

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

項目 2 の利点は、すべてのコードを 1 つの場所 (Web 層) に簡単に保持できることです。実行をトリガーする何かが必要ですが (ワークユニットを処理する Web ページを十分に高いタイムアウトでロードするなど)、さまざまなメカニズムで簡単に実現できます。

于 2009-05-10T02:44:43.873 に答える
2

以来:

1) これはよくある問題です。

2) あなたはあなたのプラットフォームに不慣れです

-- お使いのプラットフォーム用に提供されたライブラリを調べて、タスクを処理するソリューションを見つけることをお勧めします。ジョブのキューイングと処理に加えて、次のことも考慮する必要があります。

1) ワーカーと Web スタック間のステータス通信。これにより、ジョブの完了率を示す Web ページが有効になり、ジョブが進行中であることを人間に保証します。

2) ワーカー プロセスが停止しないようにする方法。

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

4) ジョブ数の増加に伴い、ワーカーを追加して並列処理を行うことはできますか? または、さらに良いことに、ワーカーを他のサーバーに追加できますか?

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

よろしく、

ラリー

于 2009-05-10T03:06:48.733 に答える
1

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

于 2009-05-10T02:42:51.383 に答える
0

Djangoで長いプロセスを実行する:http://iraniweb.com/blog/?p = 56

于 2009-08-14T19:41:02.670 に答える