《專業小詞開課啦》——冪等

在系統對接過程中,當出現接口調用異常的情況時,程序員可能會用一些專業術語來答疑......對于0基礎同學,自然是需要自行百度一番,學習一下!?

接下來,先學習【冪等】

PS: 小白參考1.1~1.4內容即可,達到基本理解。

1.1 冪等是什么

簡單講,就是同一個操作,不管執行多少次(1次或者N次),最終產生的效果都和只執行1次的效果一樣。

即 “做一次”和“做N次”的效果是等價的。

1.2 冪等的重要性

在網絡世界,特別涉及到訂單、支付、重要狀態變更時,因為未知因素“不小心重復執行”是非常非常常見的事情。如:

  • 做了觸發按鈕,不小心點擊了多次;
  • 網絡信號不好,請求發送了2次
  • 系統在處理時 卡頓崩潰了,恢復后重新處理了一次等等

如果沒有冪等處理,那這些重復操作會導致各種后果:重復扣錢;重復創建訂單(只要1個,但是生成了多個);狀態錯亂(已發貨變成待發貨)等

1.3 如何實現冪等?

通過具體的場景示例

1.扣款接口(需要冪等性)——錢不能多扣!

  • 操作:?你用手機支付買一杯奶茶,點擊“確認支付”按鈕。

  • 冪等要求:?無論這個“確認支付”的指令因為網絡卡頓、手抖等原因被系統收到了1次還是100次,你的賬戶應該只被扣一次奶茶的錢(比如20元),奶茶店也只收到一次20元。

  • 非冪等的可怕后果:?如果接口不冪等,系統收到兩次“確認支付”指令,就可能扣你40元!奶茶店也可能收到40元或者系統混亂。這絕對不行!

如何實現?

系統設計扣款接口時,需要有個機制 可識別到 “這是同一個訂單/交易”

  • 給每個支付請求一個唯一“訂單號” (ID):就像快遞單號。

  • 系統記錄處理過的訂單號:系統收到支付請求,先查這個訂單號是否處理過。

    • 如果沒處理過:執行扣款、記錄狀態(已支付)、記下這個訂單號。

    • 如果已經處理過:直接返回上次支付成功的結果(比如“支付成功,已扣款20元”),不再執行實際扣款操作!

  • 結果:?用戶點了N次,只要訂單號一樣,系統只扣一次錢,每次都告訴你支付成功(效果等同于只執行一次)。

場景二:查詢余額接口 (天生冪等) - 查多少次都行!
    • 操作:?你打開手機銀行APP,點擊“查詢余額”。

    • 冪等體現:?你點1次,顯示余額是1000元。你手快點錯了,連續狂點10次“查詢余額”,每次返回的結果都還是顯示1000元(假設期間沒有其他交易)。查詢這個操作本身不會改變你的余額。做一次和做十次,結果都一樣(余額顯示1000元),沒有額外副作用。

    • 為什么天生冪等??因為這個操作只是“讀”數據,不“寫”(修改)數據。讀操作通常不會改變系統狀態。

1.4?冪等性的關鍵點

  1. 核心目標:防止重復操作帶來壞影響,尤其是在會修改數據的操作上。(扣錢、下單、改狀態)
  2. 核心表現:同一個請求(通常有唯一標識/主鍵 來識別,eg:訂單號、流水號等),執行多次==執行1次的效果。
  3. 允許重復調用:但重復調用時,系統能識別出來并確保最終結果正確(要么和第一次結果一致要么不作任何修改)
  4. 重要性:這個是系統穩定的基準之一。不然系統數據會一團糟。
  5. 常見需要冪等的操作: 支付、創建訂單、更新狀態(如確認收貨)、退款等
  6. 常見天生冪等的操作:查詢、獲取信息

1.5?術語版解答

接口冪等性 (Idempotency)?是指:

一個操作(通常由 HTTP 方法表示)被設計成:當客戶端向服務器發送一次或多次具有相同參數的相同請求時,服務器端的最終狀態改變(或產生的副作用)是相同的,并且通常返回相同的響應結果。

關鍵點解析:

  1. 操作 (Operation):?指通過 API 接口執行的特定動作,如創建資源、更新資源、刪除資源、支付等。

  2. 多次相同請求 (Identical Requests):?請求的語義(意圖)和關鍵參數(通常包括一個唯一的冪等鍵?Idempotency-Key)必須完全相同。這些請求可能因網絡問題、客戶端重試、超時重發等原因而產生。

  3. 最終狀態/副作用 (State/Side Effects):?指操作在服務器端數據庫、文件系統或其他持久化存儲中引起的實際變化,以及可能觸發的后續流程(如發送通知、扣款等)。

  4. 效果相同 (Same Effect):

    • 對于修改狀態的操作(PUT,?DELETE, 特定?POST):執行一次和多次,服務器資源最終達到的狀態是完全一致的。

    • 對于不修改狀態的操作(GET,?HEAD):多次執行總是返回相同的結果(假設資源在此期間未被其他操作修改)。

  5. 響應結果 (Response):?在多次執行中,服務器通常應返回相同的 HTTP 狀態碼和響應體(尤其是成功響應)。第一次執行成功后,后續重復請求應返回成功(如?200 OK?或?201 Created)并可能包含首次執行的結果,而不是報錯(除非請求本身無效)。

實現冪等性的典型技術方案:

  1. 冪等鍵 (Idempotency Key):

    • 客戶端在發送非冪等操作(如創建訂單的?POST)時,在請求頭(如?Idempotency-Key: <unique_value>)或請求體中提供一個全局唯一的標識符(UUID 是最佳選擇)。

    • 服務端存儲該 Key 與首次請求的響應結果

    • 當收到相同 Key 的請求時:

      • 若 Key 存在且對應請求已完成:直接返回存儲的響應結果,不執行實際操作

      • 若 Key 存在但對應請求仍在處理中:返回?409 Conflict?或?425 Too Early,提示客戶端稍后重試。

      • 若 Key 不存在:正常處理請求,處理完成后存儲 Key 和響應結果。

  2. 唯一業務標識 (Unique Business Identifier):

    • 利用業務本身的唯一標識(如訂單號、交易流水號、用戶名)作為冪等鍵。

    • 服務端在處理請求前,檢查該唯一標識對應的資源是否已存在或操作是否已執行。

    • 若已存在/已執行:返回已有資源或成功響應(實現冪等)。

    • 若不存在/未執行:執行操作并創建資源/記錄狀態。

  3. 狀態機與樂觀鎖 (State Machine & Optimistic Locking):

    • 定義資源明確的狀態(如?待支付?->?已支付?->?已完成)。

    • 更新操作(如?支付)需要指定期望的當前狀態(如?待支付)。

    • 服務端檢查資源當前狀態是否與期望狀態一致:

      • 一致:執行狀態轉換(如?待支付?->?已支付),操作成功。

      • 不一致(如狀態已是?已支付):說明操作已執行過,返回當前狀態(實現冪等)。常配合版本號(ETag)或更新時間戳實現樂觀鎖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909241.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

滲透實戰PortSwigger Labs指南:自定義標簽XSS和SVG XSS利用

阻止除自定義標簽之外的所有標簽 先輸入一些標簽測試&#xff0c;說是全部標簽都被禁了 除了自定義的 自定義<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 當元素獲得焦點時&#xff08;如通過點擊或鍵盤導航&…

利用pycharm搭建模型步驟

1 如何將別人論文的代碼跑起來&#xff0c;以Pycharm為例&#xff0c;在下載代碼的時候&#xff0c;要注意使用的python版本是多少&#xff0c;并且要注意使用的keras和tensorflow等文件夾的版本&#xff0c;我們可以直接使用pycharm中file文件中的settings&#xff0c;來添加相…

Qt 中directoryChanged監聽某個目錄的內容是否發生變化

Qt 中&#xff0c;directoryChanged 是 QFileSystemWatcher 類的一個信號&#xff0c;用于監聽某個目錄的內容是否發生變化&#xff08;如添加、刪除文件或子目錄&#xff09; ? 一、功能說明 QFileSystemWatcher::directoryChanged(const QString &path) 信號的作用是&…

JavaWeb(Servlet預習)

案例1&#xff1a;基于jspServlet實現用戶登錄驗證 1.input.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"UTF-8&q…

Docker Compose 部署 Prometheus + Grafana

安裝 docker-compose.yml version: 3.8services:# Prometheus 監控服務prometheus:image: prom/prometheus:latestcontainer_name: prometheusrestart: unless-stoppedvolumes:- ./conf/prometheus.yml:/etc/prometheus/prometheus.yml- ./prometheus_data:/prometheuscomman…

準確--使用 ThinBackup 插件執行備份和恢復

使用 ThinBackup 插件執行備份和恢復 導出&#xff08;備份&#xff09;步驟&#xff1a; 進入 Manage Jenkins > ThinBackup。設置 Backup schedule for full backups&#xff08;可選&#xff09;&#xff0c;并配置 Files to exclude&#xff08;可選&#xff09;。點擊…

Qt Creator 從入門到項目實戰

Qt Creator 簡介 Qt Creator 是一個跨平臺的集成開發環境&#xff08;IDE&#xff09;&#xff0c;專門用于開發 Qt 應用程序。它為開發者提供了一個強大的工具集&#xff0c;包括代碼編輯器、調試器、UI 設計器以及性能分析工具等。 1.1 Qt Creator 的安裝 Qt Creator 支持…

公司內網遠程訪問配置教程:本地服務器(和指定端口應用)實現外網連接使用

在數字化時代&#xff0c;企業的辦公模式日益多元化&#xff0c;遠程辦公、跨地區協作等需求不斷增加。這使得在公司內網中配置遠程訪問變得至關重要&#xff0c;它能讓員工無論身處何地&#xff0c;只要有網絡連接&#xff0c;就能便捷地訪問公司內部的各類資源&#xff0c;如…

邊緣計算如何重塑能源管理?從技術原理到應用場景全解析

在全球能源數字化轉型的浪潮中&#xff0c;一個看似不起眼的設備正在悄悄改變工業能效管理的模式 —— 這就是邊緣計算網關。以能源領域為例&#xff0c;傳統的 "設備 - 云端" 二層架構正面臨數據傳輸延遲、網絡帶寬壓力大、斷網失效等挑戰&#xff0c;而邊緣計算技術…

自主導航巡檢機器人系統解決方案

自主導航巡檢機器人系統解決方案 運動性能強大的通用型履帶式機器人底盤&#xff0c;整車采用克里斯蒂全獨立懸掛設計&#xff0c;內部搭載高扭矩無刷電機&#xff0c;通過精心匹配的底盤高度和功率配置&#xff0c;底盤表現出卓越的通過性能、低重心、平穩運行以及高效的傳動效…

Vim 撤銷 / 重做 / 操作歷史命令匯總

Vim 撤銷 / 重做 / 操作歷史命令匯總 Vim 提供了豐富的撤銷&#xff08;undo&#xff09;、重做&#xff08;redo&#xff09;及查看操作歷史的命令&#xff0c;幫助你在編輯過程中靈活地回退或前進到任意修改點。下面按功能分類整理常用命令&#xff0c;便于快速查閱和記憶。…

裝飾模式(Decorator Pattern)重構java郵件發獎系統實戰

前言 現在我們有個如下的需求&#xff0c;設計一個郵件發獎的小系統&#xff0c; 需求 1.數據驗證 → 2. 敏感信息加密 → 3. 日志記錄 → 4. 實際發送郵件 裝飾器模式&#xff08;Decorator Pattern&#xff09;允許向一個現有的對象添加新的功能&#xff0c;同時又不改變其…

項目四.高可用集群_ansible

設備準備 安裝wordpress [rootlocalhost ~]# nmcli c del "Wired connection 1" [rootlocalhost ~]# nmcli c add type ethernet ifname ens224 con-name ens224 ipv4.method manual ipv4.addr 192.168.88.40/24 gw4 192.168.88.1 autoconnect true [rootlocalhos…

TensorFlow深度學習實戰(21)——Transformer架構詳解與實現

TensorFlow深度學習實戰&#xff08;21&#xff09;——Transformer架構詳解與實現 0. 前言1. Transformer 架構1.1 關鍵思想1.2 計算注意力1.3 編碼器-解碼器架構1.4 Transformer 架構1.5 模型訓練 2. Transformer 類別2.1 解碼器(自回歸)模型2.2 編碼器(自編碼)模型2.3 Seq2s…

20250608-在 Windows 上使用 PyCharm 通過 SSH 連接到遠程 Ubuntu 機器的 Anaconda 環境

在 Windows 上使用 PyCharm 通過 SSH 連接到遠程 Ubuntu 機器的 Anaconda 環境 1. 確保遠程機器上的 SSH 服務已啟動 在遠程 Ubuntu 機器上&#xff0c;確保 SSH 服務已安裝并啟動&#xff1a; sudo apt-get install openssh-server sudo systemctl start ssh sudo systemct…

Oracle 條件索引 case when 報錯解決方案(APP)

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文檔用途 本內容介紹 Oracle條件索引 case when 如何在HGDB中轉換使用。 詳細信息 1、oracle 索引 create unique index I_GL_VOUCHER_7 on gl_vo…

鴻蒙期末總結

一、概念 HarmonyOS應用關鍵概念&#xff1a;元服務和App的關系 App具有手動下載安裝、包大小無限制、應用內或應用市場更新、全量功能等特征&#xff0c;可使用全量API 元服務具有免安裝、包大小有限制、即用即走、輕量化等特征&#xff0c;只能使用“元服務API集” 鴻蒙的…

Vue3 + TypeScript + Element Plus 表格行按鈕不觸發 row-click 事件、不觸發勾選行,只執行按鈕的 click 事件

點擊表格行按鈕不觸發 row-click 事件、不觸發勾選行&#xff0c;只執行按鈕的 click 事件 點擊第一行的【編輯】&#xff0c;第一行為當前選擇行&#xff0c; 同時也勾選了復選框&#xff0c;也會執行 row-click 事件 原來的代碼&#xff1a; <el-table-column label"…

SiteAzure4.x 版本 訪問html靜態頁文件出現404錯誤

問題描述&#xff1a; SiteAzure4.*版本&#xff0c;在upload文件夾中放置了html靜態頁文件&#xff0c;訪問出現404錯誤 問題分析&#xff1a; 1、確認訪問路徑是否正確以及文件是否存在 2、確認相應文件夾權限是否正確 3、確認IIS默認文檔是否允許靜態頁&#xff0c;MIM…

[免費]微信小程序音樂播放器(爬取網易云音樂數據)(node.js后端)【論文+源碼】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序音樂播放器(爬取網易云音樂數據)(node.js后端)&#xff0c;分享下哈。 項目視頻演示 【免費】微信小程序音樂播放器(爬取網易云音樂數據)(node.js后端) 微信小程序畢業設計_嗶哩嗶哩_bilibili …