• redis发布订阅客户端报错


      转自简书【https://www.jianshu.com/p/a85ec38245da

      最近遇到一个问题,springBoot程序中有一个监听器,监听redis中发来的消息(其实是监听一个key的消失,以此做定时),后台程序监听不到redis消息。

      刚开始以为是redis键值未写入,或者过期时间不对,经过排查,在定时开始时,key已经写入,并且过期时间与系统中设置的一致。并且未见明显报错,直到在控制台发现:

    2019-10-11 09:16:14,574 ERROR [rules-engine-4]  o.s.d.r.l.RedisMessageListenerContainer - Connection failure occurred. Restarting subscription task after 5000 ms
    2019-10-11 09:16:14,597 ERROR [agentconnection-pubsub-50]  o.s.d.r.l.RedisMessageListenerContainer - Connection failure occurred. Restarting subscription task after 5000 ms
    2019-10-11 09:16:14,599 ERROR [servicesession-expire-84]  o.s.d.r.l.RedisMessageListenerContainer - Connection failure occurred. Restarting subscription task after 5000 ms

      这时候才反应过来后台程序与redis连接出现了问题。

      1)百度查看该报错,很多是说:Redis订阅客户端订阅buffer超过32M或持续60秒超过8M,订阅立即被关闭!(意思是说客户端消费速度比较慢,导致产生的消息大量堆积超过了限制客户端被关闭)

    client-output-buffer-limit pubsub 32mb 8mb 60

      2)可以修改配置为(使其不受限制):

    config set client-output-buffer-limit "normal 0 0 0 slave 268435456 67108864 60 pubsub 0 0 0"

      3)这次遇到的问题好像不是这样的,看到 “client-output-buffer-limit pubsub如果达到限制会关闭客户端,然后客户端会报此次这个错误,那是不是有可能是其他地方将这个客户端关闭了造成这个错误;”

      4)服务器的redis是部署在阿里云,并且使用了haproxy(这个东西没用过,还得学习,贴一张其他博主的图纪录一下)

    timeout client:客户端非活动状态的超时时长  
    timeout server:客户端与服务器端建立连接后,等待服务器端的超时时长
    并借用了别人的解决方案
    • 暂时解决方案
      1)haproxy超时时间仍改回3min,因为后端代理了mysql等服务;
      2)暂时继续沿用目前这种方案,因为程序具备断开重连机制,虽然redis发布订阅不能持久化,断开连接期间发布的消息订阅端有可能丢失,但是目前业务发布消息很少,几个月发布一次消息,在发布消息的时候连接断开的概率还是比较小的,所以暂不处理。
    • 永久解决方案
      1)采用Rabbit Mq取代redis
      2)tomcat直连redis
      3)代码处增加额外的发布信息,确保连接idle时间不会超过3min
     
     
  • 相关阅读:
    LeetCode:204. 计数质数
    LeetCode:203. 移除链表元素
    LeetCode:202. 快乐数
    LeetCode:191. 位1的个数
    LeetCode:190. 颠倒二进制位
    LeetCode:189. 旋转数组
    LeetCode:187. 重复的DNA序列
    LeetCode:165. 比较版本号
    LeetCode:164. 最大间距
    LeetCode:155. 最小栈
  • 原文地址:https://www.cnblogs.com/easilyai/p/11657009.html
Copyright © 2020-2023  润新知