編程思想之冪等性 | 編程之道

前言

今年年初遇到項(xiàng)目災(zāi)難,解決了不少問(wèn)題,這是其中一個(gè)問(wèn)題。很早的時(shí)候?qū)懙模瑢W(xué)以致用的。今天看到還有這樣一篇稿文,那就整理下分享給大家學(xué)習(xí)!編程思想之冪等性


什么是冪等性
既然冪等性源于數(shù)學(xué),那我就使用數(shù)學(xué)公式來(lái)表示,即可一目了然!

f(f(x)) = f(x)

顯然,從上面的二元函數(shù)可以看出,無(wú)論x(等冪元素)被函數(shù)y無(wú)限地執(zhí)行運(yùn)算,它的結(jié)果都是相同的。在計(jì)算機(jī)編程領(lǐng)域中,我們可以這么定義冪等性:在調(diào)用某個(gè)方法、接口中,我們使用相同的參數(shù)(相同的特定參數(shù)),其返回值都是相同的,我們便可稱(chēng)方法、接口具有冪等性。從信仰上說(shuō),冪等性是一種承諾,只要一次答應(yīng)某個(gè)承諾,其承諾內(nèi)容都是不會(huì)改變的。

Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

如何理解冪等性
理解性的理論,舉例子掌握最快。

  • 無(wú)心舉例,看場(chǎng)景更易理解。哈哈

冪等性場(chǎng)景設(shè)計(jì)

下單處理

這個(gè)例子曾經(jīng)出現(xiàn)在我的身邊:微信服務(wù)端在搞事情!
客戶端提交數(shù)據(jù)超過(guò)十秒后,他會(huì)定時(shí)在十秒后自行斷開(kāi)并自動(dòng)再次發(fā)起請(qǐng)求,請(qǐng)求的數(shù)據(jù)體一模一樣,但是這樣的請(qǐng)求是不合法的,屬重復(fù)請(qǐng)求。如何解決此事呢?可以使用冪等性作為一個(gè)良好的解決方案。為解決此問(wèn)題,在此先謝謝騰訊大佬CC,后會(huì)無(wú)期!

原本的方法是這樣設(shè)計(jì)的

function add($userToken, $orderMessage){
  //todo
}

這樣處理那就不能規(guī)避重復(fù)請(qǐng)求了。

基于冪等性來(lái)解決此問(wèn)題,改進(jìn)的設(shè)計(jì)方法

function add($seq,$userToken, $orderMessage){
  // 現(xiàn)根據(jù)seq來(lái)判斷是否已經(jīng)處理過(guò)了,是的話就返回第一次處理的結(jié)果
  $resultJson = $this->redis->get('***_pre_' . $seq);
  if(false != $resultJson){
    return $resultJson;
  }
  // 既然沒(méi)有處理過(guò),那就正式處理
  // todo 
  // 處理完了,沒(méi)有問(wèn)題那就將結(jié)果保存起來(lái)
  // todo
  return $resultJson;
}

冪等性屬于解決此問(wèn)題的一部分,是解決方案的一部分,還有另一部分是異步。


提現(xiàn)
基于冪等性設(shè)計(jì) | 防止用戶多次點(diǎn)擊(后端是不相信前端處理的)或者突然網(wǎng)絡(luò)異常等情況下,可以保持?jǐn)?shù)據(jù)的一致性。

兩個(gè)步驟:

  • 后端生產(chǎn)票據(jù) | 生產(chǎn)隊(duì)時(shí)給你發(fā)糧票,你才有機(jī)會(huì)拿錢(qián)去購(gòu)買(mǎi)柴米油鹽醬醋茶
  • 根據(jù)上一步拿到合法的票據(jù)來(lái)提現(xiàn)
function createTicketSequence($user) : string{
  // todo 
}
function withdraw($ticketSequence,$user,$amount){
  // todo
}

場(chǎng)景理解
1、用戶在取款的時(shí)候,客戶端先帶上token請(qǐng)求服務(wù)端生成一個(gè)合法的取款憑證ticketSequeuence
2、用戶在輸入取款金額并確認(rèn)取款后,客戶端將會(huì)帶上用戶登錄憑證userToken、取款票據(jù)ticketSequence以及取款金額amount進(jìn)行請(qǐng)求
3、服務(wù)端接收到請(qǐng)求后,先校驗(yàn)userToken,校驗(yàn)失敗則返回重新登錄,否則換取user對(duì)象
4、用戶鑒權(quán)通過(guò)后,那么再來(lái)校驗(yàn)取款票據(jù)ticketSequence,票據(jù)不合法,那么取款失敗,否則繼續(xù)進(jìn)行取款,一直到取款成功并根據(jù)票據(jù)作為冪等值來(lái)保存提現(xiàn)成功的結(jié)果
5、即使客戶端請(qǐng)求后與服務(wù)端失去了聯(lián)系,并且服務(wù)端處理成功,客戶端處于假死的狀態(tài)并再次請(qǐng)求取款,也是返回第一次的結(jié)果,并且是迅速的響應(yīng)。

價(jià)值源于技術(shù),技術(shù)源于分享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容