求解题思路:
服务通过resty.limit.conn,使用redis计数做并发控制,但是这个服务有的时候需要重启升级(k8s rolling update),重启时可能有一些ws长连接还没断开,然后在nginx.conf中又有类似worker_shutdown_timeout 10s;这样的配置,这会导致resty.limit.conn使用的redis计数没法正常减少,导致后续并发控制不准;
求助: 服务通过resty.limit.conn使用redis计数做并发控制,升级遇到的问题
这个看起来是 worker_shutdown_timeout 触发后,ws 请求直接退出了,没有进入 log 阶段的机会了?
如果是这样的话,最好的办法还是在 worker_shutdown_timeout 触发之前关闭所有的 ws 连接
对于 ws 连接,貌似也只能在 body_filter 里面 判断 shutting down 然后直接 ngx.exit(444) 了
而且也可能 10s 内也没有触发 body_filter,这个看起来没法保证全部正确关闭
还想到一个”土“办法,每次启动的时候,搞一个版本号,然后 limiter 的 key 里加入这个版本号,就是需要改业务代码,相对比较麻烦
wuw312 我理解错了,我理解为是 Openresty 自己的 websocket。的确如果是 proxy 的 websocket 是无法从 nginx 发起中断的。
我赞同doujiang24 的想法,是不是可以每次启动 nginx 启动的时候初始化一个变量,用这个变量作为 key 来统计连接数?因为 nginx 每次启动应该是相互独立的统计域?