1

Apache(mod_wsgi、prefork)によって提供されるPylonsWebアプリケーションがあります。Apacheが原因で、アプリケーションコードを同時に実行する複数の個別のプロセスがあります。「ライブ」応答時間を改善するために、アプリケーションがバックグラウンドで処理するために延期したい重要ではないタスクのいくつか。だから私はタスクキューについて考えています。多くのApacheプロセスがこのキューにタスクを追加し、単一の別個のPythonプロセスがそれらを1つずつ処理してキューから削除します。

キューは、停電やサーバーの再起動などによってキューに入れられた未処理のタスクが失われないように、ディスクに永続化することが望ましいです。問題は、そのようなキューを実装するための合理的な方法は何でしょうか。

私が試したことについては、単純なSQLiteデータベースと、キュー項目を格納するための単一のテーブルから始めました。負荷テストで、同時実行性のレベルを上げると、予想どおり「データベースロック」エラーが発生し始めました。迅速な「n」ダーティな修正は、SQLiteをMySQLに置き換えることでした。並行性の問題をうまく処理しますが、私がしなければならない単純なことにはやり過ぎのように感じます。キュー関連のDB操作も、プロファイリングレポートに目立つように表示されます。

4

2 に答える 2

1

ここでは、ApacheのActiveMQのようなメッセージブローカーが理想的なソリューションです。

パイプラインは次のようになります。

  • HTTPリクエストの処理を担当するアプリケーションプロセスは、応答をすばやく生成し、優先度の低い重いタスクをAMQキューに送信します。
  • 1つ以上の別のプロセスがサブスクライブされてAMQキューを消費し、これらの重いタスクで実行することを目的としています。

ActiveMQはまだ永続ストレージで消費されていないメッセージを格納するため、キューの永続性の要件はすぐに満たされます。さらに、複数のHTTPアプリ、複数のコンシューマーアプリ、およびAMQ自体をそれぞれ異なるマシンに自由にデプロイできるため、拡張性が非常に高くなります。

基盤となる通信プロトコルとしてSTOMPを利用して、Pythonで記述されたプロジェクトでこのようなものを使用します。

于 2010-03-12T14:39:19.823 に答える
0

Webサーバー(任意のWebサーバー)は、複数のプロデューサー、単一のコンシューマーのプロセスです。

簡単な解決策は、バックエンド要求を処理する ためにwsgirefまたはWerkzeugバックエンドサーバーを構築することです。

この「バックエンド」サーバーはWSGIテクノロジを使用して構築されているため、フロントエンドWebサーバーと非常によく似ています。それ外。HTML応答は生成されません(通常、JSONの方が単純です)。それ以外は、とても簡単です。

このバックエンドのRESTfulトランザクションを設計します。URIの解析、承認、認証など、さまざまなWSGI機能をすべて使用します。RESTfulサーバーは通常セッションを提供しないため、通常はセッション管理は必要ありません。

スケーラビリティの深刻な問題が発生した場合は、バックエンドサーバーをlighttpdまたはその他のWebエンジンでラップするだけで、マルチスレッドのバックエンドを作成できます。

于 2010-03-12T14:39:43.333 に答える