django Channel websocket 连接上后断开问题

1. 问题描述

上线一个新的环境,发现原来的ws连接上之后,会自动断开。查看日志发现,连接其实已经成功,但是莫名就断开了
日志参考如下

127.0.0.1:40148 - - [23/Sep/2021:18:58:18] "WSCONNECTING /operation/api/ws/smart_station/car_real_time/609a646968206d11a655d3e3/" - -
127.0.0.1:40148 - - [23/Sep/2021:18:58:18] "WSCONNECT /operation/api/ws/smart_station/car_real_time/609a646968206d11a655d3e3/" - -
==== 连接成功
==== 连接成功, 并且来到了最后一行
127.0.0.1:40148 - - [23/Sep/2021:18:58:19] "WSDISCONNECT /operation/api/ws/smart_station/car_real_time/609a646968206d11a655d3e3/" - -
127.0.0.1:36798 - - [23/Sep/2021:19:01:41] "WSCONNECTING /operation/api/ws/smart_station/car_real_time/609a646968206d11a655d3e3/" - -

从上述的日志中发现,我自己打印的连接上之后的日志全部打印出来了,并且整个连接也成功连上了,但是很快就立刻断开了。并且断开的时候并没有调用我的consumer中的disconnect方法,相应的日志也没有打印出来。

2. 排查

  1. nginx配置有问题???
    经过运维排查,并没有发现这个环境配置与没有问题的环境有任何区别,并且该环境曾经也部署过这个服务,ws连接一直是正常的。

  2. 排查修改
    排查修改过的代码,发现redis配置发生过变更,换了新的redis实例。与运维同学沟通,发现新的redis的版本为4.0,而原先的redis是5.0版本

3. 解决

  1. 使用channel时配套使用了channel_redis,但是发现有内存泄漏问题,主要是由于channel_redis本地缓存的queque的大小没有做限制,导致的内存泄漏,该问题解决的版本在channel_redis 3.1.0 。所以我们对channel_redis这个包做了升级。
  2. channel_redis 3.1.0 要求使用5.0版本以上的redis,所以当检测redis版本不对时,就会导致ws连接的断开。
  3. 修改redis配置为一个5.0版本的实例,ws连接就正常了。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容