关于使用pika连接rabbitmq的几点总结
最近项目需要学习python,用rabbitmq开发了一个queue系统。过程还算比较顺利,由于资料并不多,很多问题的解决都是分析源码来完成的。分析最多的就是怎么让pika自动重连,最终明白rabbitmq的存在意义就是为了解决网络不稳定,所以,发送端应该和rabbitmq部署在稳定网络环境下,没涉及重连问题。接收端网络出问题后,pika是增加了一个回调函数,在当前逻辑处理完成后才会报出异常。应用层捕获到异常后,重新初始化即可。
另外,发现了pika自身的三个问题,这里发上来和大家讨论一下,也给以后用pika的人提供点参考,pika版本是0.9.5:
1. blocking_connection.py 81行 log.error(SOCKET_TIMEOUT_MESSAGE),log未定义。参考其它代码,猜测为pika.log。
2. connection.py 639行 est_frames_behind = self.outbound_buffer.size / avg_frame_size,虽然前面有代码self.frames_sent += 1,但中间调用了self._flush_outbound(),会回调重连。如果用户的重连策略是直接连接,会导致连接被初始化,self.frames_sent置为0,发生除0异常。
3.channel.basic_consume(callback,...)
channel.start_consuming()
对于这种用法,文档的意思应该是第一句进行初始化,第二句调用后,才开始循环逻辑处理。实际发现,当队列里已经存在消息时,第一句话调用后就会触发一次回调,处理消息,导致程序尚未初始化完毕时就已经开始工作。具体原因未去研究,我的解决方案是把第一句放在初始化代码的最后一行,即使回调了也已经初始化完毕。
这三个问题是最近发现的,还没有抽出时间去查找原因,有没有熟悉pika的一起来讨论一下这几个问题。
键盘上的A到Z
12 years, 2 months ago