我正在编写一个接收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()
如您所见,我打开一个连接和通道,并将通道传递给创建的处理程序的任何实例,其目的是节省流量并避免为每个请求打开新的连接/通道。
我遇到的问题是在 3次心跳之后关闭连接。我使用Wireshark来弄清问题是什么,但我只能看到服务器发送PSH(我假设这是心跳)并且我的脚本回复了ACK。这种情况发生在HEARTBEAT_INTERVAL之间3次,然后服务器只发送一个FIN,连接就死了。
知道为什么会这样吗?另外,我应该保持连接打开还是为我需要发送的每条消息创建一个新连接更好?
感谢您的帮助。
更新:我查看了RabbitMQ日志,它说:
Missed heartbeats from client, timeout: 10s
我认为服务器是为了向客户端发送心跳,以确保它的答案,这与我使用Wireshark观察到的结果一致,但是从这个日志中看来它是客户端,它是要向服务器报告,而不是换句话说,客户显然没有报告。我这样做了吗?
更新:想出来,等等。阻塞连接(我使用的是)无法发送心跳,因为它阻塞了。如this issue中所述,heartbeat_interval
参数仅用于协商与服务器的连接,但客户端实际上并不发送心跳。既然如此,那么与鼠兔保持长期连接的最佳方式是什么?即使我没有指定heartbeat_interval
,服务器默认每10分钟发送一次心跳,因此连接将在30分钟后死亡......
答案 0 :(得分: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