【问题标题】:Django - Share a RabbitMQ Connection between All Processes that apache creates per request?Django - 在 apache 每个请求创建的所有进程之间共享 RabbitMQ 连接?
【发布时间】:2012-10-24 18:47:12
【问题描述】:

我的堆栈是 Django 1.3(Python 2.7) + Apache + mod_wsgi

Apache 为每个请求生成一个新进程...有时在这些请求中,我必须发布一条消息给 RabbitMQ 关于一些繁重的任务稍后再做(比如通知某人的关注者他们刚刚发布的猫照片)。

发布涉及到RabbitMQ的连接,这很昂贵。 (请参阅这个 SO 问题:RabbitMQ create connection is an expensive operation

我也很遗憾地意识到 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 时都会遇到的问题。一定有办法……

谢谢...任何帮助表示赞赏

【问题讨论】:

  • 嗨,你是怎么解决这个问题的?我和你面临同样的问题。

标签: python django apache rabbitmq pika


【解决方案1】:

Apache 不会为每个请求生成一个新进程。

您可能会误以为这是因为在嵌入式模式下它可以是多进程 Web 服务器,因此不同的请求可能会在单独的进程中得到处理。

我会建议您使用 mod_wsgi 守护程序模式并使用单个多线程进程,但不幸的是,您的代码不是线程安全的,因为您不保护同时从多个线程创建全局套接字连接。但是,仅此一项也无济于事,因为如果多个线程同时尝试使用该一个连接,则可能会导致问题。所以你真的需要每个线程都有一个连接对象。

我建议您阅读以下内容以了解有关 Apache/mod_wsgi 的不同进程/线程模型的一些背景知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多