亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、什么是冪等?

**冪等性:**多次調(diào)用方法或者接口不會改變業(yè)務(wù)狀態(tài),可以保證重復(fù)調(diào)用的結(jié)果和單次調(diào)用的結(jié)果一致。

二、使用冪等的場景

1、前端重復(fù)提交

用戶注冊,用戶創(chuàng)建商品等操作,前端都會提交一些數(shù)據(jù)給后臺服務(wù),后臺需要根據(jù)用戶提交的數(shù)據(jù)在數(shù)據(jù)庫中創(chuàng)建記錄。如果用戶不小心多點了幾次,后端收到了好幾次提交,這時就會在數(shù)據(jù)庫中重復(fù)創(chuàng)建了多條記錄。這就是接口沒有冪等性帶來的 bug。

2、接口超時重試

對于給第三方調(diào)用的接口,有可能會因為網(wǎng)絡(luò)原因而調(diào)用失敗,這時,一般在設(shè)計的時候會對接口調(diào)用加上失敗重試的機制。如果第一次調(diào)用已經(jīng)執(zhí)行了一半時,發(fā)生了網(wǎng)絡(luò)異常。這時再次調(diào)用時就會因為臟數(shù)據(jù)的存在而出現(xiàn)調(diào)用異常。

3、消息重復(fù)消費

在使用消息中間件來處理消息隊列,且手動 ack 確認消息被正常消費時。如果消費者突然斷開連接,那么已經(jīng)執(zhí)行了一半的消息會重新放回隊列。

當(dāng)消息被其他消費者重新消費時,如果沒有冪等性,就會導(dǎo)致消息重復(fù)消費時結(jié)果異常,如數(shù)據(jù)庫重復(fù)數(shù)據(jù),數(shù)據(jù)庫數(shù)據(jù)沖突,資源重復(fù)等。

三、解決方案

1、token 機制實現(xiàn)

通過token 機制實現(xiàn)接口的冪等性,這是一種比較通用性的實現(xiàn)方法。

示意圖如下:

接口冪等解決方案

 

具體流程步驟:

  1. 客戶端會先發(fā)送一個請求去獲取 token,服務(wù)端會生成一個全局唯一的 ID 作為 token 保存在 redis 中,同時把這個 ID 返回給客戶端
  2. 客戶端第二次調(diào)用業(yè)務(wù)請求的時候必須攜帶這個 token
  3. 服務(wù)端會校驗這個 token,如果校驗成功,則執(zhí)行業(yè)務(wù),并刪除 redis 中的 token
  4. 如果校驗失敗,說明 redis 中已經(jīng)沒有對應(yīng)的 token,則表示重復(fù)操作,直接返回指定的結(jié)果給客戶端

注意:

  1. 對 redis 中是否存在 token 以及刪除的代碼邏輯建議用 Lua 腳本實現(xiàn),保證原子性
  2. 全局唯一 ID 可以用百度的 uid-generator、美團的 Leaf 去生成

2、基于 MySQL 實現(xiàn)

這種實現(xiàn)方式是利用 mysql 唯一索引的特性。

示意圖如下:

接口冪等解決方案

 

具體流程步驟:

  1. 建立一張去重表,其中某個字段需要建立唯一索引
  2. 客戶端去請求服務(wù)端,服務(wù)端會將這次請求的一些信息插入這張去重表中
  3. 因為表中某個字段帶有唯一索引,如果插入成功,證明表中沒有這次請求的信息,則執(zhí)行后續(xù)的業(yè)務(wù)邏輯
  4. 如果插入失敗,則代表已經(jīng)執(zhí)行過當(dāng)前請求,直接返回

3、基于 redis 實現(xiàn)

這種實現(xiàn)方式是基于 SETNX 命令實現(xiàn)的

SETNX key value:將 key 的值設(shè)為 value ,當(dāng)且僅當(dāng) key 不存在。若給定的 key 已經(jīng)存在,則 SETNX 不做任何動作。

該命令在設(shè)置成功時返回 1,設(shè)置失敗時返回 0。

示意圖如下:

接口冪等解決方案

 

具體流程步驟:

  1. 客戶端先請求服務(wù)端,會拿到一個能代表這次請求業(yè)務(wù)的唯一字段
  2. 將該字段以 SETNX 的方式存入 redis 中,并根據(jù)業(yè)務(wù)設(shè)置相應(yīng)的超時時間
  3. 如果設(shè)置成功,證明這是第一次請求,則執(zhí)行后續(xù)的業(yè)務(wù)邏輯
  4. 如果設(shè)置失敗,則代表已經(jīng)執(zhí)行過當(dāng)前請求,直接返回

總結(jié)

這幾種實現(xiàn)冪等的方式其實都是大同小異的,類似的還有使用狀態(tài)機、悲觀鎖、樂觀鎖的方式來實現(xiàn),都是比較簡單的。

則代表已經(jīng)執(zhí)行過當(dāng)前請求,直接返回

總結(jié)

這幾種實現(xiàn)冪等的方式其實都是大同小異的,類似的還有使用狀態(tài)機、悲觀鎖、樂觀鎖的方式來實現(xiàn),都是比較簡單的。

總之,當(dāng)你去設(shè)計一個接口的時候,冪等都是首要考慮的問題,特別是當(dāng)你負責(zé)設(shè)計轉(zhuǎn)賬支付這種涉及到 money 的接口,你要格外注意嘍!

分享到:
標(biāo)簽:接口
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定