我的堆栈是Django 1.3(Python 2.7) + Apache + mod_wsgi
Apache为每个请求生成一个新进程......有时在这些请求中,我必须向RabbitMQ发布一条消息,说明稍后要完成的一些繁重任务(比如通知某人的关注者他们刚刚发布的猫照片)。
发布涉及与RabbitMQ建立连接,这很昂贵。(请参阅这个 SO 问题:RabbitMQ 创建连接是一项昂贵的操作)
我也很遗憾地意识到 Python 无法跨进程共享内存......叹息:(
在这种情况下,如何防止每个 apache 请求创建和关闭 RabbitMQ 连接的开销?
为了清晰,这里使用 RabbitMQ + pika 是我在进程之间共享连接的失败尝试:
def test_view(request):
"""a django view publishing to RabbitMQ"""
connection = Connection.get_shared_connection()
channel = connection.channel()
channel.queue_declare(queue='test_queue', auto_delete=False, durable=True)
channel.basic_publish(exchange='', routing_key='test_queue', body='Hello Rabbit!',
properties=pika.BasicProperties(delivery_mode=2))
print 'SENT:', body
return HttpResponse("published")
class Connection(object):
"""failed attempt to create a singleton"""
_connection = None
@staticmethod
def get_shared_connection(): # return a pika connection
if not Connection._connection:
print 'NEW CONNECTION' # prints NEW CONNECTION with every request
Connection._connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
return Connection._connection
在服务器设置(Django + Apache + mod_wsgi)'NEW CONNECTION'
中打印每个请求test_view
这似乎是任何人在使用 Django 和 RabbitMQ 时都会遇到的问题。一定有办法...
谢谢...任何帮助表示赞赏