問題描述
在Django的websocket連接中毁渗,借用Redis實現(xiàn)消息訂閱的功能镶苞,突然出現(xiàn)問題,websocket端連接不上服務器嘉熊,在uwsgi日志中發(fā)現(xiàn)是握手中連接Redis出錯夏块,進而導致握手失敗疏咐,日志
ConnectionError: max number of clients reached
解決辦法
在查找資料后,得知主要有2個原因會導致出現(xiàn)此問題
- Redis允許的連接數(shù)太小脐供,并發(fā)的客戶端超過這個值
- 客戶端未及時關閉浑塞,導致Redis的連接數(shù)被耗盡
打開Redis的配置文件,檢查maxclients參數(shù)政己,發(fā)現(xiàn)為1000酌壕,客戶端當前應該是不超過1000的,使用命令檢查一下連接數(shù)
netstat -an|grep redis | wc -l
1001
居然有那么多連接歇由,看來自己遇到的問題應該是第二種卵牍,應該是客戶端的websocket斷開后,代碼邏輯中沒有釋放連接沦泌,導致運行一段時間后出現(xiàn)這個問題糊昙。
發(fā)現(xiàn)問題,解決的辦法應該也很簡單了
1谢谦,在websocket的connection lost事件中溅蛉,釋放redis
2,簡單一點他宛,給redis添加一個timeout時間,超時后自動釋放欠气,當然此方法不適合頻繁的Redis連接厅各,畢竟過一段時間Redis才會釋放