欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

记录一次生产发布事件——(简单的非空验证也能引发大问题)

发布时间:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 记录一次生产发布事件——(简单的非空验证也能引发大问题) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

事件经过

下午四点,发布生产g环境(生产环境m为正式环境,g为内测环境)。这时测试有人提出“服务器忙”。听到这里我赶紧翻了翻内测日志,发现了最熟悉的老朋友——未将对象引用设置到对象的实例。问题出现在如下代码上。(我下面附上了伪代码,大家可以看看下面的代码有没有问题,当时我看了很久才发现问题所在)


public AccountInfo GetAccountInfo(){

AccountInfo info=cache.GetCache();
if(info!=null)
{
return info;
}
info=SOAService.GetInfo();
if(info!=null){
cache.SetCache(info);
return info;
}
return null;
}
public class SOAService()
{

public static AccountInfo GetInfo()
{

SOAClient client=SOAClient.GetClient();

Account account= client.GetAccountInfo();
if(account!=null){
AccountInfo info=new AccountInfo();
info.xx=account.xx;

info.Test=account.Test??string.empty;
return info;
}
return null;
}
}


public class AccountInfo{

private string name;



private string test;


public string Name{
get { return this.name; }
set { this.name=value; }
}


public string Test{
get { return this.test; }
set { this.test=value; }
}
}

在代码中观察许久仍没有发现问题。这时测试一句话提醒了我,“我看m环境没有问题”。灵光一闪,原来测试先从m环境登录,浏览了一圈页面后,已经缓存了AccountInfo,但是m环境此时是没有新增字段Test的,此时切换到g环境(我们的m环境,g环境对应缓存数据都是一样的,区别仅仅是应用服务器不同),获取账户信息时会直接从Cache中读出来,然后accountInfo.Test在用之前并没有判空,所以...未将对象引用设置到对象的实例。于是乎得意的跟测试说,你登录后别再m环境操作,直接切到g环境,就可以了,等发m不会有问题的。果不其然,测试按我说的做了不再报错。

如果你以为事情就这么结束,那就错了。请原谅我那猪友蒙了心的傻叉操作。不久,g环境验证无误,开始往m环境发布。起初未见异常,当发了集群大概三分之一节点的时候,大量异常突然袭来,瞬间监控开始报警。一看日志满屏的老朋友。紧急关头得亏脑子反应快,紧急回滚代码。静下心来脑子一想,生产用户本身处于登录状态,有使用缓存。刚刚出现问题没去处理,真是悔之晚矣!于是紧急修复。增加使用前判空,问题终于解决。

事件教训

  • 对于程序中大量使用缓存的系统,开发时一定要考虑好缓存。(这个系统一些不合理的缓存设计坑的我苦不堪言)

  • 对于测试中的每一个问题都要认真对待

  • 纸上得来终觉浅——背的滚瓜烂熟的,缓存穿透、雪崩,缓存更新、程序非空验证。实战起来还是不够用

  • 敬畏每一次生产环境的发布


总结

以上是生活随笔为你收集整理的记录一次生产发布事件——(简单的非空验证也能引发大问题)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。