2016-07-29 18 views
1

私はShopifyストアと統合されたPython/Djangoで電子商取引プラグインアプリケーションを作成しています。店舗の顧客が決済に達するたびに、Shopifyはショッピングカートと宛先アドレスのデータを使用してアプリにリクエストを送信し、私のアプリは配送料金情報を返す必要があります。問題は、リクエストを送信してレスポンスを送信する間に外部API呼び出しを行う必要があり、適度な負荷の下でWSGIワーカーが非常に簡単に処理されることです。長い外部APIレスポンスを持つDjango WSGIワーカーを設定する

私は不必要にスケールアウトすることを避けようとしています。私は、単にcores * 2 + 1を過ぎて自分の人数を増やすべきですか?この数を調整するためにCPU負荷を監視するだけですか?私が探している理想的なCPU負荷はどれくらいですか?私は同じアプリケーションからブロックされていない短いリクエストを渡しているので、これは問題を引き起こすでしょうか?

Djangoはこの種のユースケースにはあまり適していませんか?もしそうなら、良い一致は何ですか、そして、私のアプリ全体を書き直すことなくそれを適用する最良の方法は何ですか?

EDIT:私のWSGIサーバを使用すると、ここにgunicornのパフォーマンスを向上させるために行うことができます物事のカップルがありますGunicorn

+0

どのような種類の「労働者」を使用していますか?何wsgiサーバはこれですか? –

+0

Gunicorn、更新された質問。 – Julien

答えて

1

です。あなたの設計を考えれば、あなたの労働者がIOに縛られていることはほぼ確実です。だから最初は、ワーカーごとに複数のスレッドを使用するように設定することができます。ドキュメントは2-4を提案します。

ただし、サイトのIOバインディングの性質から、非同期ワーカータイプのいずれかを使用することでさらに改善が得られるようです。詳細については、the design docsを参照してください。私はgeventとeventletの間で選択することはあまりないと思いますが、私は個人的に前者から良い結果を得ました。

+1

geventやeventletを使用すると、動作の仕方がわからなくても悪化する可能性があることに注意してください。単純に切り替えるだけで物事が魔法のように改善されることはありません。ブロックするモジュールや、geventやeventletでパッチを当てていないモジュールを使用しないようにして、問題なく動作するようにする必要があります。ブロックし、グリーンレットを意識していないものがあれば、プロセス全体がハングアップし、すべての並行処理のメリットが失われます。マルチスレッドを使用するには常に安全です。 –

関連する問題