1

私は Python/Redis ベースの API のプロトタイプを作成しており、Bottle を使用して JSON を提供していますが、残念ながらそのままの状態の Bottle は、負荷がかかり、同時実行性が高い場合にパフォーマンスが低下します。実際のトラフィックでの最初のテストでは、python スクリプトが終了せずにクラッシュします。これは、API が応答せず、再起動しないことを意味します*。

パフォーマンスとドキュメントの観点から、Python/Redis API をスケーリングするための現在の最適なソリューションは何ですか。bottle+greenlet ソリューションは文書化が不十分であり、私のような Python 初心者にとって実装が容易ではありません。tornado は良いと聞きましたが、Redis との統合は Bottle よりも遅いとのことです。

*ボトルがHTTPリクエストの本文をクライアントに送信できない場合、サーバーは「[Errno 32] Broken pipe」エラーでバグアウトするようです.これは、サーバーが動作を停止する悪い理由のようです.

4

3 に答える 3

3

この件に関するボトルのドキュメントを既に読んだことがありますか?

ボトルは重い負荷の下で非常にうまく機能します.1日あたり何百万ものリクエストを処理するために使用しています. (デフォルトでは、Bottle は を使用するだけwsgiref.WSGIServerで、これはシングルスレッドであり、高パフォーマンスのアプリケーション向けではありません。)

本番環境では、Apache でmod_wsgiを使用して Bottle を実行しています。(これがそのです。) 非常にうまくスケールします。ボトル自体が追加するオーバーヘッドはごくわずかです。

つまり、パフォーマンスのボトルネックはボトルが原因ではなく、HTTP サーバーが原因です。スケーラブルなサーバーを選択すると、パフォーマンスが向上します。

それが役立つことを願っています!


編集 2015

私は、Bottle には限界があり、同時実行性 (コアごとに数千の QPS) を高めるには、Bottle では対応できないことを発見しました。(ボトルネックは、ボトルのスレッド ローカル ストレージの使用と gevent の TLS 実装との間の相互作用のようです。) 私は使用falconしていませんが、ボトルよりも高負荷ではるかに優れたパフォーマンスを発揮します。

于 2013-11-05T14:16:48.910 に答える
1

あなたが初心者なら、イベント化された (twisted/tornado/gevent/eventlet...) ライブラリから始めるべきではありません。

あなたの知らない場所へと導いてくれます!

スケールする必要がある場合は、マシンを追加し、ロード バランサーで負荷を分散します。

于 2013-11-05T11:09:35.187 に答える
0

アプリケーションの特定の要件によっては、マルチスレッド化された Python WSGIServerの実装を試すことでメリットが得られる場合があります。(私のブログのページはこちらです。)

のドロップイン交換なwsgiref.WSGIServerので、最小限の変更でボトルと一緒に使用できます。

基本的に、これは Apache のworkerMPM に少し似ています (ただしプロセスは 1 つです)。各要求は、事前に割り当てられた N 個のスレッドのプールから独自のスレッドによって処理されます。

ボトル アプリで同時実行が必要であるが、Apache を使用したり、他の重要なサーバー依存関係を持ち込んだりしたくない場合に、これが役立つことがわかりました。

次に例を示します。

import bottle
import time

app = bottle.Bottle()

@app.route('/')
def foo():
    time.sleep(2)
    return 'hello, world!\n'

app.run(server=MTServer, host='0.0.0.0', port=8080, thread_count=3)

# Here, app is nonblocking; it will handle up to 3 requests concurrently.
# A 4th concurrent request would block until one of the first 3 completed.

試してみて、どのように機能したかを教えてください。(提案と貢献は大歓迎です。ありがとう!)

(以前の回答よりもやや過激であるため、これを別の回答として追加します。)

于 2013-11-05T14:35:11.880 に答える