socket.io redis stream adapter导致ioredis堵塞问题

34 阅读1分钟

问题

  • 在正常使用接口时,发现只要有redis相关操作就发现明显速度慢,在局域网环境redis操作时快时慢极其不稳定

问题排查与解决方案

  • 因为redis处理命令的运行时是单线程,怀疑存在非常耗时的命令,如:key *
  • slow log中无任何数据
  • 宿主机CPU、内存、磁盘的每秒idle都在90%以上
  • 开始查看redis监控
767a5bcb2100373ad73a4f6c261fa357_720

罪魁祸首出现,xread BLOCK 100 COUNT 100 STREAMS ...!最多堵塞100ms,最多读取100条流数据即返回。(注意这只是堵塞的redis客户端,在堵塞期间redis服务端仍然能够处理其他命令)

既然知道是因为ioredis客户端导致的原因,所以两种解决办法

  1. redis连接池,因为项目使用ioredis所以不存在连接池(利用redis pipeline能力提升并发效率)
  2. socket.io redis stream adapter 使用单独的ioredis客户端 👍

优化提升

从800~1200ms提升到50ms以内,优化了接近20倍,redis高频接口效果异常明显