java开发事故如何处理_记一次缓存事故
善于总结,才能更快进步
通常,我们队高并发的数据都会进行缓存,而且为了防止缓存过大,通常我们都会把缓存设置一个超时时间,并且会有cache miss机制。本文,我记录一下错误的缓存机制引起的BUG。
起因
好好的一个国庆,自己完全没歇停,让我给毁了。线上一次cache miss导致缓存数据错误,便一直在查因。然后重写代码、测试、上线。emmm......
直接看代码
当然是伪代码了
cache = new cache();
data = cache.getData();
if(isempty(data)) {
data = getDataFromResource()
if(!isempty(data)) {
cache.setData(data)
}
}
看上去没错哈,一般我们处理缓存的确是用这个步骤:
读取缓存
若cache miss(超时、网络原因),从数据源读取缓存
重新设置缓存
正常来说,这样的确是没问题的。
但是,请接着往下看。
资源类大致是这样的
//上文getDataFromResource() 就是本类中读取数据
class resource{
private static connection = new Connection();
public static getConnection() {
return connection;
}
public getData() {
try{
//todo:do anythings
data = connection.get();
return data;
}catch(e){
return null;
}
}
}
而我的缓存类是基于资源类的
class cache extends resource {
}
就是说,我缓存类依赖的连接资源,也是我原始资源的来源。
事故原因
当其中某次请求发生错误的时候(比如连接不可用,网络卡顿丢包等等),资源类中的基类方法请求失败,因此返回了NULL。 可能会感觉很奇怪啊,明明我有空校验。但是,业务是复杂的,缓存的数据是从多方资源获取而来,因此,上文getDataFromResource()方法并不为空,而是有部分数据存在。
因此导致了缓存只将部分数据写入失败!!!!!!
解决方式
不要信任数据源一定是正确的,要考虑数据源可能存在不正确的方式(目前处理方式)
if(isempty(data)) {
data = getDataFromResource()
if(!isempty(data)) {
//todo:增加数据校验
if(isValid(data)) {
cache.setData(data)
}else{
//todo:发送邮件通知,告诉开发数据可能不稳定
mail.send();
//todo:抛出异常,控制器处理,本次请求失败
throw Exception();
}
}
}
或者提前计算好缓存,本次cache miss直接抛出异常,不需要计算考虑复杂的逻辑
java开发事故如何处理_记一次缓存事故相关推荐
- 初级java开发学习路线_成为初级全栈Web开发人员的10分钟路线图
初级java开发学习路线 So you have started your journey into the world of web development. But what do you lea ...
- java开发cs项目_本硕机械转行cs(java后端开发)上岸之路
秋招转眼就结束了,将近一年的努力,总算给了自己一个比较满意的结果.写下这篇贴子记录自己的转行以及秋招经历. 其实在转行初期,就无数次幻想着秋招结束,然后写一篇长长的经验贴的那种满足感.下面我尽量把我知 ...
- 学java 开发会掉头_作为一个全新的开发人员,我会学到什么
学java 开发会掉头 重点 (Top highlight) It's been five years since I learned to code and changed careers. 自从我 ...
- java开发面试复试_面试java开发,面试官会问哪些问题?
作为一个当初从学校刚毕业找工作而被面试饱经摧残的小白,到现在的java开发从业人员,中间不可谓之不艰辛,当初的屡屡碰壁,工作受挫,一直到现在我仍然认为那是我人生中不可或缺的一段经历. 关于面试的艰辛这 ...
- java 开发人员工具_每个Java开发人员都应该知道的10个基本工具
java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...
- java开发常见异常_最常见的Java异常及其对Java开发人员的评价
java开发常见异常 我知道我说过在完成视频之前我不会发帖,但这一直困扰着我. 至于视频的更新,我有些懒散,有些忙碌,但是我已经准备好记录第一集,这是我第一次有机会,而且我不需要太多的编辑. 无论如何 ...
- java开发简历编写_如何通过几个简单的步骤编写出色的初级开发人员简历
java开发简历编写 So you've seen your dream junior developer role advertised, and are thinking about applyi ...
- 海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...
在找工作之前,大家都要做一些准备工作,java开发也是如此 掌握核心JavaSE 首先,从核心Java(JavaSE)开始学习,尽可能地掌握它.你应该了解和掌握一些基本概念,如循环,数组,运算符等等. ...
- java 开发书籍 目录_《零基础 Java 开发 》全书目录
第1部分 Java开发基础 第一章 搭建Java开发环境 1.1 Java简介 1.2 Java开发环境搭建 1.3 Java语⾔的功能 1.4 使用Eclipse开发Java程序 1.5 使用IDE ...
最新文章
- 2007过年休息的日子
- 脚本路径问题_dirname
- 大话App测试2.0笔记2
- 一个使用 asyncio 协程的网络爬虫(一)
- python脚本画pie饼图_python 使用matplotlib.pyplot.pie绘制饼图
- (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
- C#调用百度地图API入门解决BMap未定义问题
- 【数据结构】C++单链表实现多项式加法(直接输入多项式)
- P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】
- MIP 移动网页加速器视频教程全新发布
- 3_数据分析—数据清洗及特征处理
- oracle mysql 数据类型对比_Oracle、SQL Server、MySQL数据类型对比
- pytorch 实现RBF网络
- 拓端tecdat|使用R语言进行机制检测的隐马尔可夫模型HMM
- LitePal的简单使用
- syslinux和grub引导linux,在Arch上使用Syslinux替代GRUB
- Tensorflow基础语法以及网络搭建
- 菜鸟在学编程__LSJ
- 使用多个磁盘分区创建逻辑卷
- JAVA 安全-JWT 安全及预编译 CASE 注入等
热门文章
- Java代码风格:最终决定
- 使用Java WebSockets,JSR 356和JSON映射到POJO的
- Java – JDK 8的远景
- PIT和TestNG突变测试简介
- win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...
- oracle10g-创建表空间 用户
- oracle导数的数据乱码,Oracle10g导数据时中文乱码相关处理
- 怎么把word里面虚线变成实线_弱电不会制作cad图,花3分钟看完,只要会用WORD保证你能画出来...
- linux 丢包多少正常_Linux 问题故障定位,看看这篇
- oracle utl inaddr,oracle11g之ACL拙见