如何保證接口冪等性

如何保證接口冪等性

1、冪等性是什么?

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

2、使用冪等性的場景有哪些?
  1. 頁面點擊保存按鈕時,不小心快速點了兩次,表中竟然產生了兩條重復的數據,只是id不一樣。
  2. 我們在項目中為了解決接口超時問題,通常會引入了重試機制。第一次請求接口超時了,請求方沒能及時獲取返回結果(此時有可能已經成功了),為了避免返回錯誤的結果(這種情況不可能直接返回失敗吧?),于是會對該請求重試幾次,這樣也會產生重復的數據。
  3. 消息重復消費,在使用消息中間件來處理消息隊列,且手動 ack 確認消息被正常消費時。如果消費者突然斷開連接,那么已經執行了一半的消息會重新放回隊列。當消息被其他消費者重新消費時,如果沒有冪等性,就會導致消息重復消費時結果異常,如數據庫重復數據,數據庫數據沖突,資源重復等。
3、如何保證接口冪等性?
  • 悲觀鎖
  • 樂觀鎖(版本號)
  • 唯一索引
  • 分布式鎖
  • 去重表
  • token機制
4、詳解具體實現
4.1、insert前先select(無法處理高并發)

? 通常情況下,在保存數據的接口中,我們為了防止產生重復數據,一般會在insert前,先根據namecode字段select一下數據。如果該數據已存在,則執行update操作,如果不存在,才執行 insert操作。

圖片

該方案可能是我們平時在防止產生重復數據時,使用最多的方案。但是該方案不適用于并發場景,在并發場景中,要配合其他方案一起使用,否則同樣會產生重復數據。

4.2、insert前先select并配合版本號,支持高并發(樂觀鎖)
  1. 先根據id查詢用戶信息,包含version字段

  2. 根據id和version字段值作為where條件的參數,更新用戶信息,同時version+1

  3. 判斷操作影響行數,如果影響1行,則說明是一次請求,可以做其他數據操作。

  4. 如果影響0行,說明是重復請求,則直接返回成功。

4.3、token機制

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

示意圖如下:

圖片

具體流程步驟:

  1. 客戶端會先發送一個請求去獲取 token,服務端會生成一個全局唯一的 ID 作為 token 保存在 redis 中,同時把這個 ID 返回給客戶端。

  2. 客戶端第二次調用業務請求的時候必須攜帶這個 token。

  3. 服務端會校驗這個 token,如果校驗成功,則執行業務,并刪除 redis 中的 token。

  4. 如果校驗失敗,說明 redis 中已經沒有對應的 token,則表示重復操作,直接返回指定的結果給客戶端

4.5、去重表

這種實現方式是利用 mysql 唯一索引的特性。示意圖如下:

圖片

具體流程步驟:

  1. 建立一張去重表,其中某個字段需要建立唯一索引

  2. 客戶端去請求服務端,服務端會將這次請求的一些信息插入這張去重表中

  3. 因為表中某個字段帶有唯一索引,如果插入成功,證明表中沒有這次請求的信息,則執行后續的業務邏輯

  4. 如果插入失敗,則代表已經執行過當前請求,直接返回。

4.6、分布式鎖

這種實現方式是基于 SETNX 命令實現的。

SETNX key value:將 key 的值設為 value ,當且僅當 key 不存在。若給定的 key 已經存在,則 SETNX 不做任何動作。該命令在設置成功時返回 1,設置失敗時返回 0。示意圖如下:

圖片

具體流程步驟:

  1. 客戶端先請求服務端,會拿到一個能代表這次請求業務的唯一字段

  2. 將該字段以 SETNX 的方式存入 redis 中,并根據業務設置相應的超時時間

  3. 如果設置成功,證明這是第一次請求,則執行后續的業務邏輯

  4. 如果設置失敗,則代表已經執行過當前請求,直接返回

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

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

相關文章

Python面試題-6

1. 請解釋Python中的動態類型。 Python中的動態類型 Python是一種動態類型語言,這意味著你不需要在編程時聲明變量的類型,而是在運行時自動推斷類型。在Python中,變量的類型是在程序運行時決定的,這意味著同一個變量可以在不改變…

上萬組風電,光伏,用戶負荷數據分享

上萬組風電,光伏,用戶負荷數據分享 可用于風光負荷預測等研究 獲取鏈接🔗 https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取碼:381i 獲取鏈接🔗 https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

一行代碼用git新建分支

1.在本地創建分支 dev git branch dev2.切換分支 git checkout devwebstorm操作如下: 3.推送新分支到遠程 git push --set-upstream origin 分支名webstorm操作如下:提交代碼的時候會自動推送到遠程 4.到git上面可以看看剛剛推送的內容 dev多推送…

Proxmox VE 8虛擬機直通USB磁盤

作者:田逸(fromyz) 今天有個兄弟發消息,咨詢怎么讓插在服務器上的U盾被Proxmox VE上的虛擬機識別。在很久很久以前,我嘗試過在Proxmox VE 5以前的版本創建windows虛擬機,并把插在Proxmox VE宿主機上的銀行U…

基于STM32設計的智能喂養系統(ESP8266+微信小程序)175

基于STM32設計的牛羊喂養系統(微信小程序)(175) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】項目硬件模塊組成【3】ESP8266工作模式配置【4】上位機開發【5】項目模塊劃分1.2 項目功能需求1.3 項目開發背景1.4 開發工具的選擇1.5 系統框架圖1.6 系統原理圖1.7 硬件實…

Android ViewPostImeInputStage輸入事件處理

InputDispatcher向InputChannel使用socket寫入輸入事件,觸發InputEventReceiver調用來接收輸入事件。 ViewPostImeInputStage處理view控件的事件 frameworks/base/core/java/android/view/InputEventReceiver.java dispatchInputEvent frameworks/base/core/jav…

SwinTransformer的相對位置索引的原理以及源碼分析

文章目錄 1. 理論分析2. 完整代碼 引用:參考博客鏈接 1. 理論分析 根據論文中提供的公式可知是在 Q Q Q和 K K K進行匹配并除以 d \sqrt d d ? 后加上了相對位置偏執 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

絕了,華為伸縮攝像頭如何突破影像邊界?

自華為Pura70 Ultra超聚光伸縮鏡頭誕生以來,備受大家的關注,聽說這顆鏡頭打破了傳統手機的攝像頭體積與鏡頭的設計,為我們帶來了不一樣的拍照體驗。 智能手機飛速發展的今天,影像功能已經成為我們衡量一款手機性能的重要指標。想…

MySQL中mycat與mha應用

目錄 一.Mycat代理服務器 1.Mycat應用場景 2.mycat安裝目錄結構說明 3.Mycat的常用配置文件 4.Mycat日志 5.mycat 實現讀寫分離 二.MySQL高可用 1.原理過程 2.MHA軟件 3.實現MHA 一.Mycat代理服務器 1.Mycat應用場景 Mycat適用的場景很豐富,以下是幾個典型…

進程輸入輸出及終端屬性學習

進程的標準輸入輸出 當主進程fork或exec子進程,文件描述符被繼承,因此0,1,2句柄也被繼承,從而使得telnet等服務,可以做到間接調用別的shell或程序。比如如果是遠程登錄使用的zsh,那么其會重定向到相應的pts $ ps|gre…

滬上繁花:上海電信的5G-A之躍

2024年6月18日下午,在上海舉行的3GPP RAN第104次會議上,3GPP正式宣布R18標準凍結。R18是無線網絡面向5G-A的第一個版本,其成功凍結正式宣布了5G發展迎來新機遇,5G-A商用已進入全新的發展階段。 在5G-A滾滾而來的時代洪流中&#x…

C#實戰|賬號管理系統:通用登錄窗體的實現。

哈嘍,你好啊,我是雷工! 本節記錄登錄窗體的實現方法,比較有通用性,所有的項目登錄窗體實現基本都是這個實現思路。 一通百通,以下為學習筆記。 01 登錄窗體的邏輯 用戶在登錄窗輸入賬號和密碼,如果輸入賬號和密碼信息正確,點擊【登錄】按鈕,則跳轉顯示主窗體,同時在固…

Vue3項目初始化:

緊接著前面的文章:https://blog.csdn.net/weixin_51416826/article/details/138679863?spm1001.2014.3001.5502 當我們生成一個Vue3項目后必須要增加一些依賴和配置,比如安裝組件庫、配置ESLint和Prettier、接下來咱一步步推進~ 安裝組件庫 一般開發…

【基礎篇】1.7 C語言基礎(一)

一,為什么是C語言? C語言是嵌入式系統開發領域廣泛使用的編程語言。STM32作為一種嵌入式系統的微控制器,需要精確控制硬件資源,那么C語言能夠滿足這一需求。 二,STM32 C語言常用基礎知識 下面是我們在日常STM32開發中必備的C語言基礎要點,掌握這些C語言的基礎知識要點…

llama3

Llama 3是由Meta公司發布的一款大型語言模型(LLM),該模型在發布后迅速引起了業界的廣泛關注。以下是對Llama 3的詳細介紹: 一、基本信息 發布單位:Meta公司 發布時間:當地時間2024年4月18日 主要特點&…

上海外貿建站公司wordpress模板推薦

Sora索啦高端制造業wordpress主題 紅色高端制造業wordpress主題,適合外貿企業出海建獨立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Yamal外貿獨立站wordpress主題 綠色的亞馬爾Yamal外貿獨立站wordpress模板,適用于外貿公司建獨立站…

Redis 中 Set 和 Zset 類型

目錄 1.Set類型 1.1 Set集合 1.2 普通命令 1.3 集合操作 1.4 內部編碼 1.5 使用場景 2.Zset類型 2.1 Zset有序集合 2.2 普通命令 2.3 集合間操作 2.4 內部編碼 2.5 使用場景 1.Set類型 1.1 Set集合 集合類型也是保存多個字符串類型的元素,但是和列表類型不同的是&…

【Go】excelize庫實現excel導入導出封裝(四),導出時自定義某一列或多列的單元格樣式

大家好,這里是符華~ 查看前三篇: 【Go】excelize庫實現excel導入導出封裝(一),自定義導出樣式、隔行背景色、自適應行高、動態導出指定列、動態更改表頭 【Go】excelize庫實現excel導入導出封裝(二&…

WY-35A4T三相電壓繼電器 導軌安裝 約瑟JOSEF

功能簡述 WY系列電壓繼電器是帶延時功能的數字式交流電壓繼電器。 可用于發電機,變壓器和輸電線的繼電保護裝置中,作為過電壓或欠電壓閉鎖的動作元件 LCD實時顯示當前輸入電壓值 額定輸入電壓Un:100VAC、200VAC、400VAC產品滿足電磁兼容四級標準 產品…

【Rust入門】猜數游戲

文章目錄 前言Rust的變量Rust占位符讀取一行數據到變量里面示例代碼總結 前言 Rust是一種系統編程語言,它專注于速度、內存安全和并行性。學習Rust可以為你的編程技能庫增添新的一筆。在這篇文章中,我們將通過一個簡單的猜數游戲來介紹Rust的基本概念。…