日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记录一次生产发布事件——(简单的非空验证也能引发大问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

事件經過

下午四點,發布生產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環境發布。起初未見異常,當發了集群大概三分之一節點的時候,大量異常突然襲來,瞬間監控開始報警。一看日志滿屏的老朋友。緊急關頭得虧腦子反應快,緊急回滾代碼。靜下心來腦子一想,生產用戶本身處于登錄狀態,有使用緩存。剛剛出現問題沒去處理,真是悔之晚矣!于是緊急修復。增加使用前判空,問題終于解決。

事件教訓

  • 對于程序中大量使用緩存的系統,開發時一定要考慮好緩存。(這個系統一些不合理的緩存設計坑的我苦不堪言)

  • 對于測試中的每一個問題都要認真對待

  • 紙上得來終覺淺——背的滾瓜爛熟的,緩存穿透、雪崩,緩存更新、程序非空驗證。實戰起來還是不夠用

  • 敬畏每一次生產環境的發布


總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。