新聞中心
程序健壯性非常重要,要怎么玩怎么寫(xiě)才能讓程序更加魯棒呢?我又這么幾點(diǎn)小建議。

一、進(jìn)行統(tǒng)一的業(yè)務(wù)處理響應(yīng)
根據(jù)螞蟻金服開(kāi)放平臺(tái)的標(biāo)準(zhǔn)返回,一個(gè) response 至少應(yīng)當(dāng)有4個(gè)返回值。
1、isSuccess 調(diào)用是否成功
2、data 返回的響應(yīng)數(shù)據(jù)
3、errorCode 錯(cuò)誤碼
4、errorMsg 錯(cuò)誤信息
這就要求我們的接口要有標(biāo)準(zhǔn)的統(tǒng)一的 response ,那怎么實(shí)現(xiàn)呢?
1、Spring 切面, JDK 動(dòng)態(tài)代理,Cglib 動(dòng)態(tài)代理等用代理類實(shí)現(xiàn)
2、匿名子類,使用一個(gè)公共的 Executor 來(lái)負(fù)責(zé)處理所有的請(qǐng)求。
上面兩種模式都可以實(shí)現(xiàn)標(biāo)準(zhǔn)的 response 的封裝,那么具體要封裝哪些東西呢?其實(shí)最主要的就是統(tǒng)一的 try catch,防止出現(xiàn)任何的 500 錯(cuò)誤給到調(diào)用方。
------ 為什么要在最外層去完成呢?------
因?yàn)?500 錯(cuò)誤對(duì)于調(diào)用方來(lái)說(shuō)是致命而且是毫無(wú)價(jià)值的,無(wú)論調(diào)用方是前端還是其他的業(yè)務(wù)系統(tǒng)
------ 設(shè)定統(tǒng)一的錯(cuò)誤碼 ------
如
參數(shù)錯(cuò)誤 PARAMETER_ERROR
數(shù)據(jù)庫(kù)錯(cuò)誤 DATABASE_ERROR
外部系統(tǒng)錯(cuò)誤 OUTER_SYSTEM_ERROR
如果有了上面的這些錯(cuò)誤碼以及錯(cuò)誤信息,業(yè)務(wù)方至少可以告知用戶究竟發(fā)生了什么事,也可以設(shè)定一些列的告警以及自動(dòng)化運(yùn)維的方式來(lái)處理這些錯(cuò)誤。
二、參數(shù)檢查
在進(jìn)行真正的邏輯處理前,應(yīng)當(dāng)對(duì)入?yún)⑦M(jìn)行一系列的校驗(yàn),以保持后續(xù)業(yè)務(wù)處理邏輯的輕量,這也是 fast fail 思想的指導(dǎo),有錯(cuò)誤盡早結(jié)束處理。
具體是怎樣的呢?我們假設(shè)參數(shù)為 m.
- if( null == m ){return ;}
進(jìn)行空判斷,防止后續(xù)滴啊用m發(fā)生 NullPointerException,但這里也不建議拋出NPE,因?yàn)榭吹饺罩疽矔?huì)很迷惑。
- if( StringUtils.isEmpty( m ) ){return ;}
字符串是否為空串
- if( CollectionUtils.isEmpty.isEmpty( m ) ){return ;}
集合是否為空或者null
- try{
- JSON.parseObject( m );
- return true;
- }
- catch(JSONExceptin e){
- return false;
- }
判斷字符串是否為 JSON 格式
三、重試機(jī)制
對(duì)于特定的外部系統(tǒng)錯(cuò)誤,可以嘗試多次重試這種策略,當(dāng)然這也是簡(jiǎn)歷在對(duì)方的服務(wù)是冪等的前提下。這樣做在某些網(wǎng)絡(luò)不穩(wěn)定的情況下可以提高響應(yīng)成功率。
四、冪等機(jī)制
什么叫冪等?意思就是 無(wú)論何時(shí)何處何人,只要是先攻的請(qǐng)求,就應(yīng)當(dāng)有相同的響應(yīng),直到到達(dá)終態(tài)。
這個(gè)原則并不關(guān)注上一次的執(zhí)行結(jié)果,企鵝本次結(jié)果不應(yīng)當(dāng)因?yàn)樯弦淮握?qǐng)求的部分成功或者失敗而導(dǎo)致某些中間狀態(tài)不一致導(dǎo)致請(qǐng)求失敗。
五、Lambda
- Optionl.of( target )
- .getOrElse( new ArrayList() )
- .filter( Object::NotNull)
- .forEach( () -> {} )
這種寫(xiě)法可以確保絕大部分的異常不出現(xiàn),特別是在對(duì)于集合進(jìn)行處理的時(shí)候,因?yàn)榧现兄灰衅渲幸粋€(gè)值是會(huì)導(dǎo)致程序失敗的,整個(gè)程序都會(huì)報(bào)錯(cuò)。這樣寫(xiě)因?yàn)閷?duì)數(shù)據(jù)做了比較多的檢查和兼容,所以出現(xiàn)錯(cuò)誤的概率會(huì)比較低,但也會(huì)有一個(gè)弊端,就是當(dāng)這樣的程序都出現(xiàn)異常的時(shí)候,開(kāi)發(fā)者一般不知從何查起,要定位出是哪行數(shù)據(jù)就已經(jīng)很費(fèi)勁了。
【本文為專欄作者“大蕉”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)“一名叫大蕉的程序員”獲取授權(quán)】
網(wǎng)站名稱:關(guān)于Java健壯性的一些思考與實(shí)踐
網(wǎng)站URL:http://www.5511xx.com/article/coiocpc.html


咨詢
建站咨詢
