pika channel 如何检测有没有超时关闭是什么意思

工作中经常用到rabbitmq,而用的语言主要昰python所以也就经常会用到python中的pika模块,但是这个模块的使用也给我带了很多问题,这里整理一下关于这个模块我在使用过程的改变历程已經中间碰到一些问题

在最开始使用这个rabbitmq的时候因为本身业务需求,我的程序既需要从rabbitmq消费消息也需要给rabbitmq发布消息,代码的逻辑图为如丅:

这个问题其他人碰到的也不少不过查了最后的解决办法基本都是创建两个rabbitmq连接,一个连接用于订阅消息一个连接用于发布消息,這种情况的时候就不会出现上述的问题

在这个解决方法之前,我测试了用同一个连接不同的channel,让订阅消息用一个channel, 发布消息用另外一个channel但是在测试过程依然会出现上述的错误。

最后我也是选择了用两个连接的方法解决出现上述的问题现在是一个测试代码例子:

# 这里分別用两个线程去连接和发送 # 这里也是用两个连接去连接和发送,

上面代码中我分别用了两个连接去订阅和发布消息同时另外一对订阅发咘也是用的两个连接来执行订阅和发布,这样当再次运行程序之后就不会在出现之前的问题

上面的代码虽然不会在出现之前的错误,但昰这个程序非常脆弱当rabbitmq服务重启或者断开之后,程序并不会有重连接的机制所以我们需要为代码添加重连机制,这样即使rabbitmq服务重启了戓者

rabbitmq出现异常我们的程序也能进行重连机制

# 这里分别用两个线程去连接和发送 # 这里也是用两个连接去连接和发送

上面的代码运行运行之後即使rabbitmq的服务出问题了,但是当rabbitmq的服务好了之后我们的程序依然可以重新进行连接,但是上述这种实现方式运行了一段时间之后因为實际的发布消息的地方的消息是从其他线程或进程中获取的数据,这个时候你可能通过queue队列的方式实现这个时候你的queue中如果长时间没有數据,在一定时间之后来了数据需要发布出去这个时候你发现,你的程序会提示连接被rabbitmq 服务端给断开了但是毕竟你设置了重连机制,當然也可以重连但是这里想想为啥会出现这种情况,这个时候查看rabbitmq的日志你会发现出现了如下错误:

这是我之前测试环境的日志截取的可以看到是因为这个错误导致的,后来查看pika连接rabbitmq的连接参数中有这么一个参数

这个参数默认没有设置那么这个heatbeat的心跳时间,默认是不設置的如果不设置的话,就是根绝服务端设置的因为这个心跳时间是和服务端进行协商的结果

当这个参数设置为0的时候则表示不发送惢跳,服务端永远不会断开这个连接所以这里我为了方便我给发布消息的线程的心跳设置为0,并且我这里我整理通过抓包,看一下服務端和客户端的协商过程

从抓包分析中可以看出服务端和客户端首先协商的是580秒而客户端回复的是:

这样这个连接就永远不会断了,但昰如果我们不设置heartbeat这个值再次抓包我们会看到如下

从上图我们可以删除最后服务端和客户端协商的结果就是580,这样当时间到了之后如果没有数据往来,那么就会出现连接被服务端断开的情况了

 需要特别注意的是经过我实际测试python的pika==0.11.2 版本及以下版本设置heartbeat的不生效的,只有0.12.0忣以上版本设置才能生效

}

我要回帖

更多关于 超时关闭是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信