记录一次缓存引起的线上BUG
背景
有一个需求大概是这样的,为了提高推荐系统的性能,需要本来从A服务获取的帖子信息,改为从Redis里面重新读取
Redis里面没有存帖子的所有信息,只存储了推荐系统必要的字段
大概是这样的:

至于Redis如何批量和实时维护数据我们不用管,只要还能从Redis读到之前的帖子信息即可
实现
这个实现起来不难,只要根据帖子ID读取Redis的数据,然后原样转为帖子实体即可
问题
帖子信息不全
这是在沙箱环境遇到的问题,Redis存储的帖子信息不够全,虽然对推荐系统是足够的,但对下游的返回结果不够使用
解决方法
在返回之前,重新调用A服务获取帖子信息,覆盖原来的帖子。
为什么不直接调用A服务呢,因为返回结果的时机帖子数量比较少,一般在10条之内,而召回要查询的帖子可能是几百上千条。

通过这样修改,沙箱测试也顺利通过
上线后帖子信息仍然不全?
本以为这样就没事,结果上线灰度的过程中,下游服务开始报警,和相关同学确认之后说还是在沙箱环境中碰到那个错
此时我懵了,这个不是已经重新获取了帖子信息吗

拼命在核对代码,这个从Redis的帖子信息是怎么绕过重新从A服务获取信息的
通过报警的数量来看,不是必然出现的
怀疑以下原因:
- 环境问题,因为沙箱没问题,线上有问题,可能是配置不同或者环境变量
- 并发问题,沙箱测试肯定没有并发,是不是线上并发请求导致哪个变量有问题
- 异常逻辑,是不是有些请求没做正常逻辑,走了异常逻辑导致提前返回
通过线上灰度和各种log不停调试了两天排除了上述问题和代码逻辑的问题,此时已经接近绝望
曙光
有一点一直能确定,就是从Redis获取的帖子信息返回给了下游,但它是怎么漏出去呢?
突然想到会不会不是灰度的机器返回出去的,而是旧版本的机器返回出去的。
因为我们会对召回回来但是未被使用的帖子做缓存,也就是说,灰度机器召回的不完整帖子通过缓存被旧机器返回回去了

总结
在上线过程中,新版本机器产生的脏数据通过缓存Rdis被旧版本机器使用了,而旧版本机器没有对脏数据进行处理导致出现的问题
之所以记录这个问题,是因为这个问题花费了我很多时间,现在看起来简单,但当时却很难发现,所以希望能给看到的同学一些启发
追加
除了数据产生的线上问题之外,之前还碰到过一个不容易发现的线上BUG, 就是全局变量,具体表现为: 线上刚开始表现是正常的,当这个全局变量被改变之后,然后就不正常了,也是一个不太容易发现的问题
记录一次缓存引起的线上BUG的更多相关文章
- 记录一次线上bug
记录一次线上bug,总的来说就是弱网和重复点击.特殊值校验的问题. 测试场景一: 在3g网络或者使页面加载速度需要两秒左右的时候,输入学号,提交学生的缴费项目,提交完一个 学生的缴费后, ...
- 程序员如何描述清楚线上bug
案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...
- 记一次线上bug排查-quartz线程调度相关
记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...
- 线上BUG:MySQL死锁分析实战
原文链接:线上BUG:MySQL死锁分析实战 1 线上告警 我们不需要关注截图中得其他信息,只要能看到打印得org.springframework.dao.DeadlockLoserDataAcces ...
- 线上bug的解决方案--带来的全新架构设计
缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...
- 线上bug分析
昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...
- 听说”双11”是这么解决线上bug的
听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...
- 线上bug或故障界定及填写规范
[线上故障与线上Bug界定] 一.线上故障: 1. 故障参照公司规范稍做调整: a) 1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b) ...
- 关于线上bug
之所以想写下线上bug,因为发觉有些公司对线上bug的处理是比较严格甚至是很苛刻,涉及到的相关人可能会因此而背黑锅. 之所以会存在这样情况,因为公司各部门都有关联,特别是用户.老板的投诉,也给公司会造 ...
- 「日常开发」记一次因使用Date引起的线上BUG处理
生活中,我们需要掌控自己的时间,减少加班,提高效率:日常开发中,我们需要操作时间API,保证效率.安全.稳定.现在都2020年了,了解如何在JDK8及以后的版本中更好地操控时间就很有必要,尤其是一次线 ...
随机推荐
- k8s控制器和Pod Template的关系
Pod 本身并不能自愈(self-healing).如果一个 Pod 所在的 Node (节点)出现故障,或者调度程序自身出现故障,Pod 将被删除:同理,当因为节点资源不够或节点维护而驱逐 Pod ...
- 锐捷网关交换机开启dhcp服务
锐捷网关交换机作为dhcp server: Ruijie(config)#service dhcp ------>该命令默认不启用,交换机必须配置 Ruijie(config)#i ...
- Kafka 之 Streams
Kafka 之 Streams 一.概述 1.1 Kafka Streams Kafka Streams.Apache Kafka开源项目的一个组成部分.是一个功能强大,易于使用的库.用于在Kafka ...
- Hbase之理论
第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...
- bean文档类型定义
ELEMENT:表示当前 (bean*):表示0到多个bean元素 (property*):表示0到多个property元素 ATTLIST:表示属性 #REQUIRED:表示不可缺少 #IMPLIE ...
- JavaScript基本语法(数组与JSON)
5.数组 #①使用new关键字创建数组 // 1.创建数组对象 var arr01 = new Array(); // 2.压入数据 arr01.push("apple"); ar ...
- JUC(8)JMM
文章目录 1.JMM 2.volatile 3.单例模式 1.JMM Volatile是java虚拟机提供轻量级的同步机制 1.保证可见性 2.不保证原子性 3.禁止指令重排 什么是JMM java内 ...
- 齐博x1会员中心如何加标签
点击查看大图 轻松几步,你可以做会员中心的界面 这是调用文章的 代码如下:会员中心的标签跟前台使用方法是一模一样的, 关键之处就是多了一项动态参数 union="uid" 在以往, ...
- 鼠标悬浮上去显示小手CSS
鼠标悬浮上去显示小手CSS只需要添加一句css代码即可 cursor:pointer;
- antd 批量上传文件逻辑
基本步骤 通过 antd 框架的 Upload 控件,采用手动上传的方式,先选择需要上传的文件(控制文件数量以及大小),再根据所选的文件列表,循环上传,期间通过 Spin 控件提示上传中. 效果展示 ...