• Redis 丢失订阅消息


    问题描述:

    最近做的项目用redis订阅了一个消息,消息的每秒都会发,在我程序运行了一晚上之后,第二天发现消息丢失了,看了日志发现平均2秒丢26条消息。

    解决办法:

    在网上找到了这个描述:来自https://blog.csdn.net/luyaoying001/article/details/80264347

    使用Redis缓存行情数据,发现程序运行一段时间后,出现subscribe线程不再能够接收到订阅的行情数据,发现是由Redis的输出缓冲机制导致的。

    Redis为了解决输出缓冲区消息大量堆积的隐患,设置了一些保护机制,主要采用两种限制措施:

    • 大小限制,当某一客户端缓冲区超过设定值后直接关闭连接;
    • 持续性限制,当某一客户端缓冲区持续一段时间占用过大空间时关闭连接。

    对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端连接;   

    然后发现Redis的发布订阅是不可靠的,会存在数据丢失的问题。验证一下是不是上面这个原因,我去查看了日志,看了日志之后发现这个问题是在系统运行了7、8个小时后出现的,经查找发现做的定时删除没启动,从而造成数据量过大,在订阅事件的处理中,因为数据量过大,拖慢了处理订阅的消息时间,消息的处理时间超过了1秒。从而导致了消息的延迟,越推时间越长,导致缓冲区过大,最后数据丢失。

    个人建议:如果订阅的消息接收时间间隔短并且数据量过大的情况下,还是不要用这种方式了,如果发布者发送消息过快,而且在这一时刻数据量很大,那么会存在数据丢失问题。

    网上给了一种设置缓冲区大小的设置,可以参考一下。

    1. client-output-buffer-limit pubsub 32mb 8mb 60   #当缓冲区数据达到硬限制32M时,连接会关闭;当缓冲区数据达到软限制每60秒8M时,连接也会关闭。  
    2. client-output-buffer-limit pubsub 0         #可将hard limit和soft limit同时置0,关闭该限制。该操作官方不推荐。 
  • 相关阅读:
    兄弟连,一般人来不起,来的肯定不是一般人!
    50天之脱变,66期第一个项目感受。切记平常心
    2016十大影响事件
    为什么要写年终总结
    20161228阅读笔记
    为什么要认识牛人
    李笑来:演讲能力是我这一生有幸学到的最重要能力
    张辉:工作几年就应该给自己“清零”
    小马宋:目标决定方法~坚持目标而不是方法
    李笑来的财务自由法~把一份时间卖出很多份
  • 原文地址:https://www.cnblogs.com/zhangjd/p/13372125.html
Copyright © 2020-2023  润新知