序:本周在工作中遇到了一些麻烦,解决过程比较曲折和辛苦,特此记录,留作经验供以后参考

发现问题:周一上班的时候,运营打电话来说,我们上个月做的一个活动感觉数据不对,商家过来投诉了。结果我数据库一查,数据还真有问题!这次的活动采用的是页面上使用缓存系统显示活动数值(总金额),同时在后台记录详细的每条活动数据的办法。每次用户发生业务行为的时候都会在后台的缓存的总金额上增加,同时记录这次行为发生的金额数。结果我周一把数据库的记录加一起来一算,发现和页面上缓存的总金额竟然差了将近一半!

解决的过程:

1.由于数据库记录了每次业务行为的具体数据,而且比缓存的总金额要多。我第一时间想到的就是缓存系统哪里出错了。于是我先去服务器上找日志,可惜的是活动时间过去太久,服务器上的日志已经没有当时的记录了(郁闷!)。于是我只能靠自己来找出当时的BUG了。

2.我想到在上线之前我已经在线下环境和预发环境做过测试,缓存的数据和数据库的数据是会保持一致的。难道是因为线上的环境有2台服务器,又或者是在高并发大数据的情况下,才会产生的错误,又或者是其中某一台服务器的缓存服务器发生故障了?(因为数值刚好差了近一半么,如果其中一台服务器的缓存出错了,数值就符合了)。于是我修改了代码,重现了当时的业务场景,结果发现在比较高的并发量的情况下,2台服务器均未出现缓存服务故障和数据库不一致的现象。之后我又询问了其它开发和缓存部门的人,确定了在当时的访问量下,缓存和服务器应该不会出现瓶颈。于是乎,我的假设失败了,BUG还是没找到。

3.在接下来的一天里,我详细检查了各个地方,进行了各种假设,均为能测出这个数据不一致的BUG。而且要命的是,我在服务器上模拟当时的场景也没有出现这个BUG。于是我想到,这个BUG可能是那种只有在特定时间或着条件下才会出现的状况。一般像这种情况的问题最难处置了,因为可能出问题的地方可能已经消失了,不知道什么时候又会出现。第二天,我正向运营主管反应这个情况打算放弃的时候,他告诉了我一个重要的线索!他说在活动结束前的时候,他发现活动的总金额有过突然减少的情况,这个情况是出乎我意料的。因为之前的一直以为是缓存系统哪里出问题,导致增加的计数器没起效果。但是他说总金额有突然变少过,我写的业务代码中根本没有减少金额的逻辑,也就不可能存在金额减少的情况。于是乎,我把侦查重点又转移到了缓存系统本身上去。因为既然我写的代码根本不可能导致总金额的减少,那就一定是缓存系统本身出了什么问题,才会出现这种金额减少的状况。

4.接来下,我与缓存系统的技术支持电话里确认。询问了到底什么情况下,缓存系统会有金额减少的状况发生。在给他展示了我的关键性代码之后,他告诉我,如果我存在缓存里的数值“丢失”的话,因为我在代码里没有做“防灾”处理,数值可能是会重新归零的。缓存数值的“丢失”!这是我在之前没有考虑过的情况,因为我之前询问过开发的前辈,他们说这套缓存系统十分的稳定,因此我就大胆的直接使用它进行了业务数值的展现。而且从缓存系统的监控里,我也找不到类似于缓存溢出的情况。后来这个缓存部门的技术支持告诉我,由于我使用的是一块公用的缓存服务器,即使我本身分配的缓存空间还很多,但是如果其它用户此时有很大的缓存进来的话,是有可能把我驻留在内存里的数值给“丢失”的。

5.到这里,我基本上就想通了。在我上个月活动的那几天里,由于缓存系统其它用户出现的某些大负载量的状况,把我保留在缓存系统里的业务数据(总金额)给弄“丢失”了。而我由于天真和大意,没有考虑到缓存系统数值丢失的状况,只是一味的往上加一,即使在缓存系统里的数值“丢失”归零之后。于是就出现了数值突然下降,最终和实际数值不一致的情况。找到了问题的原因,解决办法也很容易想到。就是在这个业务场景下,考虑到缓存可能“丢失”的情况,在每次给缓存加一的时候,先判断下缓存是否存在,如果不存在就去数据库里取当前记录的总值。

经验总结:

  找BUG往往是程序员最痛苦的事情之一,而像我这次碰到的这种在某些情况下才会发生的BUG,就更是难以被发现和处理。这时往往就得像侦探办案似的,收集各种线索,进行各种假设。模拟业务场景,往往是程序员找出BUG,最常使用的手段,但当这次这种无法重现的场景出现的时候,就只能靠“线索”了。“线索”是指那些有用的信息,比如运营人员反映的数值突然下降过的事,比如日志和数据记录。这些平时看起来不重要的事物,在这时都有可能会变成有用的“线索”。所以平时保存日志和备份数据,还有监控记录,这些东西在分布式,大数据的系统下就变得很重要了。

  另外,还有最重要的一点,就是对找“BUG'这件事本身的毅力也很重要,因为在找”BUG'的过程中,可能会四处碰壁,这时如果放弃了,那这个BUG就永远淹没成为过去了。但是如果你坚持下去,把他找出来,那你就能优化自己的代码和系统,对于自身也是技术的增长和经验的积累。

转载于:https://www.cnblogs.com/xujanus/p/3849342.html

关于这周工作中遇到的关于缓存问题的记录相关推荐

  1. 工作中最让程序员疯狂的5件事

    Jason Silberman 通过一个幽默特别的观点阐述了在日常工作中那些让程序员变得疯狂的事情. 正如我所说,如果某个人正在测试你的代码,那你的感觉会怎么样呢? 如果像我一样是个程序员,当每周一正 ...

  2. 电脑桌面显示悬浮文字_工作中记录每天做事的软件选择什么电脑桌面便签软件?...

    现代人办公,电脑是工作中常用的工具,在记录每天工作中要做的事情时,不仅可以将每天的工作记录在本子上,也可以借助一些记录每天做事的软件,不少职场人会选择使用电脑桌面便签软件记录工作备忘事项,其一方便查看 ...

  3. 设置下载安装 桌面_工作中记录每天做事的软件选择什么电脑桌面便签软件?...

    现代人办公,电脑是工作中常用的工具,在记录每天工作中要做的事情时,不仅可以将每天的工作记录在本子上,也可以借助一些记录每天做事的软件,不少职场人会选择使用电脑桌面便签软件记录工作备忘事项,其一方便查看 ...

  4. 电脑桌面里的计算机里的软件是啥,工作中记录每天做事的软件选择什么电脑桌面便签软件?...

    原标题:工作中记录每天做事的软件选择什么电脑桌面便签软件? 现代人办公,电脑是工作中常用的工具,在记录每天工作中要做的事情时,不仅可以将每天的工作记录在本子上,也可以借助一些记录每天做事的软件,不少职 ...

  5. 1.简述GPS载波相位测量的基本原理。2.在高精度GPS测量工作中,为什么需要采用载波相位测量方法进行三维定位。3.载波相位测量中,确定整周未知数主要有哪些方法?GNSS测量与数据处理(第六周作业)

    1.简述GPS载波相位测量的基本原理? 载波相位测量的观测量是GPS接收机所接收的卫星载波信号与接收机本振参考信号的相位差. 以表示k接收机在接收机钟面时刻时所接收到的j卫星载波信号的相位值,表示k接 ...

  6. 【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  7. 《当程序员的那些狗日日子》(五)工作中,工作外

    和经理共事了几个月的时间,我对他也慢慢了解起来.他大概比我大三岁,来自新疆,但却是汉族人,是人民大学毕业的研究生.他说他在这里工作是朋友介绍进来的,他的朋友就是公司现在的总经理.每天中午吃过午饭后,我 ...

  8. 如何在工作中快速成长?致工程师的10个简单技巧

    如何在工作中快速成长?致工程师的10个简单技巧 阿里妹导读:阿里有句非常经典的土话,"今天的最好表现,是明天的最低要求."如何挖掘潜能.发现更好的自己?今天,阿里巴巴高级无线开发专 ...

  9. 如何在工作中快速成长?致工程师的 10 个简单技巧

    作者 | 江建明  阿里巴巴高级无线开发专家 **导读:**精英人数的增长速度持续加快后,很多人开始焦虑,我也焦虑,深知要走出焦虑不容易,我想把走出焦虑快速成长的认知和方法写成文章分享给更多人,做成[ ...

最新文章

  1. MySQL检查冗余索引代码
  2. python3 设置函数执行超时 eventlet模块
  3. C++TSL之map容器(悲伤的故事)
  4. JQuery UI 1.8.13发布看看有哪些变动
  5. 耳机不分主从是什么意思_强悍的配置,百元级的价格,Xisem西圣 Ares战神蓝牙耳机体验...
  6. 转 Celery 使用
  7. 6.2 常见多媒体标准及压缩技术
  8. 亚马逊服务器维护,Amazon EC2 维护帮助页面
  9. c++ hsv 红色范围_维生素C的定量测定—2,6二氯酚靛酚法
  10. nlp中bpe_缓冲池扩展(BPE)–内存中OLTP:内存挑战
  11. 学习总结——接口测试基础
  12. java_web学习(六) request对象中的get和post差异
  13. python400集_今日分享」Python400集全套教程
  14. subprocess,类
  15. 计算机图形学-画太极
  16. 2007-2018年软考高级之系统分析师真题及答案解析
  17. 艾美捷胆固醇肉豆蔻酸酯说明书和相关研究
  18. apk开发教程!了解Android架构组件后,构建APP超简单!先收藏了
  19. Java:冒泡排序法
  20. 微信小程序 - 实现车牌输入功能,自定义车牌号输入法组件(键盘弹出后输入车牌号,可自定义各地区及界面样式)超详细注释组件插件示例源码

热门文章

  1. Spring Boot 中的 RestTemplate 不好用?试试 Retrofit!
  2. 一次 Druid 连接池泄露引发的血案!
  3. 又到校招季,来说说面试和实习
  4. 一位 83 岁独立开发者教会我的道理
  5. 技术生涯二三事(上)
  6. 中国程序员容易发音错误的单词
  7. 从程序员到CTO都应该了解的一些技术趋势
  8. Nomad技术手册:调度(Scheduling)
  9. Android Studio——字体大小的修改
  10. Java 洛谷 P1914 小书童——密码