8

我正在使用 Nginx / Gunicorn / Bottle 堆栈编写一个 WSGI 应用程序,该堆栈接受一个 GET 请求,返回一个简单的响应,然后向 RabbitMQ 写入一条消息。如果我通过直接的 Bottle 运行应用程序,那么每次应用程序收到 GET 时,我都会重用 RabbitMQ 连接。但是,在 Gunicorn 中,工作人员似乎每次都在销毁和重新创建 MQ 连接。我想知道是否有重用该连接的好方法。

更详细的信息:

##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()
4

1 回答 1

10

好的,这花了我一点时间来整理。发生的事情是,每次收到新请求时,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):
  ...

结果:过去需要 800 毫秒的调用现在需要 4 毫秒。我曾经在 90 名 Gunicorn 工人中以每秒 80 次呼叫的速度最大化,而现在我在 5 名 Gunicorn 工人中以每秒约 700 次呼叫的速度最大化。

于 2013-05-01T19:29:20.080 回答