美文网首页
缓存污染日常实践思考

缓存污染日常实践思考

作者: 晴天哥_王志 | 来源:发表于2020-11-25 23:33 被阅读0次

缘起

  • 这篇文章的思考缘于今天的一个系统发布引起的缓存污染,所谓的缓存污染指的是缓存数据的字段内容因为新旧服务同时存在读写导致异常发生。

  • 缓存污染造成影响一般包含两方面,一是数据反序列化失败;二是新增字段为null导致逻辑处理异常。

  • 所谓反序列化失败是指新服务写入的缓存数据相对于旧服务而言增加了字段导致旧服务反序列化失败。

  • 所谓新增字段为null导致逻辑处理异常使指新服务依赖核心新增字段但是由于旧服务写入的缓存数据不包含该新增字段导致异常。

  • 当然常在河边走,这两种湿鞋的情况都遇到过,幸运未造成严重后果。

本质

缓存读写
  • 缓存污染的问题基本上可以参考上面两种场景图,左边是两系统共用同一缓存的key,右边是同一系统的多台机器共用同一缓存key。

  • 因为系统发布前后顺序的问题,会导致同时存在同一key两种类型value的写入和读取,如果不幸在序列化和反序列化当中没有做到向后兼容就会发生悲剧,同样如果有幸逃过序列化这个劫,还需要考虑针对新增字段为null的情况的兼容。

  • 本质上针对缓存数据新增字段得保持两个意识,一是缓存数据序列化兼容问题,二是新增字段为null业务兼容问题。

  • 缓存一旦被污染,要么期待缓存的数据TTL过期时间不长能够尽快恢复,要么有紧急开关能够一键关闭缓存直接访问DB,剩下的就是看天意了。

解决

  • 针对涉及缓存数据格式更改的场景,特别需要关注数据内容的序列化和反序列化兼容性问题,如jackson需要特殊配置才能兼容,fastjson就不需要,具体的不确定可以实际验证一把。

  • 针对序列化和反序列化部分建议增加try/catch进行兜底,保证序列化和反序列化失败当成缓存结果为空继续都DB访问,前期是DB能够扛住正常峰值流量。

  • 缓存数据TTL设置切记过大,设置合理的过期时间能够让影响面尽量变小。

  • 缓存污染是需要多台机器部署的场景才能出现的,但是测试环境和预发环境基本上都是单台机器,所以在测试过程中是很难发现的,这就是为什么上线总有意想不到的事情发生

衍生

  • 缓存和DB的数据一致性是业界难题,截止目前我了解到的组合解决方案就是 1、合理设置TTL保证数据过期;2、写完DB后删缓存由下次访问重新写入缓存;3、通过旁路的canal监听来实现兜底更新

相关文章

  • 缓存污染日常实践思考

    缘起 这篇文章的思考缘于今天的一个系统发布引起的缓存污染,所谓的缓存污染指的是缓存数据的字段内容因为新旧服务同时存...

  • 缓存实践

    (声明:本文部分内容摘自网络优秀文章,版权归原作者所有) 一、缓存方式 1 进程内缓存 直接在jvm虚拟机中缓存(...

  • DNS污染

    DNS污染,又称为域名服务器缓存污染(DNScache pollution)或者域名服务器快照侵害(DNS cac...

  • 产品日常思考—页面缓存问题(转载)

    ———— / BEGIN / ———— 缓存,在互联网产品中可以简单理解为: 第一次请求数据放到存储器中,下次显示...

  • 聊聊缓存

    本地缓存:mybatis实现:装饰器模式实践 PerpetualCache:永久缓存:通过HashMap实现最大容...

  • 环境污染这么严重,环保人才应该是急需,为何就业不好

    导读:环境污染包括大气污染、水污染土壤污染以及固体废弃物污染等,这些污染对人们的身体健康以及日常生活有着直接的影响...

  • RFMemoryCache 设计思路

    缓存污染 通过研究我发现SDWebImage和Kingfisher是使用NSCache进行Memory Cache...

  • ARP缓存污染(ARP欺骗)

    1、ARP查询过程简述: 当一台计算机A想要与另一台计算机B通信时: 第一步:发起通信的计算机A:1、检查自己的A...

  • okhttp 缓存实践

    以下内容基于 okhttp:3.10.0 版本 在开发中,由于不同业务场景解,我们需要将接口返回的数据缓存到本地,...

  • 实践缓存策略

    NSURLRequestUseProtocolCachePolicy 有缓存就默认优先利用缓存,默认缓存策略。具...

网友评论

      本文标题:缓存污染日常实践思考

      本文链接:https://www.haomeiwen.com/subject/dknniktx.html