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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

如何保证接口的幂等性

發布時間:2023/12/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何保证接口的幂等性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何保證接口的冪等性

什么是冪等性

冪等性是系統服務對外一種承諾,承諾只要調用接口成功,外部多次調用對系統的影響是一致的。聲明為冪等的服務會認為外部調用失敗是常態,并且失敗之后必然會有重試。

通俗地說,接口冪等性就是用戶對于同一操作發起的一次請求或者多次請求的結果是一致的,不會因為多次點擊而產生了副作用。

舉個最簡單的例子,那就是支付,用戶購買商品后支付,支付扣款成功,但是返回結果的時候網絡異常,此時錢已經扣了,用戶再次點擊按鈕,此時會進行第二次扣款,返回結果成功,用戶查詢余額返發現多扣錢了,流水記錄也變成了兩條,這就沒有保證接口的冪等性

什么情況下需要冪等

以SQL為例子

SQL分析是否冪等
SELECT col1 FROM tab1 WHER col2=2無論執行多少次都不會改變狀態
UPDATE tab1 SET col1=1 WHERE col2=2無論執行成功多少次狀態都是一致的
UPDATE tab1 SET col1=col1+1 WHERE col2=2每次執行的結果都會發生變化
INSERT INTO USER(userid,name) VALUES(1,'a')如userid為唯一主鍵,即重復操作上面的業務,只會插入一條用戶數據
同上如userid不是主鍵,可以重復,那上面業務多次操作,數據都會新增多條
DELETE FROM user WHERE userid=1多次操作,結果一樣

如何保證冪等

token機制

  • 服務端提供了發送token的接口。我們在分析業務的時候,哪些業務是存在冪等問題的,就必須在執行業務前,先去獲取token,服務器會把token保存到redis中。
  • 然后調用業務接口請求時,把token攜帶過去,一般放在請求頭部。
  • 服務器判斷token是否存在redis中,存在表示第一次請求,然后刪除token,繼續執行業務。
  • 如果判斷token不存在redis中,就表示是重復操作,直接返回重復標記給client,這樣就保證了業務代碼,不被重復執行。

  • 關鍵點:先刪除token,還是后刪除token?

    后刪除token:如果進行業務處理成功后,刪除redis中的token失敗了,這樣就導致了有可能會發生重復請求,因為token沒有被刪除。這個問題其實是數據庫和緩存redis數據不一致問題。

    先刪除token:如果系統出現問題導致業務處理出現異常,業務處理沒有成功,接口調用方也沒有獲取到明確的結果,然后進行重試,但token已經刪除掉了,服務端判斷token不存在,認為是重復請求,就直接返回了,無法進行業務處理了。

    先刪除token可以保證不會因為重復請求,業務數據出現問題。出現業務異常,可以讓調用方配合處理一下,重新獲取新的token,再次由業務調用方發起重試請求就ok了。


    token機制缺點

    業務請求每次請求,都會有額外的請求(一次獲取token請求、判斷token是否存在的業務)(也就是額外的花銷)。在真實的生產環境中,1萬請求也就10個左右的請求會發生重試,為了這10個請求,我們讓9990個請求都發生了額外的請求。

    樂觀鎖機制

    這種方法適合在更新的場景中

    update t_goods set count = count -1 , version = version + 1 where good_id=2 and version = 1

    根據version版本,也就是在操作庫存前先獲取當前商品的version版本號,然后操作的時候帶上此version號。

    我們梳理下,我們第一次操作庫存時,得到version為1,調用庫存服務version變成了2;但返回給訂單服務出現了問題,訂單服務又一次發起調用庫存服務,當訂單服務傳如的version還是1,再執行上面的sql語句時,就不會執行;因為version已經變為2了,where條件就不成立。這樣就保證了不管調用幾次,只會真正的處理一次。

    樂觀鎖主要使用于處理讀多寫少的問題。

    唯一主鍵

    這個機制是利用了數據庫的主鍵唯一約束的特性,解決了在insert場景時冪等問題。但主鍵的要求不是自增的主鍵,這樣就需要業務生成全局唯一的主鍵。

    如果是分庫分表場景下,路由規則要保證相同請求下,落地在同一個數據庫和同一表中,要不然數據庫主鍵約束就不起效果了,因為是不同的數據庫和表主鍵不相關。

    防重表(唯一索引)

    使用訂單號orderNo做為去重表的唯一索引,把唯一索引插入去重表,再進行業務操作,且他們在同一個事務中。這個保證了重復請求時,因為去重表有唯一約束,導致請求失敗,避免了冪等問題。這里要注意的是,去重表和業務表應該在同一庫中,這樣就保證了在同一個事務,即使業務操作失敗了,也會把去重表的數據回滾。這個很好的保證了數據一致性。

    唯一緩存ID

    調用接口時,生成一個唯一緩存ID,redis將數據保存到集合中(去重),存在即處理過。

    參考資料

  • 如何保證接口的冪等性
  • 接口的冪等性,如何保證
  • 總結

    以上是生活随笔為你收集整理的如何保证接口的幂等性的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国模二区| 日本免费专区 | 色午夜视频 | 欧美午夜精品久久久久久孕妇 | 日韩激情中文字幕 | 一级aaaa毛片 | 99热精品在线观看 | 午夜偷拍视频 | 在线观看一区二区视频 | 国精产品一二三区精华液 | 自拍一区在线 | 国产女人叫床高潮大片免费 | 一区二区三区成人 | 中日一级片 | 草草影院国产第一页 | 国产av一区二区三区精品 | 3d成人动漫在线观看 | 亚洲女人久久久 | 人人插人人爽 | 日韩中文字幕第一页 | 桃色在线视频 | 五月激情六月丁香 | 男人天堂va | 性少妇mdms丰满hdfilm | 三男一女吃奶添下面 | 国产无遮挡又黄又爽又色视频 | 久久aⅴ乱码一区二区三区 亚洲成人18 | 一区二视频 | 欧美日韩一区二区三区在线观看 | 国产suv精品一区二区60 | 狠狠婷婷 | 欧美蜜桃视频 | 久久精品久久久 | 亚洲性生活视频 | 超碰在线网站 | 狠狠操你 | 久本草精品 | 无码国内精品人妻少妇蜜桃视频 | 我们好看的2018视频在线观看 | jizz免费观看| 精东影业一区二区三区 | 插吧插吧网 | 在线欧美日韩国产 | 精品一区二区在线免费观看 | 久久不卡免费视频 | 精品人妻无码一区二区性色 | 中文字幕在线欧美 | 欧美日韩高清一区 | 四虎国产 | 蜜桃视频污在线观看 | 色妹av | 日本精品视频 | 成人毛片18女人毛片免费 | 黄色网址免费 | 亚洲欧洲精品视频 | 国产精品亚洲二区在线观看 | 美女精品久久 | av男人的天堂网 | 伊人色爱 | 青青操国产视频 | 九九九九九热 | 337p日本欧洲亚洲大胆张筱雨 | 国产精品一区二区三区四区在线观看 | 日本高清视频免费观看 | 亚洲精品成人电影 | youjizz.com最新| 国产无遮挡裸体免费视频 | 青娱乐国产盛宴 | 男女午夜网站 | 手机看片福利久久 | 美女视频黄色免费 | 国产精品久久一区二区三区动 | 六月激情综合网 | 国产激情毛片 | 成人av影视在线观看 | 日韩一级色片 | 国产精品无码av无码 | 欧美自拍视频在线观看 | 四虎影视永久免费 | av免费看网址 | 亚洲国产精品成人无久久精品 | 伊人久久五月天 | 国产高清免费在线观看 | 国产sm调教视频 | 欧美精品在线第一页 | 中文在线观看视频 | 成人免费午夜 | 亚洲成人第一页 | 一区二区蜜桃 | 亚洲一区二区福利 | 国产又粗又猛又爽视频 | 视频在线中文字幕 | 黑人中文字幕一区二区三区 | 日韩爽片| 初高中福利视频网站 | 欧美色v | 中文字幕人妻一区二区三区视频 | 欧美成人三区 | 精品无码三级在线观看视频 |