背景

有一个需求大概是这样的,为了提高推荐系统的性能,需要本来从A服务获取的帖子信息,改为从Redis里面重新读取

Redis里面没有存帖子的所有信息,只存储了推荐系统必要的字段

大概是这样的:

至于Redis如何批量和实时维护数据我们不用管,只要还能从Redis读到之前的帖子信息即可

实现

这个实现起来不难,只要根据帖子ID读取Redis的数据,然后原样转为帖子实体即可

问题

帖子信息不全

这是在沙箱环境遇到的问题,Redis存储的帖子信息不够全,虽然对推荐系统是足够的,但对下游的返回结果不够使用

解决方法

在返回之前,重新调用A服务获取帖子信息,覆盖原来的帖子。

为什么不直接调用A服务呢,因为返回结果的时机帖子数量比较少,一般在10条之内,而召回要查询的帖子可能是几百上千条。

通过这样修改,沙箱测试也顺利通过

上线后帖子信息仍然不全?

本以为这样就没事,结果上线灰度的过程中,下游服务开始报警,和相关同学确认之后说还是在沙箱环境中碰到那个错

此时我懵了,这个不是已经重新获取了帖子信息吗

拼命在核对代码,这个从Redis的帖子信息是怎么绕过重新从A服务获取信息的

通过报警的数量来看,不是必然出现的

怀疑以下原因:

  • 环境问题,因为沙箱没问题,线上有问题,可能是配置不同或者环境变量
  • 并发问题,沙箱测试肯定没有并发,是不是线上并发请求导致哪个变量有问题
  • 异常逻辑,是不是有些请求没做正常逻辑,走了异常逻辑导致提前返回

通过线上灰度和各种log不停调试了两天排除了上述问题和代码逻辑的问题,此时已经接近绝望

曙光

有一点一直能确定,就是从Redis获取的帖子信息返回给了下游,但它是怎么漏出去呢?

突然想到会不会不是灰度的机器返回出去的,而是旧版本的机器返回出去的。

因为我们会对召回回来但是未被使用的帖子做缓存,也就是说,灰度机器召回的不完整帖子通过缓存被旧机器返回回去了

总结

在上线过程中,新版本机器产生的脏数据通过缓存Rdis被旧版本机器使用了,而旧版本机器没有对脏数据进行处理导致出现的问题

之所以记录这个问题,是因为这个问题花费了我很多时间,现在看起来简单,但当时却很难发现,所以希望能给看到的同学一些启发

追加

除了数据产生的线上问题之外,之前还碰到过一个不容易发现的线上BUG, 就是全局变量,具体表现为: 线上刚开始表现是正常的,当这个全局变量被改变之后,然后就不正常了,也是一个不太容易发现的问题

记录一次缓存引起的线上BUG的更多相关文章

  1. 记录一次线上bug

    记录一次线上bug,总的来说就是弱网和重复点击.特殊值校验的问题. 测试场景一:        在3g网络或者使页面加载速度需要两秒左右的时候,输入学号,提交学生的缴费项目,提交完一个 学生的缴费后, ...

  2. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  3. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  4. 线上BUG:MySQL死锁分析实战

    原文链接:线上BUG:MySQL死锁分析实战 1 线上告警 我们不需要关注截图中得其他信息,只要能看到打印得org.springframework.dao.DeadlockLoserDataAcces ...

  5. 线上bug的解决方案--带来的全新架构设计

    缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...

  6. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  7. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  8. 线上bug或故障界定及填写规范

    [线上故障与线上Bug界定] 一.线上故障: 1.  故障参照公司规范稍做调整: a)         1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b)       ...

  9. 关于线上bug

    之所以想写下线上bug,因为发觉有些公司对线上bug的处理是比较严格甚至是很苛刻,涉及到的相关人可能会因此而背黑锅. 之所以会存在这样情况,因为公司各部门都有关联,特别是用户.老板的投诉,也给公司会造 ...

  10. 「日常开发」记一次因使用Date引起的线上BUG处理

    生活中,我们需要掌控自己的时间,减少加班,提高效率:日常开发中,我们需要操作时间API,保证效率.安全.稳定.现在都2020年了,了解如何在JDK8及以后的版本中更好地操控时间就很有必要,尤其是一次线 ...

随机推荐

  1. 使用kubeoperator自带的nginx-ingress-controller设置服务的ingress规则进行访问

    情况说明 当使用kubeoperator安装k8s集群的时候,在组件设置部分选择的ingress 类型是nginx-ingress yaml文件 k8s集群安装后,可以在节点的master主机的这个目 ...

  2. Gitlab备份以及恢复

    1.迁移准备工作和思路 从a服务器迁移到b服务器,由于Gitlab自身的兼容性问题,高版本的Gitlab无法恢复低版本备份的数据,需要注意在b服务器部署和a服务器一样版本的gitlab,部署好环境后开 ...

  3. PostgreSQL 语法

    进入命令行工具,我们可以使用 \help 来查看各个命令的语法 : postgres-# \help <command_name> 例如,我们查看下 select 语句的语法: postg ...

  4. .NET下数据库的负载均衡(有趣实验)

    相关下载: 数据库的负载均衡-示例代码(dp1-DbBalance.rar) 数据库的负载均衡-示例代码(dp1-DbBalance.rar) 支持.Net/.Net Core/.Net Framew ...

  5. Javascript 手写 LRU 算法

    LRU 是 Least Recently Used 的缩写,即最近最少使用.作为一种经典的缓存策略,它的基本思想是长期不被使用的数据,在未来被用到的几率也不大,所以当新的数据进来时我们可以优先把这些数 ...

  6. NSIS隐藏窗口标题栏自带的按钮(最大化,最小化,关闭X)

    这个问题实在八月份逛csdn论坛的时候偶然遇到的,当时比较好奇楼主为啥要隐藏关闭按钮,就顺口问了下,结果楼主已经弃楼,未给出原因,猜着可能是为了做自定义页面美化,无法改变按纽外观之类的,后来琢磨了下, ...

  7. POJ3662 [USACO08JAN]Telephone Lines (二分答案/分层图求最短路)

    这道题目有两种解法: 1.将每个点视为一个二元组(x,p),表示从起点到x有p条路径免费,相当于构建了一张分层图,N*k个节点,P*k条边.在这张图上用优先队列优化的SPFA算法求解,注意这里的d数组 ...

  8. Vue3 SFC 和 TSX 方式调用子组件中的函数

    在开发中会遇到这样的需求:获取子组件的引用,并调用子组件中定义的方法.如封装了一个表单组件,在父组件中需要调用这个表单组件的引用,并调用这个表单组件的校验表单函数或重置表单函数.要实现这个功能,首先要 ...

  9. 如何使用IDEA创建一个简单的java工程?

    文章目录 1.创建新工程 1.1 新建项目 1.2 在src目录下创建package 1.3 在包下创建类 2.编写代码.运行项目 2.1 编写代码 2.2 运行结果 3.开心的从eclipse转移到 ...

  10. 鼠标悬浮上去显示小手CSS

    鼠标悬浮上去显示小手CSS只需要添加一句css代码即可 cursor:pointer;