什麼是正等數指數幂?幂等性,就是套個個高大上名字的普通概念,根本就不是新概念,甚至你開發時還經常會實現所謂的幂等性,現在小編就來說說關于什麼是正等數指數幂?下面内容希望能幫助到你,我們來一起看看吧!
幂等性,就是套個個高大上名字的普通概念,根本就不是新概念,甚至你開發時還經常會實現所謂的幂等性。
再詳細點幂等性的通俗概念:調用方,對一個系統進行重複調用(參數全部相同),不論重複調用多少次,這些調用對系統的影響都是相同的效果。就是不論調用我多少次你對我的影響以及你的影響都是不變的,不會随着次數的變化而改變。
舉個簡單的例子:天然幂等性:
假設對象Person中有個name屬性,有個
setName(String name){ this.name = name}
的方法,那這個方法就是天然幂等的哦,你輸入相同的“小明”參數,不論你重複調用多少次都是将名字設置為“小明”,其對對象Person的影響都是一樣的。這就是天然幂等性。
非幂等性:還是拿對象Person舉例子,假設對象中有個age屬性,有個
increaseAge(){ this.age ;}
方法,我們按正常的步驟一次一次調用是不會有問題的,如果調用者沒有控制好邏輯,一次流程重複調用好幾次,這時候影響效果和一次是有非常大區别,代碼編寫者以為它隻會調用一次,結果出現了意外調用了很多次,恰好方法不具有幂等性,于是就會出現和預期不一樣的效果。這個方法本身是不具備幂等性的,我們可以修改這個方法,讓其傳入一個标識符,每一次重複的請求會有相同的标識符,方法内部可以根據标識符查數據庫是不是已經處理過,如果處理過就不重複處理。這樣方法就具備了幂等性。
再舉個實際點的例子:客戶在進行一筆轉賬交易,後端劃分了兩個系統來處理這個轉賬的流程:
①系統A負責收集轉賬人和接收人還有金額的信息然後傳給系統B進行轉賬,将控制邏輯留在系統A。
②系統B讀取系統A傳過來的信息,負責更改數據庫的金額。如果操作成功,就回複系統A成功,如果失敗就回複系統A失敗。
③系統A可以接受系統B操作成功或失敗的回複,但是我們知道,系統A這個交易流程是有等待時間的,如果等待超時,它不确認是否是轉賬成功或失敗,于是系統A會重試調用直到得到一個明确的回複。
這是系統大緻的交易流程。這個流程是有問題的,系統B提供的操作接口不是幂等性的。
邏輯漏洞:假設系統B操作成功了,但是由于系統B回複的時候遇到網絡抖動、網絡阻塞、網絡風暴等,這個成功的消息沒有及時被系統A接收,系統A再重試讓系統B轉賬,結果會導緻:用戶點擊一次轉賬,後台為他轉了很多筆。這是非常危險的。
解決辦法:我們可以為每一筆用戶發起的轉賬請求賦予一個全局唯一的ID,把這個ID在調用系統B的時候一起傳輸進去,第一次系統B處理的時候正常處理,處理完之後把轉賬成功還是失敗的狀态與ID一起存入數據庫,下次重複請求會查找數據庫,查出來數據為空則代表第一次請求,查出來狀态為成功,則直接返回成功,查出來狀态為失敗,則再操作一次。這樣能确保不會出現上述邏輯錯誤
總結:很多方法具有天然的幂等性,有的方法不具備,我們需要業務邏輯層來實現幂等性。我們開發的過程中考慮全面了就能自然的實現幂等性,幂等性根本就不是什麼新的知識。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!