介面冪等性詳解

来源:https://www.cnblogs.com/Yee-Q/p/18012149
-Advertisement-
Play Games

概述 所謂介面冪等性就是:在特定場景下,同一條件的多次介面調用,保證操作只執行一次,如果介面沒有保證冪等性,在以下場景就會產生問題 前端重覆提交:用戶進行註冊、創建個人信息等操作,由於網路抖動導致頁面沒有及時響應,用戶認為沒有成功而多次點擊提交按鈕,發生重覆提交表單請求 介面超時重試:提供外部系統調 ...


概述

所謂介面冪等性就是:在特定場景下,同一條件的多次介面調用,保證操作只執行一次,如果介面沒有保證冪等性,在以下場景就會產生問題

  • 前端重覆提交:用戶進行註冊、創建個人信息等操作,由於網路抖動導致頁面沒有及時響應,用戶認為沒有成功而多次點擊提交按鈕,發生重覆提交表單請求
  • 介面超時重試:提供外部系統調用的介面,因為網路抖動等原因執行成功但沒能及時響應,外部系統發起重試,導致重覆調用
  • 消息重覆消費:使用消息中間件時,消費者手動 ack 確認消息被正常消費時,消費者突然斷開連接,已經執行的消息會重新放回隊列,被其他消費者重新消費

如何實現介面冪等性?

1. 防重 Token 令牌

具體流程如下:

  • 客戶端獲取 token,服務端將 token 保存在 redis 中,token 需保證全局唯一
  • 之後客戶端發起請求時必須攜帶 token
  • 服務端校驗 token,如果成功則執行業務,並刪除 redis 中的 token,否則為重覆操作,直接返回結果

這種方式需保證同一請求都攜帶同一 token,比如同一訂單的支付操作都使用同一 token 請求。另外,在併發情況下,Redis 查找數據與刪除需要保證原子性,可以使用或 Lua 腳本保證

2. 使用 Redis 實現

這種實現方式是基於 redis 的 setnx 命令實現的,作用是如果 key 不存在,將 key 賦值為 value 並返回 1,若 key 已存在,則不做操作並返回 0

具體流程如下:

  • 客戶端請求服務端,將能代表這次請求的唯一標識以 setnx 的方式存入 redis,並根據業務設置相應的超時時間
  • 如果設置成功,代表是第一次請求,執行後續業務邏輯
  • 如果設置失敗,代表已經執行過請求,直接返回

redis 是單線程的,所以不會有併發問題

3. 加鎖實現

具體流程如下:

  • 客戶端請求服務端,對能代表這次請求的唯一標識加鎖,保證同一時刻同一請求只有一個能被執行
  • 服務端根據唯一標識判斷是否第一次請求,比如查詢資料庫是否已存在該唯一標識的記錄,或者該唯一標識對應記錄狀態是否為【已完成】
  • 如果是第一次請求,執行後續業務邏輯,否則直接返回

4. 冪等表

加鎖會影響性能,我們可以建一張冪等表,為能代表這次請求的唯一標識建立唯一約束

具體流程如下:

  • 客戶端請求服務端,服務端會將本次請求的信息插入冪等表
  • 因為有唯一約束,如果冪等表中不存在本次請求記錄,則插入成功,執行後續業務邏輯,插入失敗,則直接返回

使用這種方式,每次請求都會冪等表新建一條記錄,為了避免表數據過大,可以定期進行清理,或者使用流水錶來代替冪等表。使用插入而不是查詢,也能有效避免併發問題


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 上回說到,利用vite載入不同mode下的配置文件,可以實現不同運行環境下的參數配置。在前端應用中經常使用到Websocket,其地址同樣可以在.env中間中配置。 代碼 vite.config.ts代碼的執行是在createApp之前,不可以在vite.config.ts中使用例如pinia ...
  • 步驟 根目錄新建.env.development和.env.production文件 package.json配置啟動參數 vite命令啟動項目時,指定mode參數,載入vite.config.ts文件。 "dev": "vite --host 0.0.0.0 --port 8093 --mode ...
  • 找半天沒找到相關的內容,自己搗鼓出來的,記錄一下。(比較可惜的是只能獲取靜態圖片,動態壁紙就不知道了咋弄了) uniapp的話還可以參考一下如何用NJS獲取手機桌面壁紙? - DCloud問答下麵DCloud_heavensoft 大佬的一個回答 : “Native.js很多類型沒有。用uts可以  ...
  • 前言 以前使用的都是預設的博客園主題,最近剛好有空,著手定製以下自己的博客園主題。最終效果參考當前的博客,如果看不到則需要在博客園首頁頭像處懸停關閉簡潔模式 思路是儘量保持原有結構,不進行破壞性改動,以 css 樣式為主 本主題是輕量化的,只是在原有基礎上微調樣式。如有需要更豐富功能的可以自己搜索博 ...
  • 迴首 在 零基礎入門Vue之夢開始的地方——插值語法 我記錄了v-bind、v-on、v-model的學習 在 零基礎入門Vue之To be or not to be——條件渲染 我記錄了v-if、v-else-if、v-else、v-show的學習 在 零基礎入門Vue之影分身之術——列表渲染&渲 ...
  • Rich庫的功能就像它的名字一樣,使Python編程更加豐富(rich),它幫助開發者在控制台(命令行)輸出中創建豐富、多彩和具有格式化的文本。 本篇總結瞭如何使用Rich庫讓我們的命令行工具更加美觀。 1. 安裝 通過pip安裝: pip install rich 使用下麵的命令驗證是否安裝成功。 ...
  • G 題面 定義\({{dp_i}_j}_k\)為考慮完第i個點,最左邊沒有染色的點為\(j\),最右邊沒有染色的點為\(k\)的最小數量。 考慮轉移(用自己更新別人) 如果不用\(i\),直接轉移到\({{dp_{i+1}}_j}_k\)。 如果向左噴,\(k\)為\(max({i+1,k})\), ...
  • 關註我,緊跟本系列專欄文章,咱們下篇再續! 作者簡介:魔都技術專家兼架構,多家大廠後端一線研發經驗,各大技術社區頭部專家博主,編程嚴選網創始人。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。負責: 中央/分銷預訂系統性能優化 活動&優惠券等營銷中台建設 交易平臺及數據中台等架構和開發設計 目 ...
一周排行
    -Advertisement-
    Play Games
  • 在C#中使用SQL Server實現事務的ACID(原子性、一致性、隔離性、持久性)屬性和使用資料庫鎖(悲觀鎖和樂觀鎖)時,你可以通過ADO.NET的SqlConnection和SqlTransaction類來實現。下麵是一些示例和概念說明。 實現ACID事務 ACID屬性是事務處理的四個基本特征, ...
  • 我們在《SqlSugar開發框架》中,Winform界面開發部分往往也用到了自定義的用戶控制項,對應一些特殊的界面或者常用到的一些局部界面內容,我們可以使用自定義的用戶控制項來提高界面的統一性,同時也增強了使用的便利性。如我們Winform界面中用到的分頁控制項、附件顯示內容、以及一些公司、部門、菜單的下... ...
  • 在本篇教程中,我們學習瞭如何在 Taurus.MVC WebMVC 中進行數據綁定操作。我們還學習瞭如何使用 ${屬性名稱} CMS 語法來綁定頁面上的元素與 Model 中的屬性。通過這些步驟,我們成功實現了一個簡單的數據綁定示例。 ...
  • 是在MVVM中用來傳遞消息的一種方式。它是在MVVMLight框架中提供的一個實現了IMessenger介面的類,可以用來在ViewModel之間、ViewModel和View之間傳遞消息。 Send 接受一個泛型參數,表示要發送的消息內容。 Register 方法用於註冊某個對象接收消息。 pub ...
  • 概述:在WPF中,通過EventHandler可實現基礎和高級的UI更新方式。基礎用法涉及在類中定義事件,併在UI中訂閱以執行更新操作。高級用法藉助Dispatcher類,確保在非UI線程上執行操作後,通過UI線程更新界面。這兩種方法提供了靈活而可靠的UI更新機制。 在WPF(Windows Pre ...
  • 概述:本文介紹了在C#程式開發中如何利用自定義擴展方法測量代碼執行時間。通過使用簡單的Action委托,開發者可以輕鬆獲取代碼塊的執行時間,幫助優化性能、驗證演算法效率以及監控系統性能。這種通用方法提供了一種便捷而有效的方式,有助於提高開發效率和代碼質量。 在軟體開發中,瞭解代碼執行時間是優化程式性能 ...
  • 概述:Cron表達式是一種強大的定時任務調度工具,通過配置不同欄位實現靈活的時間規定。在.NET中,Quartz庫提供了簡便的方式配置Cron表達式,實現精準的定時任務調度。這種靈活性和可擴展性使得開發者能夠根據需求輕鬆地制定和管理定時任務,例如每天備份系統日誌或其他重要操作。 Cron表達式詳解 ...
  • 概述:.NET提供多種定時器,如System.Windows.Forms.Timer適用於UI,System.Web.UI.Timer用於Web,System.Diagnostics.Timer用於性能監控,System.Threading.Timer和System.Timers.Timer用於一般 ...
  • 問題背景 有同事聯繫我說,在生產環境上,訪問不了我負責的common服務,然後我去檢查common服務的health endpoint, 沒問題,然後我問了下異常,timeout導致的System.OperationCanceledException。那大概率是客戶端的問題,會不會是埠耗盡,用ne ...
  • 前言: 在本篇 Taurus.MVC WebMVC 入門開發教程的第四篇文章中, 我們將學習如何實現數據列表的綁定,通過使用 List<Model> 來展示多個數據項。 我們將繼續使用 Taurus.Mvc 命名空間,同時探討如何在視圖中綁定並顯示一個 Model 列表。 步驟1:創建 Model ...