记录一次生产发布事件——(简单的非空验证也能引发大问题)
事件經(jīng)過
下午四點,發(fā)布生產(chǎn)g環(huán)境(生產(chǎn)環(huán)境m為正式環(huán)境,g為內(nèi)測環(huán)境)。這時測試有人提出“服務(wù)器忙”。聽到這里我趕緊翻了翻內(nèi)測日志,發(fā)現(xiàn)了最熟悉的老朋友——未將對象引用設(shè)置到對象的實例。問題出現(xiàn)在如下代碼上。(我下面附上了偽代碼,大家可以看看下面的代碼有沒有問題,當(dāng)時我看了很久才發(fā)現(xiàn)問題所在)
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; }
}
}
在代碼中觀察許久仍沒有發(fā)現(xiàn)問題。這時測試一句話提醒了我,“我看m環(huán)境沒有問題”。靈光一閃,原來測試先從m環(huán)境登錄,瀏覽了一圈頁面后,已經(jīng)緩存了AccountInfo,但是m環(huán)境此時是沒有新增字段Test的,此時切換到g環(huán)境(我們的m環(huán)境,g環(huán)境對應(yīng)緩存數(shù)據(jù)都是一樣的,區(qū)別僅僅是應(yīng)用服務(wù)器不同),獲取賬戶信息時會直接從Cache中讀出來,然后accountInfo.Test在用之前并沒有判空,所以...未將對象引用設(shè)置到對象的實例。于是乎得意的跟測試說,你登錄后別再m環(huán)境操作,直接切到g環(huán)境,就可以了,等發(fā)m不會有問題的。果不其然,測試按我說的做了不再報錯。
如果你以為事情就這么結(jié)束,那就錯了。請原諒我那豬友蒙了心的傻叉操作。不久,g環(huán)境驗證無誤,開始往m環(huán)境發(fā)布。起初未見異常,當(dāng)發(fā)了集群大概三分之一節(jié)點的時候,大量異常突然襲來,瞬間監(jiān)控開始報警。一看日志滿屏的老朋友。緊急關(guān)頭得虧腦子反應(yīng)快,緊急回滾代碼。靜下心來腦子一想,生產(chǎn)用戶本身處于登錄狀態(tài),有使用緩存。剛剛出現(xiàn)問題沒去處理,真是悔之晚矣!于是緊急修復(fù)。增加使用前判空,問題終于解決。
事件教訓(xùn)
對于程序中大量使用緩存的系統(tǒng),開發(fā)時一定要考慮好緩存。(這個系統(tǒng)一些不合理的緩存設(shè)計坑的我苦不堪言)
對于測試中的每一個問題都要認(rèn)真對待
紙上得來終覺淺——背的滾瓜爛熟的,緩存穿透、雪崩,緩存更新、程序非空驗證。實戰(zhàn)起來還是不夠用
敬畏每一次生產(chǎn)環(huán)境的發(fā)布
總結(jié)
以上是生活随笔為你收集整理的记录一次生产发布事件——(简单的非空验证也能引发大问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用性能问题解决实际案例
- 下一篇: 程序员过关斩将--你为什么还在用存储过程