皮卡连接在3次心跳后关闭

Siv*_*nBH 6 python amqp rabbitmq pika

我正在编写一个接收HTTP请求(使用Tornado)的脚本,解析它们,并使用pika将它们发送到RabbitMQ代理.

代码如下所示:

def main():
    conn_params = pika.ConnectionParameters(
        host=BROKER_NAME,
        port=BROKER_PORT,
        ssl=True,
        virtual_host=VIRTUAL_HOST,
        credentials=pika.PlainCredentials(BROKER_USER, BROKER_PASS),
        heartbeat_interval=HEARTBEAT_INTERVAL
    )
    conn = pika.BlockingConnection(conn_params)
    channel = conn.channel()

    # Create the web server which handles application requests.
    application = tornado.web.Application([
        (URL_BILLING, SomeHandler, dict(channel=channel))
    ])

    # Start the server
    application.listen(LISTENING_PORT)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

如您所见,我打开一个连接和通道,并将通道传递给创建的处理程序的任何实例,其目的是节省流量并避免为每个请求打开新的连接/通道.

我遇到的问题是连接在3次心跳后关闭.我使用Wireshark来弄清问题是什么,但我只能看到服务器发送PSH(我假设这是心跳)并且我的脚本回复了ACK.这种情况发生在HEARTBEAT_INTERVAL之间3次,然后服务器只发送一个FIN并且连接终止.

知道为什么会这样吗?另外,我应该保持连接打开还是更好地为我需要发送的每条消息创建一个新连接?

谢谢您的帮助.

更新:我查看了RabbitMQ日志,它说: Missed heartbeats from client, timeout: 10s 我认为服务器是为了向客户端发送心跳,以确保它的答案,这与我使用Wireshark观察到的一致,但是从这个日志看来它似乎是客户端本来要向服务器报告,而不是相反,客户端显然不会报告.我说得对吗?

更新:想出来,有点.阻塞连接(我使用的是)无法发送心跳,因为它阻塞了.如本期所述,heartbeat_interval参数仅用于协商与服务器的连接,但客户端实际上并不发送心跳.既然如此,那么与鼠兔保持长期连接的最佳方式是什么?即使我没有指定heartbeat_interval,服务器默认每10分钟发送一次心跳,因此连接将在30分钟后死亡......

use*_*085 4

对于未来的访客:

Pika 有一个使用心跳的异步示例: http://pika.readthedocs.org/en/0.10.0/examples/asynchronous_publisher_example.html

对于 Tornado 特定的情况,此示例展示了如何在 pika 的异步模型中使用 Tornado 的 IOLoop: http://pika.readthedocs.org/en/0.10.0/examples/tornado_consumer.html