现在有个web服务,每个请求大约会访问几次redis,使用的是lua-resty-redis,启用了keepalive。
resty-redis的后端连接池是不设上限的,如果启用keepalive,redis服务器在正常情况下,连接数不会太多;
但在高并发的情况下,如果redis服务器稍有抖动,连接数就会急剧增多,导致redis服务器的处理性能进一
步下降;
有没有办法限制cosocket对后端的连接数,通过固定的连接访问redis,在redis发生抖动的时候,可以牺牲
整体的请求时延,将后续的redis请求放到队列中,而不是所有会话都向redis发起请求导致redis性能更加恶化。
去年的邮件,春哥提到用timer启动一个lightthread专门用于访问后端服务器,通过进程内共享数据队列和
ngx.semaphore实现:https://groups.google.com/d/msg/openresty/phXeClwZVqM/BCgzr1Q6CEMJ
似乎能解决问题,但是不知道性能如何,并且有个问题:如果多个会话都在等待timer线程返回数据,那么
怎么知道该唤醒那个会话?
另外这种实现毕竟还是比较复杂,有其他实现方式吗?