2013-04-18 23 views
5

Nginx/Gunicorn/Bottleスタックを使用してGETリクエストを受け取り、簡単な応答を返してからRabbitMQにメッセージを書き込むWSGIアプリケーションを作成しています。まっすぐなボトルでアプリを実行していた場合、アプリがGETを受信するたびにRabbitMQ接続を再利用しています。しかし、Gunicornでは、毎回MQ接続を破壊して再作成しているように見えます。私はその接続を再利用する良い方法があるのだろうかと思っていました。Gunicornワーカー間でオブジェクトを共有する、またはワーカー内でオブジェクトを永続化する

より詳細な情報:

##This is my bottle app 
from bottle import blahblahblah 
import bottle 
from mqconnector import MQConnector 

mqc = MQConnector(ip, exchange) 

@route('/') 
def index(): 
    try: 
    mqc 
    except NameError: 
    mqc = MQConnector(ip, exchange) 

    mqc.publish('whatever message') 
    return 'ok' 

if __name__ == '__main__': 
    run(host='blah', port=808) 
app = bottle.default_app() 

答えて

5

さて、これは整理するために私は少し時間がかかりました。何が起こったのか、新しい要求が届くたびに、Gunicornは私のindex()メソッドを実行していたので、MQConnectorという新しいインスタンスを作成していました。

修正は、クラスではなく、メソッドと変数の束であるように、MQConnectorをリファクタリングすることでした。このようにして、各作業者はMQConnectorの新しいインスタンスを作成するのではなく、毎回同じ MQConnectorを参照しました。最後に、MQConnectorのpublish()関数を渡しました。

#Bottle app 
from blah import blahblah 
import MQConnector 

@route('/') 
def index(): 
    blahblah(foo, bar, baz, MQConnector.publish) 

#MQConnector 
import pika 
mq_ip = "blah" 
exhange_name="blahblah" 

connection=pika.BlockingConnection(.... 
... 

def publish(message, r_key): 
    ... 

結果:今800msを取るために使用されるコールは、4msのを取ります。 90人のGunicorn社の従業員を対象に80コール/秒で最大限に活用していましたが、今では5人のGunicorn社員に対して700コール/秒を最大限に使い果たしています。

関連する問題