日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

我們一起聊聊如何保證接口冪等性?高并發(fā)下的接口冪等性如何實(shí)現(xiàn)?

來源: 責(zé)編: 時(shí)間:2024-03-18 09:42:47 286觀看
導(dǎo)讀什么是接口冪等性接口冪等性這一概念源于數(shù)學(xué),原意是指一個(gè)操作如果連續(xù)執(zhí)行多次所產(chǎn)生的結(jié)果與僅執(zhí)行一次的效果相同,那么我們就稱這個(gè)操作是冪等的。在互聯(lián)網(wǎng)領(lǐng)域,特別是在Web服務(wù)、API設(shè)計(jì)和分布式系統(tǒng)中,接口冪等性具

什么是接口冪等性

接口冪等性這一概念源于數(shù)學(xué),原意是指一個(gè)操作如果連續(xù)執(zhí)行多次所產(chǎn)生的結(jié)果與僅執(zhí)行一次的效果相同,那么我們就稱這個(gè)操作是冪等的。在互聯(lián)網(wǎng)領(lǐng)域,特別是在Web服務(wù)、API設(shè)計(jì)和分布式系統(tǒng)中,接口冪等性具有非常重要的意義。FFZ28資訊網(wǎng)——每日最新資訊28at.com

具體到HTTP接口或者服務(wù)間的API調(diào)用,接口冪等性就可以理解為當(dāng)客戶端對(duì)同一接口發(fā)起多次相同的請(qǐng)求時(shí),服務(wù)端系統(tǒng)也應(yīng)該確保只執(zhí)行一次相應(yīng)的操作,并且不論接收到了多少次請(qǐng)求,系統(tǒng)的狀態(tài)變更始終是一致的,不會(huì)因?yàn)橹貜?fù)的請(qǐng)求而導(dǎo)致數(shù)據(jù)的錯(cuò)誤。FFZ28資訊網(wǎng)——每日最新資訊28at.com

比如我們常常遇到的訂單創(chuàng)建,支付等業(yè)務(wù)。FFZ28資訊網(wǎng)——每日最新資訊28at.com

  • 如果一個(gè)“創(chuàng)建訂單”接口實(shí)現(xiàn)了冪等性,當(dāng)收到兩次同樣的創(chuàng)建請(qǐng)求時(shí),系統(tǒng)應(yīng)該要么拒絕第二個(gè)請(qǐng)求(因?yàn)樗呀?jīng)是重復(fù)請(qǐng)求),要么確保只有一個(gè)訂單被創(chuàng)建,而不是兩個(gè)完全一樣的訂單。
  • 對(duì)于一個(gè)“支付”接口,冪等性要求即便用戶由于網(wǎng)絡(luò)原因反復(fù)點(diǎn)擊支付按鈕,服務(wù)端也只會(huì)扣除用戶賬戶一次金額,避免重復(fù)扣費(fèi)。

導(dǎo)致接口冪等性問題的原因

要向杜絕冪等性,那么我們就要之道導(dǎo)致接口冪等性問題的原因有哪些。接口冪等性問題通常由以下多種原因引起:FFZ28資訊網(wǎng)——每日最新資訊28at.com

  1. 網(wǎng)絡(luò)波動(dòng)不穩(wěn)定:網(wǎng)絡(luò)通信中的丟包、延遲等情況可能導(dǎo)致客戶端未收到服務(wù)端的響應(yīng)或服務(wù)端未收到客戶端的請(qǐng)求,此時(shí)客戶端可能會(huì)重試發(fā)送請(qǐng)求,導(dǎo)致接口被重復(fù)調(diào)用。
  2. 用戶操作:用戶快速重復(fù)點(diǎn)擊導(dǎo)致,例如用戶在等待響應(yīng)時(shí),由于不確定是否操作成功,可能會(huì)多次點(diǎn)擊提交按鈕,進(jìn)而發(fā)送多次相同的請(qǐng)求。再比如頁用戶頻繁刷新頁面,尤其是在某些提交操作尚未完成時(shí),刷新頁面可能會(huì)重新發(fā)送請(qǐng)求。還有用戶可能在瀏覽器上點(diǎn)擊回退然后再重復(fù)之間的提交操作,這都可能會(huì)導(dǎo)致重新發(fā)送請(qǐng)求。
  3. 重試機(jī)制:在高可用性設(shè)計(jì)中,客戶端常常設(shè)置有重試機(jī)制,當(dāng)請(qǐng)求失敗或超時(shí)時(shí)會(huì)自動(dòng)重新發(fā)起請(qǐng)求。而在分布式系統(tǒng)中,服務(wù)間調(diào)用也可能有重試策略,以應(yīng)對(duì)臨時(shí)故障。比如Nginx重試,RPC重試,或者調(diào)用方業(yè)務(wù)層中進(jìn)行重試。
  4. 定時(shí)任務(wù)或異步處理:在定時(shí)任務(wù)中如果定時(shí)任務(wù)調(diào)度或邏輯設(shè)計(jì)不當(dāng),可能會(huì)導(dǎo)致同一任務(wù)被執(zhí)行多次。或者在消息隊(duì)列中,消息可能會(huì)因?yàn)楫惓5仍虮恢貜?fù)消費(fèi)。
  5. 并發(fā)控制:缺乏有效的并發(fā)控制手段,導(dǎo)致在并發(fā)環(huán)境下,針對(duì)同一資源的操作被多次執(zhí)行。

總的來說,導(dǎo)致接口冪等性問題可以粗略的歸類于兩種情況:前端調(diào)用以及服務(wù)端調(diào)用,那么我們可以針對(duì)這兩種情況看一下如何去保證接口冪等。FFZ28資訊網(wǎng)——每日最新資訊28at.com

如何保證接口冪等?

前端調(diào)用

頁面控制

頁面調(diào)用接口時(shí)可以通過禁用(如按鈕置灰或顯示加載狀態(tài))防止用戶在請(qǐng)求未完成前重復(fù)點(diǎn)擊,從而減少不必要的重復(fù)請(qǐng)求和可能的數(shù)據(jù)沖突。雖然在前端進(jìn)行按鈕置灰等操作可以輔助提高系統(tǒng)的冪等性表現(xiàn),但是這個(gè)方式只是從用戶體驗(yàn)和用戶行為控制的角度來避免重復(fù)提交的一種方法,并沒有從系統(tǒng)設(shè)計(jì)層面完全解決接口本身的冪等性問題。FFZ28資訊網(wǎng)——每日最新資訊28at.com

使用RPG模式

PRG(POST/Redirect/GET)模式是一種前端交互策略,旨在解決用戶刷新頁面時(shí)可能導(dǎo)致表單數(shù)據(jù)重復(fù)提交的問題。它巧妙地利用了HTTP協(xié)議的特性,具體的交互流程如下:FFZ28資訊網(wǎng)——每日最新資訊28at.com

  1. 用戶在網(wǎng)頁表單中填寫數(shù)據(jù),并通過POST請(qǐng)求將其發(fā)送至服務(wù)器進(jìn)行處理,例如創(chuàng)建新資源或更新現(xiàn)有數(shù)據(jù)。
  2. 服務(wù)器接收到POST請(qǐng)求后,對(duì)提交的數(shù)據(jù)進(jìn)行有效處理和持久化存儲(chǔ),并在操作成功后不直接返回處理結(jié)果,而是通過HTTP響應(yīng)碼302或303實(shí)現(xiàn)重定向,指示客戶端發(fā)起一個(gè)新的GET請(qǐng)求去訪問一個(gè)特定的URL。
  3. 客戶端遵照服務(wù)器的重定向指示,自動(dòng)發(fā)送GET請(qǐng)求訪問新的URL,此時(shí)返回的頁面將展示之前POST操作處理完畢的結(jié)果。
  4. 當(dāng)用戶在此后刷新頁面時(shí),瀏覽器只會(huì)按照常規(guī)方式重新發(fā)起GET請(qǐng)求,而非重新提交POST數(shù)據(jù),因此有效地避免了重復(fù)提交引發(fā)的潛在問題。
Token機(jī)制

Token機(jī)制是一種廣泛應(yīng)用互聯(lián)網(wǎng)領(lǐng)域的認(rèn)證與授權(quán)方法,特別是Web服務(wù)系統(tǒng)。token可以理解為一種安全憑證,它是由服務(wù)端生成并頒發(fā)給客戶端的一段經(jīng)過加密處理的字符串或數(shù)據(jù)結(jié)構(gòu),用來代表用戶的某種狀態(tài)或權(quán)限。FFZ28資訊網(wǎng)——每日最新資訊28at.com

通過Token機(jī)制,我們可以解決接口冪等性問題。在接口中,我們允許重復(fù)提交,但是要保證重復(fù)提交不產(chǎn)生副作用,比如點(diǎn)擊n次只產(chǎn)生一條記錄,客戶端每次請(qǐng)求都需要攜帶一個(gè)唯一的Token,而服務(wù)器則驗(yàn)證這個(gè)Token的有效性。如果服務(wù)器收到了一個(gè)已經(jīng)使用過的Token就會(huì)認(rèn)為這是一個(gè)重復(fù)請(qǐng)求并拒絕處理,從而確保接口的冪等性具體流握如下Token機(jī)制是一種常用的方法,用于確保接口的冪等性和防止重復(fù)請(qǐng)求。具體流程如下:FFZ28資訊網(wǎng)——每日最新資訊28at.com

  1. 生成Token當(dāng)用戶開始執(zhí)行一個(gè)需要確保冪等性的操作(如支付、下單、更新用戶信息等)時(shí),服務(wù)端會(huì)生成一個(gè)唯一的、有時(shí)效性的token。這個(gè)token可以是一個(gè)隨機(jī)字符串或者帶有時(shí)間戳和其他相關(guān)信息的哈希值,確保其唯一性。
  2. 存儲(chǔ)Token生成的token會(huì)被存儲(chǔ)在服務(wù)端的一個(gè)臨時(shí)存儲(chǔ)介質(zhì)中,如Redis、Memcached或數(shù)據(jù)庫,同時(shí)設(shè)置一個(gè)合理的過期時(shí)間(例如15分鐘)。
  3. 傳遞Token將生成的token返回給客戶端,客戶端在進(jìn)行后續(xù)的API調(diào)用時(shí),需將此token作為請(qǐng)求參數(shù)或放在請(qǐng)求頭中一并發(fā)送給服務(wù)端。
  4. 驗(yàn)證Token服務(wù)端在接收到帶有token的請(qǐng)求時(shí),首先檢查token是否存在并且有效(未過期且未被使用過)。如果token有效且未被使用,則執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,并在執(zhí)行完成后立即從存儲(chǔ)介質(zhì)中移除或標(biāo)記為已使用。若token已失效或已被使用,則拒絕此次請(qǐng)求,返回相應(yīng)的錯(cuò)誤提示,確保同一個(gè)操作不會(huì)被執(zhí)行兩次。
  5. 限制并發(fā)在并發(fā)場景下,通過原子操作(如Redis的SETNX命令)確保在驗(yàn)證token有效的同時(shí),將其刪除或更新狀態(tài),避免多個(gè)請(qǐng)求同時(shí)通過驗(yàn)證。

圖片圖片FFZ28資訊網(wǎng)——每日最新資訊28at.com

服務(wù)端控制

在服務(wù)端接口處理邏輯時(shí),可以通過通過一些特定的標(biāo)識(shí)符或請(qǐng)求參數(shù)來校驗(yàn)請(qǐng)求的冪等性,以確保同樣的請(qǐng)求不會(huì)被重復(fù)處理。FFZ28資訊網(wǎng)——每日最新資訊28at.com

唯一標(biāo)識(shí)符

客戶端每次發(fā)起請(qǐng)求會(huì)攜帶一個(gè)全局唯一的標(biāo)識(shí)符。服務(wù)器接收到請(qǐng)求后就會(huì)對(duì)這個(gè)標(biāo)識(shí)符進(jìn)行檢查,若服務(wù)器發(fā)現(xiàn)該標(biāo)識(shí)符已經(jīng)在系統(tǒng)中存在,表明這是一個(gè)重復(fù)請(qǐng)求,此時(shí)服務(wù)器可以選擇忽略該請(qǐng)求,或者向客戶端返回已處理過相同請(qǐng)求的結(jié)果信息。若服務(wù)器未找到該標(biāo)識(shí)符存在于系統(tǒng)內(nèi),則認(rèn)定該請(qǐng)求為新請(qǐng)求,服務(wù)器將繼續(xù)對(duì)其進(jìn)行正常處理,并將此唯一標(biāo)識(shí)符保存至系統(tǒng)中,以便于后續(xù)對(duì)接收的請(qǐng)求進(jìn)行有效性校驗(yàn),防止同一請(qǐng)求的重復(fù)處理。比如我們在要求上游ERP系統(tǒng)對(duì)接訂單平臺(tái)時(shí)就會(huì)要求上游傳遞一個(gè)賬號(hào)下全局唯一的一個(gè)參考單號(hào),這個(gè)參考單號(hào)一個(gè)很重要的作用就是保證接口冪等性。FFZ28資訊網(wǎng)——每日最新資訊28at.com

請(qǐng)求參數(shù)

某些請(qǐng)求參數(shù)確實(shí)可以用來輔助校驗(yàn)請(qǐng)求的冪等性。例如,時(shí)間戳可以作為一種可能的請(qǐng)求參數(shù),在處理請(qǐng)求時(shí),服務(wù)器可以通過比較時(shí)間戳與服務(wù)器當(dāng)前時(shí)間來判斷請(qǐng)求的有效性。若時(shí)間戳與當(dāng)前時(shí)間之間的差異超出預(yù)設(shè)的合理范圍(如幾秒鐘到幾分鐘不等,具體閾值視業(yè)務(wù)場景而定),服務(wù)器可以推測該請(qǐng)求可能是由于網(wǎng)絡(luò)延遲或者其他原因?qū)е碌闹貜?fù)提交。FFZ28資訊網(wǎng)——每日最新資訊28at.com

單純依靠時(shí)間戳來判斷冪等性和重復(fù)請(qǐng)求并不完全準(zhǔn)確,因?yàn)椴煌目蛻舳藭r(shí)間可能并不精確同步,而且時(shí)間戳本身無法保證全局唯一性。但是它可以作為一種有效的輔助手段來減少重復(fù)處理的可能性。FFZ28資訊網(wǎng)——每日最新資訊28at.com

狀態(tài)機(jī)設(shè)計(jì)

對(duì)于狀態(tài)轉(zhuǎn)移類的操作類型的業(yè)務(wù),可采用狀態(tài)機(jī)設(shè)計(jì),每次請(qǐng)求只允許合法的狀態(tài)變遷,非法狀態(tài)變遷(如已經(jīng)完成的訂單不允許再次支付)將被拒絕。FFZ28資訊網(wǎng)——每日最新資訊28at.com

樂觀鎖

在更新數(shù)據(jù)時(shí),可以通過版本號(hào)或時(shí)間戳等機(jī)制判斷數(shù)據(jù)是否已被修改,防止因并發(fā)請(qǐng)求導(dǎo)致的多次更新問題。具體做法:FFZ28資訊網(wǎng)——每日最新資訊28at.com

  1. 在數(shù)據(jù)庫表中增加一個(gè)版本號(hào)字段(version)或者時(shí)間戳字段(timestamp)。
  2. 客戶端第一次請(qǐng)求時(shí)獲取數(shù)據(jù)的版本號(hào)或時(shí)間戳。
  3. 客戶端發(fā)起更新操作時(shí),將上次讀取的版本號(hào)或時(shí)間戳一起發(fā)送回服務(wù)器。
  4. 服務(wù)器在執(zhí)行更新操作前,首先檢查當(dāng)前數(shù)據(jù)庫中的版本號(hào)或時(shí)間戳是否與客戶端提交的一致。

如果一致,說明在這期間數(shù)據(jù)沒有被其他事務(wù)修改過,于是更新數(shù)據(jù)并遞增版本號(hào)或更新時(shí)間戳。FFZ28資訊網(wǎng)——每日最新資訊28at.com

如果不一致,說明數(shù)據(jù)已經(jīng)被修改過,此時(shí)服務(wù)器拒絕本次更新請(qǐng)求,返回錯(cuò)誤提示,客戶端可以根據(jù)錯(cuò)誤信息決定是否重新獲取最新數(shù)據(jù)再嘗試更新。FFZ28資訊網(wǎng)——每日最新資訊28at.com

通過這種方式,即使客戶端因?yàn)榫W(wǎng)絡(luò)原因或其他因素導(dǎo)致同一請(qǐng)求被多次發(fā)送,樂觀鎖機(jī)制能確保只有在數(shù)據(jù)未被其他事務(wù)修改的前提下,才會(huì)執(zhí)行更新操作,從而達(dá)到接口冪等的效果。FFZ28資訊網(wǎng)——每日最新資訊28at.com

實(shí)現(xiàn)冪等性方案示例

從上述的幾種解決冪等性問題的方案來看,使用token機(jī)制可以保證在不同請(qǐng)求動(dòng)作下的冪等性。所以我們以此作為方案作為示例方案。FFZ28資訊網(wǎng)——每日最新資訊28at.com

準(zhǔn)備工作

我們使用Redis保存Token令牌,引入SpringBoot,Redis,ULID相關(guān)的依賴。FFZ28資訊網(wǎng)——每日最新資訊28at.com

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId>    <version>2.7.0</version></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>    <version>2.7.0</version></dependency><dependency>    <groupId>com.github.f4b6a3</groupId>    <artifactId>ulid-creator</artifactId>    <version>5.2.0</version></dependency>

Redis相關(guān)的配置:FFZ28資訊網(wǎng)——每日最新資訊28at.com

spring.redis.database=0  spring.redis.host=127.0.0.1  spring.redis.port=6379  spring.redis.password=  spring.redis.pool.max-active=8  spring.redis.pool.max-wait=-1  spring.redis.pool.max-idle=8  spring.redis.pool.min-idle=0  spring.redis.timeout=60  server.port=8080  server.servlet.context-path=/coderacademy

生成Token令牌

使用ULID生成隨機(jī)字符串,然后將其保存在Redis當(dāng)中。這里以idempotent_token+賬戶+請(qǐng)求操作類型+token作為key。FFZ28資訊網(wǎng)——每日最新資訊28at.com

private StringRedisTemplate stringRedisTemplate;/** * 存入 Redis 的 Token 鍵的前綴 */private static final String IDEMPOTENT_TOKEN_PREFIX = "idempotent_token:%s:$s:%s";/** * 生成token令牌 * * @param accountSecret 賬戶令牌 * @param operatorType 接口請(qǐng)求類型,可以是接口url或者其他可以區(qū)分接口服務(wù)類型的值 * @return token令牌 */@Overridepublic String generateToken(String accountSecret, String operatorType) {    // 創(chuàng)建或獲取ULID生成器實(shí)例    long timestampInMillis = LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli();    Ulid ulid = UlidCreator.getUlid(timestampInMillis);    String token = ulid.toString();    // 設(shè)置存入 Redis 的 Key    String key = String.format(IDEMPOTENT_TOKEN_PREFIX, accountSecret, operatorType, token);    // 存儲(chǔ) Token 到 Redis,且設(shè)置過期時(shí)間為5分鐘    stringRedisTemplate.opsForValue().set(key, accountSecret, 5, TimeUnit.MINUTES);    // 返回 Token    return token;}

校驗(yàn)Token令牌

這里我們使用Redis執(zhí)行Lua命令去查找以及刪除key,Lua 表達(dá)式能保證命令執(zhí)行的原子性。FFZ28資訊網(wǎng)——每日最新資訊28at.com

/**     * 驗(yàn)證 Token 正確性     *     * @param token token 字符串     * @param operatorType 接口請(qǐng)求類型,可以是接口url或者其他可以區(qū)分接口服務(wù)類型的值     * @return 驗(yàn)證結(jié)果     */private boolean validToken(String token, String accountSecret, String operatorType) {    // 設(shè)置 Lua 腳本,其中 KEYS[1] 是 key,KEYS[2] 是 value    String script = "if redis.call('get', KEYS[1]) == KEYS[2] then return redis.call('del', KEYS[1]) else return 0 end";    RedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);    // 根據(jù) Key 前綴拼接 Key    String key = String.format(IDEMPOTENT_TOKEN_PREFIX, accountSecret, operatorType, token);    // 執(zhí)行 Lua 腳本    Long result = stringRedisTemplate.execute(redisScript, Arrays.asList(key, operatorType));    // 根據(jù)返回結(jié)果判斷是否成功成功匹配并刪除 Redis 鍵值對(duì),若果結(jié)果不為空和0,則驗(yàn)證通過    if (result != null && result != 0L) {        System.out.println(String.format("驗(yàn)證 token=%s,key=%s,value=%s 成功", token, key, operatorType));        return true;    }    System.err.println(String.format("驗(yàn)證 token=%s,key=%s,value=%s 失敗", token, key, operatorType));    return false;}

業(yè)務(wù)代碼以及接口

我們在實(shí)現(xiàn)模擬創(chuàng)建訂單的服務(wù),在創(chuàng)建訂單之前,首先校驗(yàn)token令牌。FFZ28資訊網(wǎng)——每日最新資訊28at.com

/** * 創(chuàng)建訂單接口 * * @param requestVO     創(chuàng)建訂單參數(shù) * @param accountSecret 賬戶令牌 * @param token         token令牌 * @return 生成的訂單號(hào) */@Overridepublic String createOrder(OrderCreateRequestVO requestVO, String accountSecret, String token) {    // 根據(jù) Token 和與用戶相關(guān)的信息到 Redis 驗(yàn)證是否存在對(duì)應(yīng)的信息    boolean result = validToken(token, accountSecret, "createOrder");    if (!result){        // 這里需要自定義異常,統(tǒng)一處理異常,再統(tǒng)一響應(yīng)返回        throw new RuntimeException("重復(fù)的請(qǐng)求");    }    // 根據(jù)驗(yàn)證結(jié)果響應(yīng)不同信息    return "Success";}

校驗(yàn)如果不存在token,則說明請(qǐng)求時(shí)重復(fù)請(qǐng)求,直接拋出異常,由統(tǒng)一異常管理,直接返回客戶端請(qǐng)求失敗的錯(cuò)誤信息。關(guān)于SpringBoot中統(tǒng)一異常處理,統(tǒng)一結(jié)果響應(yīng),請(qǐng)查看:SpringBoot統(tǒng)一結(jié)果返回,統(tǒng)一異常處理,大牛都這么玩。FFZ28資訊網(wǎng)——每日最新資訊28at.com

我們在定義獲取Token令牌的接口,以及創(chuàng)建訂單的接口。FFZ28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMapping("order")public class OrderController {    private IOrderService orderService;    /**     * 獲取token接口     * @param secret 賬戶令牌     * @return     */    @GetMapping("getToken")    public String getToken(@RequestHeader("secret") String secret){        return orderService.generateToken(secret, "createOrder");    }    /**     * 創(chuàng)建訂單接口     * @param requestVO 參數(shù)     * @param token token令牌     * @param secret 賬戶令牌     * @return 響應(yīng)信息     */    @PostMapping("create")    public OrderCreateResponseVO createOrder(@RequestBody OrderCreateRequestVO requestVO,                                             @RequestHeader("token") String token,                                             @RequestHeader("secret") String secret){        OrderCreateResponseVO responseVO = new OrderCreateResponseVO();        String result = orderService.createOrder(requestVO, secret, token);        responseVO.setSuccess(Boolean.TRUE);        responseVO.setMsg(result);        return responseVO;    }    @Autowired    public void setOrderService(IOrderService orderService) {        this.orderService = orderService;    }}

我們使用Apifox模擬3個(gè)請(qǐng)求并發(fā)操作。FFZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片FFZ28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行結(jié)果如下:FFZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片FFZ28資訊網(wǎng)——每日最新資訊28at.com

控制臺(tái)打印日志如下:FFZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片FFZ28資訊網(wǎng)——每日最新資訊28at.com

可以看見只有1個(gè)請(qǐng)求成功了,并且控制臺(tái)中打印只有一個(gè)token校驗(yàn)成功。FFZ28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

冪等性是開發(fā)當(dāng)中很常見也很重要的一個(gè)需求,尤其是訂單,支付以及與金錢掛鉤的服務(wù),保證接口冪等性尤其重要。在實(shí)際開發(fā)中,我們需要針對(duì)不同的業(yè)務(wù)場景我們需要靈活的選擇冪等性的實(shí)現(xiàn)方式:FFZ28資訊網(wǎng)——每日最新資訊28at.com

  • 如果是web服務(wù),客戶端可以采取在頁面上使用按鈕置灰禁用,使用PRG模式,或者搭配后端的Token令牌進(jìn)行解決。
  • 在服務(wù)端,我們可以采取唯一標(biāo)識(shí)符,樂觀鎖,Token令牌,狀態(tài)機(jī)等校驗(yàn)方式。

最后強(qiáng)調(diào)一下,實(shí)現(xiàn)冪等性需要先理解自身業(yè)務(wù)需求,根據(jù)業(yè)務(wù)邏輯來實(shí)現(xiàn)這樣才合理,處理好其中的每一個(gè)結(jié)點(diǎn)細(xì)節(jié),完善整體的業(yè)務(wù)流程設(shè)計(jì),才能更好的保證系統(tǒng)的正常運(yùn)行。FFZ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-76559-0.html我們一起聊聊如何保證接口冪等性?高并發(fā)下的接口冪等性如何實(shí)現(xiàn)?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 從 Java 大神 Joshua Bloch 提煉 API 設(shè)計(jì)的三個(gè)核心原則

下一篇: Spring中Cron表達(dá)式的優(yōu)雅實(shí)現(xiàn)方案

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 俄羅斯:將審查iPhone等外國公司設(shè)備 保數(shù)據(jù)安全

    iPhone和特斯拉都屬于在各自領(lǐng)域領(lǐng)頭羊的品牌,推出的產(chǎn)品也也都是數(shù)一數(shù)二的,但對(duì)于一些國家而言,它們的產(chǎn)品可靠性和安全性還是在限制范圍內(nèi)。近日,俄羅斯聯(lián)邦通信、信息技術(shù)
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • SpringBoot中使用Cache提升接口性能詳解

    環(huán)境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對(duì) Spring 應(yīng)用程序提供了透明式添加緩存的支持。和事務(wù)支持一樣,抽象緩存允許一致地使用各
  • 一篇聊聊Go錯(cuò)誤封裝機(jī)制

    %w 是用于錯(cuò)誤包裝(Error Wrapping)的格式化動(dòng)詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個(gè)特殊格式化動(dòng)詞,用于將一個(gè)錯(cuò)誤(或其他可打印的值)包裝在一個(gè)新的錯(cuò)誤中。使
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • 使用Webdriver-manager解決瀏覽器與驅(qū)動(dòng)不匹配所帶來自動(dòng)化無法執(zhí)行的問題

    1、前言在我們使用 Selenium 進(jìn)行 UI 自動(dòng)化測試時(shí),常常會(huì)因?yàn)闉g覽器驅(qū)動(dòng)與瀏覽器版本不匹配,而導(dǎo)致自動(dòng)化測試無法執(zhí)行,需要手動(dòng)去下載對(duì)應(yīng)的驅(qū)動(dòng)版本,并替換原有的驅(qū)動(dòng),可能還
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財(cái)經(jīng)作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因?yàn)樗髂嵩赑S平臺(tái)上線《原神》,怒而
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創(chuàng)佳績。今年618期間,一加手機(jī)全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 由于成本持續(xù)增加,筆記本產(chǎn)品價(jià)格預(yù)計(jì)將明顯上漲

    根據(jù)知情人士透露,由于材料、物流等成本持續(xù)增加,筆記本產(chǎn)品價(jià)格預(yù)計(jì)將在2021年下半年有明顯上漲。進(jìn)入6月下旬以來,全球半導(dǎo)體芯片缺貨情況加劇,顯卡、處理器
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
免费视频亚洲| 亚洲国产一区二区视频| 欧美日韩视频不卡| 欧美性jizz18性欧美| 欧美日韩一区成人| 国产欧美欧美| 亚洲第一天堂无码专区| 日韩午夜av| 欧美一级电影久久| 蜜桃精品一区二区三区| 欧美三级韩国三级日本三斤| 国产日韩在线不卡| 亚洲精品在线视频| 午夜精品福利视频| 免费欧美日韩| 国产精品久久影院| 在线观看国产精品淫| 一区二区欧美视频| 久久精品国产99国产精品澳门| 欧美aa国产视频| 欧美特黄视频| 亚洲成在人线av| 亚洲一区二区在| 老司机成人网| 国产精品美女久久久久久2018| 亚洲国产高清自拍| 亚洲制服av| 欧美国产日韩a欧美在线观看| 国产九区一区在线| 亚洲精品久久久久久久久久久久久 | 国产精品国产馆在线真实露脸| 黑丝一区二区三区| 一区二区三区免费网站| 玖玖在线精品| 国产精品亚洲欧美| 日韩一级裸体免费视频| 久久婷婷亚洲| 国产伦理精品不卡| 99精品视频免费观看| 麻豆精品视频| 国产一区香蕉久久| 亚洲一区二区在线观看视频| 欧美电影在线观看| 激情成人综合| 香蕉久久久久久久av网站| 欧美日韩另类在线| 亚洲国产精品电影| 久久精品色图| 国产精品色午夜在线观看| 日韩视频二区| 欧美成人国产一区二区| 一区二区三区在线视频播放| 先锋a资源在线看亚洲| 欧美色区777第一页| 亚洲看片免费| 美女黄色成人网| 精品动漫3d一区二区三区免费版| 欧美亚洲综合网| 99国内精品久久久久久久软件| 久久大香伊蕉在人线观看热2| 欧美午夜视频一区二区| 亚洲精品系列| 欧美电影免费观看高清| 在线观看日韩一区| 久久夜精品va视频免费观看| 国产性色一区二区| 午夜精品视频一区| 国产精品中文字幕在线观看| 亚洲一区二区黄色| 国产精品成人一区二区网站软件 | 国内免费精品永久在线视频| 午夜在线不卡| 国产毛片精品视频| 校园激情久久| 国产视频一区三区| 欧美在线播放高清精品| 国产亚洲欧洲| 久久成人久久爱| 国产在线播放一区二区三区| 久久精品视频亚洲| 国色天香一区二区| 久久一区精品| 亚洲第一色在线| 欧美成人日韩| 亚洲精选视频免费看| 欧美日韩精品中文字幕| 亚洲一区二区精品在线| 国产精品日韩欧美一区| 欧美亚洲一区三区| 国产在线拍揄自揄视频不卡99| 久久久久久成人| 亚洲福利av| 欧美激情综合色综合啪啪| 一本一道久久综合狠狠老精东影业| 欧美日韩一卡| 亚洲午夜日本在线观看| 国产精品一区在线观看你懂的| 欧美一区二区精美| 国产一区二区高清视频| 久久亚洲捆绑美女| 亚洲精品在线看| 欧美亚州韩日在线看免费版国语版| 亚洲一区二区在线观看视频| 国产性猛交xxxx免费看久久| 老司机精品福利视频| 亚洲看片网站| 国产精品色在线| 久久久中精品2020中文| 亚洲人成毛片在线播放| 国产精品白丝jk黑袜喷水| 午夜精品免费视频| 一区视频在线看| 欧美精品在线一区二区| 亚洲免费视频一区二区| 韩国三级电影久久久久久| 欧美高清影院| 亚洲综合色丁香婷婷六月图片| 国内精品视频久久| 欧美激情a∨在线视频播放| 一区二区三区四区精品| 国产亚洲精品久久久久动| 免播放器亚洲一区| 在线性视频日韩欧美| 国产综合色产| 欧美人与禽性xxxxx杂性| 小嫩嫩精品导航| 亚洲国产精品高清久久久| 欧美日韩在线看| 久久久国产一区二区| 99re8这里有精品热视频免费| 国产嫩草一区二区三区在线观看| 久久一区二区三区av| 夜夜嗨av色综合久久久综合网| 国产色爱av资源综合区| 欧美第一黄网免费网站| 西瓜成人精品人成网站| 91久久极品少妇xxxxⅹ软件| 国产精品爽爽爽| 欧美成人情趣视频| 欧美一区二区视频97| 亚洲日本欧美天堂| 国产日产欧产精品推荐色| 欧美大香线蕉线伊人久久国产精品| 亚洲综合日韩| 91久久国产精品91久久性色| 国产精品一区二区你懂得| 欧美精品综合| 久久久亚洲高清| 亚洲自拍偷拍网址| 亚洲日产国产精品| 激情婷婷欧美| 国产精品网站在线| 欧美日韩不卡| 美女久久一区| 欧美在线中文字幕| 亚洲一区二区三区高清| 亚洲国产欧美一区二区三区同亚洲| 国产美女精品视频| 欧美日韩在线免费| 欧美成人日韩| 久久另类ts人妖一区二区| 亚洲欧美清纯在线制服| 亚洲美女视频在线观看| 亚洲大胆av| 国产一区二区三区久久| 欧美午夜欧美| 欧美精品一区二区三区久久久竹菊 | 国产精品国产三级国产普通话三级 | 欧美亚洲专区| 亚洲午夜高清视频| 亚洲精品一二| 在线免费观看成人网| 国产日韩一区二区三区| 国产精品福利片| 欧美日本在线一区| 蜜臀va亚洲va欧美va天堂| 久久精品男女| 香蕉国产精品偷在线观看不卡| 亚洲午夜精品福利| 99精品视频免费观看视频| 亚洲国产精品ⅴa在线观看| 精品999在线播放| 国产综合亚洲精品一区二| 国产九九精品视频| 国产精品区一区二区三区| 欧美午夜片在线观看| 欧美人与性禽动交情品| 欧美国产精品日韩| 欧美成人网在线| 欧美va天堂在线| 老鸭窝91久久精品色噜噜导演| 久久久久久有精品国产| 久久成人久久爱| 久久精品国产亚洲精品| 久久精品男女| 久久久久久9| 久久久人人人| 久久婷婷一区| 久久一二三四| 欧美gay视频| 欧美国产乱视频| 欧美精品一区在线| 欧美精品免费观看二区| 欧美日本国产视频|