• 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
     
     
  • 相关阅读:
    开发中的一些总结2
    XML与DataTable/DataSet互转(C#) 把数据库中表的内容转存为XML文件
    闲来无事。。。。
    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码:
    20120301 14:10 js函数内部实现休眠
    设为首页和收藏本站的代码
    Jquery实现对a标签改变选中的背景色 支持多选 再次点击背景色消失
    asp.net上传图片并生成等比例缩略图(.Net自带函数完成)
    类中只有 成员变量 和 一个成员函数表
    CListCtrl 使用技巧
  • 原文地址:https://www.cnblogs.com/easilyai/p/11657009.html
Copyright © 2020-2023  润新知