有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案

2017-12-22 18:23:41 +08:00
 geew
今天服务器突然提示一台 redis 无法连接了 登上去一看 发现到这个 redis 服务器的连接基本都是 CLOSE_WAIT 状态 有十几万条 导致没法再建立新的连接
至于 redis 的用法也是 很传统的用法 就是服务启动的时候会初始化一个 redis.StrictRedis 的连接 然后就直接用
至于连接池 其实 StrictRedis 内部的实现就是用连接池的

后来查了 google 发现这个
http://russellluo.com/2017/10/redis-py-pool-cannot-handle-idle-close-wait-connections.html
v2 上也有人发过讨论: https://www.v2ex.com/t/237326 但没有提供解决方案

参考了第一个的方案 改进了一下 redis 连接池的 get_connection 方法 更新上去之后 效果很明显 确保了一个进程一条连接 失效了重新建立新的连接
看起来很完美的样子

我的疑问就是 既然都有这个问题 也有解决方案在那里 为什么这个 issue 都没人关注呢 还是大家都没遇到过这个问题吗
4187 次点击
所在节点    Python
9 条回复
jingniao
2017-12-22 21:33:16 +08:00
这叫我想起来之前遇到过的数据库连接未释放的问题了,关注生命周期是关键
est
2017-12-22 22:11:55 +08:00
redis-py 真是想各种吐槽

- 连接池不能负载均衡
- 连接池不能读写分离
- zadd 不支持 nx 等参数
- zadd 那个坑死无数新人的参数顺序。
lolizeppelin
2017-12-22 22:19:12 +08:00
你们用都不看源码的么 那个链接池简陋得连心跳都没 你们也直接用
geew
2017-12-22 22:31:18 +08:00
@lolizeppelin #3 源码看了 确实简陋 有别的选择吗 基本都在用这个库的吧
geew
2017-12-22 23:32:05 +08:00
@est #2 确实 有更好的库可以选择吗
lolizeppelin
2017-12-22 23:32:25 +08:00
当然自己重新封装 自己写心跳啊
swulling
2017-12-22 23:34:09 +08:00
https://github.com/andymccurdy/redis-py/pulls

吐槽不如提 Pull Request 就好了
swulling
2017-12-22 23:36:24 +08:00
如果发现已经有 Pull Request,+1 求合并就好了,求合并的人多了,自然受重视

如果只是默默吐槽,那就不怪别人了
lolizeppelin
2017-12-23 07:12:38 +08:00
没用的 对比下 kombu 的代码 就知道了 这玩意就是个基本接口根本没打算做全功能

就算是 kombu openstack 还再封装过一遍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX