質問

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

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

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

役に立ちましたか?

解決

Apache のようなメッセージ ブローカー アクティブMQ ここでは理想的な解決策です。

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

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

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

Python で書かれたプロジェクトでは、次のようなものを使用します。 ストンプ 基礎となる通信プロトコルとして。

他のヒント

Webサーバ(任意のウェブサーバ)は、マルチプロデューサー、シングル・コンシューマ・プロセスである。

簡単な解決策は、 wsgiref のか<のhref = "HTTPを構築することです://werkzeug.pocoo.org/」のrel = "nofollowをnoreferrer">バックエンドの要求を処理するWERKZEUG のバックエンドサーバ。

この「バックエンド」サーバはWSGI技術を使用して構築されているので、

、それはフロントエンドWebサーバーに非常に、非常に似ています。除きます。それは(JSONは通常簡単です)HTML応答を生成しません。それ以外は、それは非常に簡単です。

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

あなたが深刻なスケーラビリティの問題に取得する場合は、

は、あなたは、単にマルチスレッドのバックエンドを作成するにはlighttpdのか、他のいくつかのWebエンジンであなたのバックエンドサーバーをラップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top