我使用Pika在Tornado和RabbitMQ中集成Websocket。它成功地在各种队列上运行了一段时间。然后引发以下错误:
关键:鼠兔。连接:关闭时试图发送帧
我已经从https://github.com/haridas/RabbitChat/blob/master/tornado_webapp/rabbit_chat.py
我已经彻底检查了我的代码,但是不明白为什么它会引发这样的错误。有人能帮忙排除故障吗?
谢谢!
还要注意改变背压倍增器并不能解决问题。所以要寻找一个真正的解决方案
有时鼠兔连接只是因为网络故障而终止。您应该向PikaClient
类添加代码,以便在连接断开时自动处理重新连接。类似这样的内容(未经测试,但应该让您了解):
def on_connection_closed(self, connection, reply_code, reply_text):
"""This method is invoked by pika when the connection to RabbitMQ is
closed unexpectedly. Since it is unexpected, we will reconnect to
RabbitMQ if it disconnects.
"""
self.channel = None
if self._closing: # Don't reconnect if you explicitly closed the connection.
pass
else:
logger.warning('Connection closed, reopening in 5 seconds: (%s) %s',
reply_code, reply_text)
self.connection.add_timeout(5, self.reconnect)
def reconnect(self):
"""Will be invoked by the IOLoop timer if the connection is
closed. See the on_connection_closed method.
"""
# Create a new connection
self._reconnecting = True
self.connection = self.connect()
由于消费者和生产者正在排队-从特定队列中退出队列,因此由于共享队列上的多个异步线程系统,PIKA Client在某一点上卡住了。
因此,如果其他人遇到同样的问题,请遵循代码中的几个检查:
-
您有多少个连接?有多少频道?有多少人在排队?有多少生产者-消费者?(这些可以通过sudo rabbitmqctl list_queues等来确定)
-
一旦您了解了您正在使用的结构,跟踪正在运行的事务。对于多个用户的多个请求
-
因此,在每个事务上,打印线程动作,以便您了解鼠兔活动。由于这些线程以异步方式运行,如果错误地超载,将导致pika客户端崩溃。因此创建一个线程管理器来控制线程。
解决方案由Gavin Roy &Michael kishin,来自Pika &RabbitMQ。