成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

阿里面試官:接口的冪等性怎么設計?

系統
自己最近負責的幾個接口,都涉及到了冪等性的操作,抽空總結了一下,這也是面試官比較愛問的問題。

 [[377084]]

大家好,我是狂聊。

自己最近負責的幾個接口,都涉及到了冪等性的操作,抽空總結了一下,這也是面試官比較愛問的問題。

一、什么是冪等?

看一下維基百科怎么說的:


冪等性:多次調用方法或者接口不會改變業務狀態,可以保證重復調用的結果和單次調用的結果一致。

二、使用冪等的場景

1、前端重復提交

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

2、接口超時重試

對于給第三方調用的接口,有可能會因為網絡原因而調用失敗,這時,一般在設計的時候會對接口調用加上失敗重試的機制。如果第一次調用已經執行了一半時,發生了網絡異常。這時再次調用時就會因為臟數據的存在而出現調用異常。

3、消息重復消費

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

當消息被其他消費者重新消費時,如果沒有冪等性,就會導致消息重復消費時結果異常,如數據庫重復數據,數據庫數據沖突,資源重復等。

三、解決方案

1、token 機制實現

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

示意圖如下:


具體流程步驟:

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

注意:

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

2、基于 MySQL 實現

這種實現方式是利用 mysql 唯一索引的特性。

示意圖如下:


具體流程步驟:

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

3、基于 Redis 實現

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

SETNX key value:將 key 的值設為 value ,當且僅當 key 不存在。若給定的 key 已經存在,則 SETNX 不做任何動作。

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

示意圖如下:


具體流程步驟:

  • 客戶端先請求服務端,會拿到一個能代表這次請求業務的唯一字段
  • 將該字段以 SETNX 的方式存入 redis 中,并根據業務設置相應的超時時間
  • 如果設置成功,證明這是第一次請求,則執行后續的業務邏輯
  • 如果設置失敗,則代表已經執行過當前請求,直接返回

總結

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

總之,當你去設計一個接口的時候,冪等都是首要考慮的問題,特別是當你負責設計轉賬、支付這種涉及到 money 的接口,你要格外注意嘍!

責任編輯:姜華 來源: 狂聊Java
相關推薦

2023-09-01 15:27:31

2023-11-27 08:32:02

元素HashMap

2021-09-27 07:11:18

MySQLACID特性

2021-11-05 10:07:13

Redis哈希表存儲

2019-11-21 08:40:44

面試官優化性能

2021-01-18 14:34:59

冪等性接口客戶端

2022-11-06 18:17:43

Java核心系統鏈路

2024-03-13 15:18:00

接口冪等性高并發

2021-01-13 11:23:59

分布式冪等性支付

2020-02-25 16:56:02

面試官有話想說

2025-02-26 08:20:18

2020-07-15 08:14:12

高并發

2022-11-25 17:29:27

分布式事務

2023-11-06 17:39:35

JavaArrayList線程

2023-11-29 08:00:53

JavaTreeMap底層

2021-09-08 08:06:57

Redis原子性數據類型

2022-03-22 07:57:42

Java多線程并發

2025-03-17 08:07:11

2021-07-04 15:16:14

索引B+數據庫

2025-02-23 08:00:00

冪等性Java開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天艹天天干天天 | 精品国产乱码一区二区三区 | 欧美中文字幕在线观看 | 色吊丝在线 | 久草免费在线 | 久久久免费电影 | 成人福利网站 | 在线国产精品一区 | 激情五月婷婷丁香 | 精品国产亚洲一区二区三区大结局 | 欧美精品一区三区 | 国产欧美精品一区二区色综合 | 日韩精品一区中文字幕 | 国产一级片免费看 | 毛片一区二区三区 | 国产亚洲一区二区三区在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 99久久中文字幕三级久久日本 | 中文字幕第一页在线 | 99色在线视频 | 91av亚洲| 亚洲精品久久嫩草网站秘色 | 亚洲精品视频网站在线观看 | 一级黄色片在线免费观看 | 91精品国产欧美一区二区 | 91文字幕巨乱亚洲香蕉 | 欧美日韩在线免费 | 午夜影院在线观看视频 | 欧美亚洲国产一区二区三区 | 国产激情视频网 | 亚洲a视| 一区二区三区中文 | 天天搞天天搞 | 综合中文字幕 | 自拍偷拍3p | 国产一区二区三区在线 | 久草青青 | 日韩中文字幕在线 | 国产成人精品免费视频 | www成人啪啪18| 国产精品777一区二区 |