国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式接口冪等性設(shè)計實現(xiàn)

這篇具有很好參考價值的文章主要介紹了分布式接口冪等性設(shè)計實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

面對分布式架構(gòu)和微服務(wù)復(fù)雜的系統(tǒng)架構(gòu)和網(wǎng)絡(luò)超時服務(wù)器異常等帶來的系統(tǒng)穩(wěn)定性問題,分布式接口的冪等性設(shè)計顯得尤為重要。本文簡要介紹了幾種分布式接口冪等性設(shè)計實現(xiàn),包括Token去重機制、樂觀鎖機制、數(shù)據(jù)庫主鍵和狀態(tài)機實現(xiàn)等,以加深理解。


1、分布式接口冪等性相關(guān)概念
1.1 什么是冪等性

冪等性來源自數(shù)學(xué)領(lǐng)域,數(shù)學(xué)上的冪等性是指對于某一元運算為冪等的操作,在任意元素上多次執(zhí)行的結(jié)果是相同的。例如,函數(shù)f(x) = f(x)對于任意的x,在x上的第一次和第二次執(zhí)行可以得到相同的結(jié)果。

在HTTP/1.1規(guī)范中冪等性的定義如下:

Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

一次和多次請求某一個資源對于資源本身應(yīng)該具有同樣的結(jié)果(網(wǎng)絡(luò)超時等問題除外)。也就是說,其任意多次執(zhí)行對資源本身所產(chǎn)生的影響均與一次執(zhí)行的影響相同。

在HTTP協(xié)議中,HTTP GET是一個清晰的冪等操作,HTTP DELETE/POST是非冪等的,HTTP PUT也是冪等的,因為對同一個URI進行多次PUT的side-effetcs是一致的。

分布式接口冪等性設(shè)計實現(xiàn)

在分布式架構(gòu)或者微服務(wù)架構(gòu)中,由于分布式自身的時序問題以及系統(tǒng)網(wǎng)絡(luò)的穩(wěn)定性,接口具有成功、失敗和無響應(yīng)的三種狀態(tài),為了提供系統(tǒng)的可用性,重復(fù)提交是不可避免的,而重試就會引發(fā)冪等性的問題。

1.2 冪等性的使用場景

分布式接口的冪等性實際上就是接口可重復(fù)調(diào)用,在調(diào)用方多次調(diào)用的情況下,接口最終得到的結(jié)果是一致的。冪等性適用于以下場景:

  1. 前端重復(fù)提交:在訂單系統(tǒng)中用戶在前端提交訂單,快速重復(fù)點擊多次,造成后端生成多個內(nèi)容重復(fù)的訂單,但是后臺應(yīng)該只產(chǎn)生一個訂單。
  2. 接口超時重試:對于給第三方調(diào)用的接口,為了防止網(wǎng)絡(luò)抖動或其他原因造成請求丟失,這樣的接口一般都會設(shè)計成超時重試多次。防止外部多次調(diào)用對系統(tǒng)數(shù)據(jù)狀態(tài)的發(fā)生多次改變,將服務(wù)接口設(shè)計成冪等,就是為了防止多次重試造成系統(tǒng)不一致的問題。比如賬戶扣款操作超時重試了多次,理應(yīng)只扣款一次。
  3. 消息重復(fù)消費:MQ消息中間件,消息重復(fù)消費,相同請求條件下這次消費的結(jié)果與下一次應(yīng)該保持一致。
1.3 分布式接口冪等性的實現(xiàn)方案

接口冪等性的解決方案可以在客戶端和服務(wù)端實現(xiàn),但是客戶端控制效果不佳,比如按鈕置灰、不可點擊等,由于涉及到多設(shè)備兼容性以及接口調(diào)用的問題,并不能真正實現(xiàn)冪等。因此安全的措施還是從后端接口層進行控制,有以下幾種方案:

  1. Token去重:根據(jù)業(yè)務(wù)的操作和內(nèi)容生成一個Token值(全局唯一ID),在執(zhí)行操作前先根據(jù)這個全局唯一ID進行校驗,來判斷這個操作是否已經(jīng)執(zhí)行。如果存在則表示該方法已經(jīng)執(zhí)行。
  2. 樂觀鎖機制:適用于更新操作。在查詢和刪除操作中使用樂觀鎖機制,保證一次處理結(jié)果,避免重復(fù)操作。設(shè)計表結(jié)構(gòu)時使用樂觀鎖,通過version來做樂觀鎖,這樣既能保證執(zhí)行效率,又能保證冪等。
  3. 數(shù)據(jù)庫主鍵:適用于插入時的冪等性。利用數(shù)據(jù)庫中主鍵唯一約束的特性,保證一張表中只能存在一條帶該唯一主鍵的記錄。
  4. 狀態(tài)機冪等:根據(jù)業(yè)務(wù)表的狀態(tài)特性設(shè)計,只支持狀態(tài)的單向改變,在執(zhí)行的時候加上狀態(tài)信息,實現(xiàn)冪等。

冪等性設(shè)計簡化了客戶端的處理邏輯,卻增加了服務(wù)端邏輯處理和設(shè)計上的復(fù)雜性,增加額外控制冪等的業(yè)務(wù)邏輯的同時,將并行執(zhí)行改為串行降低了執(zhí)行效率。

2、幾種接口冪等性方案介紹
2.1 Token去重

Token機制是通過在服務(wù)端生成一個唯一的Token,并將其存儲在客戶端中,來保證多個客戶端之間對同一個服務(wù)的請求結(jié)果的一致性。Token機制的實現(xiàn)原理如下:

  1. 服務(wù)端生成Token:服務(wù)端需要生成一個唯一的Token,可以使用時間戳、隨機數(shù)等信息來生成。生成Token后,將其存儲在服務(wù)端的數(shù)據(jù)庫中。
  2. 客戶端獲取Token:客戶端在每次請求服務(wù)時,需要向服務(wù)端發(fā)送一個請求Token。請求Token是服務(wù)端根據(jù)Token生成的唯一標(biāo)識,客戶端通過該Token來識別自己的身份,并在服務(wù)端的數(shù)據(jù)庫中查找對應(yīng)的Token。
  3. 如果找到了對應(yīng)的Token,則說明該請求是第一次請求,服務(wù)端將其存儲在數(shù)據(jù)庫中,并返回一個唯一的標(biāo)識符;如果在數(shù)據(jù)庫中找不到該Token,則說明該請求是重復(fù)請求,服務(wù)端不返回任何結(jié)果,并提示用戶重新操作。
  4. 如果在數(shù)據(jù)庫中也找不到該Token,則說明該請求是冪等請求,服務(wù)端可以直接返回結(jié)果,不做任何操作。

分布式接口冪等性設(shè)計實現(xiàn)

Token機制的優(yōu)點是實現(xiàn)簡單、易于部署和維護,能夠保證分布式系統(tǒng)的冪等性。但是,它也存在一些局限性,例如需要在服務(wù)端和客戶端之間傳遞Token,可能會導(dǎo)致性能問題;另外,如果Token被濫用,也可能會帶來安全問題。因此,在使用Token機制時,需要根據(jù)具體情況進行權(quán)衡和選擇。

2.2 樂觀鎖機制

數(shù)據(jù)庫樂觀鎖方案一般適用于更新操作的冪等性,實現(xiàn)邏輯是在對應(yīng)的數(shù)據(jù)表中添加一個version字段,作為當(dāng)前數(shù)據(jù)的的版本標(biāo)識。這樣每次對這條數(shù)據(jù)執(zhí)行更新時,都會將該版本標(biāo)識作為一個條件,值需要為上次待更新數(shù)據(jù)中的版本標(biāo)識的值。

1)先根據(jù)條件查詢數(shù)據(jù),得到對應(yīng)的版本號version

select version from tablename where xxx

2)更新數(shù)據(jù)時帶上版本號version,只有版本號匹配才會更新數(shù)據(jù),如果不匹配則不更新

update tablename set count=count+1, version=version+1 where version=#{version}

3)更新數(shù)據(jù)的時候,同時需要更新數(shù)據(jù)對應(yīng)的版本號version,這樣可以解決ABA問題。

如果一個變量V初次讀取的時候是A值,并且在準(zhǔn)備賦值的時候檢查到它仍然是A值,那我們就能說明它的值沒有被其他線程修改過了嗎?很明顯是不能的,因為在這段時間它的值可能被改為其他值,然后又改回A,那CAS操作就會誤認為它從來沒有被修改過。這個問題被稱為CAS操作的 "ABA"問題。

樂觀鎖機制實際上是犧牲了并發(fā)性來實現(xiàn)更新操作的冪等性,在并發(fā)場景下會導(dǎo)致大量的鎖沖突等待和性能問題。

2.3 數(shù)據(jù)庫主鍵

數(shù)據(jù)庫唯一主鍵機制是利用主鍵的唯一性約束,適用于插入操作的冪等性,當(dāng)插入主鍵重復(fù)的數(shù)據(jù)時會拋出異常,保證數(shù)據(jù)的一致性。表結(jié)構(gòu)設(shè)計如下所示:

CREATE TABLE `t_check` (
  `id` int(11) NOT NULL COMMENT 'ID',
  `serial_no` varchar(255)  NOT NULL COMMENT '唯一序列號',
  `source_type` varchar(255)  NOT NULL COMMENT '資源類型',
  `status` int(4) DEFAULT NULL COMMENT '狀態(tài)',
  PRIMARY KEY (`id`)
  UNIQUE KEY `key_s` (`serial_no`,`source_type`)  COMMENT '保證業(yè)務(wù)唯一性'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='冪等性校驗表';

唯一主鍵UNIQUE KEY的關(guān)鍵性字段如下:

  • serial_no:唯一序列號的值,在分布式架構(gòu)下是全局唯一的ID
  • source_type:業(yè)務(wù)類型,區(qū)分不同的業(yè)務(wù),訂單,支付等。

具體處理邏輯如下圖所示:

分布式接口冪等性設(shè)計實現(xiàn)

2.4 狀態(tài)機實現(xiàn)冪等

對于很多業(yè)務(wù)是有業(yè)務(wù)流轉(zhuǎn)狀態(tài)的,如訂單的待提交,待支付,已支付,取消等,在業(yè)務(wù)邏輯處理的時候只支持狀態(tài)的單向改變。業(yè)務(wù)表在設(shè)計的時候增加狀態(tài)字段status,這樣在更新的時候加上“status=期望的status”,多次調(diào)用的話實際也只會執(zhí)行一次。

update xx where id=1 and status=1

分布式接口冪等性設(shè)計實現(xiàn)

3、總結(jié)

分布式架構(gòu)下冪等性是保證接口能夠重復(fù)執(zhí)行的重要機制,冪等性和防重又有所不同,防重是在第一次請求已經(jīng)成功的情況下人為多次重復(fù)操作導(dǎo)致的狀態(tài)改變,冪等性是在不確定第一次請求結(jié)果的情況下,發(fā)起多次請求不會出現(xiàn)狀態(tài)的變化。實際使用中,通過數(shù)據(jù)庫主鍵的唯一性可以實現(xiàn)冪等性和防重,樂觀鎖的version機制能夠?qū)崿F(xiàn)并發(fā)更新下的冪等性,也可以通過數(shù)據(jù)庫悲觀鎖機制在業(yè)務(wù)操作前獲取鎖資源實現(xiàn)唯一性操作??偠灾?,分布式接口的冪等性是在犧牲一定的并發(fā)和性能的前提下,以實現(xiàn)系統(tǒng)的穩(wěn)定性和容錯性。


參考資料:文章來源地址http://www.zghlxwxcb.cn/news/detail-450597.html

  1. https://blog.csdn.net/tengxvincent/article/details/81773745
  2. https://www.cnblogs.com/jajian/p/10926681.html
  3. https://blog.csdn.net/qq_41863849/article/details/123973348
  4. https://zhuanlan.zhihu.com/p/70748661

到了這里,關(guān)于分布式接口冪等性設(shè)計實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Springboot 定時任務(wù),分布式下冪等性如何解決

    Springboot 定時任務(wù),分布式下冪等性如何解決

    在分布式環(huán)境下,定時任務(wù)的冪等性問題需要考慮多個節(jié)點之間的數(shù)據(jù)一致性和事務(wù)處理。 一種解決方法是使用分布式鎖來保證同一時間只有一個節(jié)點能夠執(zhí)行該任務(wù)。具體實現(xiàn)可以使用Redis或Zookeeper等分布式協(xié)調(diào)工具提供的分布式鎖功能。 另一種解決方法是使用消息隊列來

    2024年02月11日
    瀏覽(22)
  • 【Spring Cloud系列】- 分布式系統(tǒng)中實現(xiàn)冪等性的幾種方式

    【Spring Cloud系列】- 分布式系統(tǒng)中實現(xiàn)冪等性的幾種方式

    在開發(fā)訂單系統(tǒng)時,我們常遇見支付問題,既用戶購買商品后支付,支付扣款成功,但是返回結(jié)果的時候網(wǎng)絡(luò)異常,此時錢已經(jīng)扣了,用戶再次點擊按鈕,此時會進行第二次扣款,返回結(jié)果成功,用戶查詢余額發(fā)現(xiàn)多扣錢了,流水記錄也變成了兩條。在以前的單應(yīng)用系統(tǒng)中,

    2024年02月10日
    瀏覽(20)
  • 開源:Taurus.Idempotent 分布式冪等性鎖框架,支持 .Net 和 .Net Core 雙系列版本

    開源:Taurus.Idempotent 分布式冪等性鎖框架,支持 .Net 和 .Net Core 雙系列版本

    分布式冪等性框架的作用是確保在分布式系統(tǒng)中的操作具有冪等性,即無論操作被重復(fù)執(zhí)行多少次,最終的結(jié)果都是一致的。冪等性是指對同一操作的多次執(zhí)行所產(chǎn)生的效果與僅執(zhí)行一次的效果相同。 以下是分布式冪等性框架的主要作用: 避免重復(fù)操作: 在分布式系統(tǒng)中,

    2024年03月09日
    瀏覽(27)
  • 「并發(fā)編程實戰(zhàn)」接口冪等性設(shè)計的最佳實現(xiàn)(8種實現(xiàn)方案)

    「并發(fā)編程實戰(zhàn)」接口冪等性設(shè)計的最佳實現(xiàn)(8種實現(xiàn)方案)

    文章參考: 實戰(zhàn)!聊聊冪等設(shè)計 基于冪等表思想的冪等實踐 追憶四年前:一段關(guān)于我被外企CTO用登錄注冊吊打的不堪往事 彈力設(shè)計篇之“冪等性設(shè)計” 冪等是一個數(shù)學(xué)與計算機科學(xué)概念。 在數(shù)學(xué)中,冪等用函數(shù)表達式就是: f(x) = f(f(x)) 。比如求絕對值的函數(shù),就是冪等的

    2024年01月22日
    瀏覽(24)
  • 云事業(yè)群CTO線技術(shù)晉升考核機試題-分布式專題-G 分布式冪等架構(gòu)設(shè)計

    作者:田超凡 1 冪等的基本概念 答:冪等指的是同一塊業(yè)務(wù)邏輯重復(fù)多次執(zhí)行時,只能令其生效一次,防止重復(fù)執(zhí)行。 2 冪等的發(fā)生場景 答: RPC 調(diào)用接口的冪等性問題 MQ 消費者防止重復(fù)消費的冪等性問題 定時任務(wù)防止重復(fù)執(zhí)行的冪等性問題 3 RPC調(diào)用接口的冪等性問題產(chǎn)生

    2024年02月16日
    瀏覽(119)
  • 一文搞定接口冪等性架構(gòu)設(shè)計方案

    一文搞定接口冪等性架構(gòu)設(shè)計方案

    現(xiàn)如今很多系統(tǒng)都會基于分布式或微服務(wù)思想完成對系統(tǒng)的架構(gòu)設(shè)計。那么在這一個系統(tǒng)中,就會存在若干個微服務(wù),而且服務(wù)間也會產(chǎn)生相互通信調(diào)用。那么既然產(chǎn)生了服務(wù)調(diào)用,就必然會存在服務(wù)調(diào)用延遲或失敗的問題。當(dāng)出現(xiàn)這種問題,服務(wù)端會進行重試等操作或客戶

    2023年04月20日
    瀏覽(19)
  • 騰訊二面:如何保證接口冪等性?高并發(fā)下的接口冪等性如何實現(xiàn)?

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

    2024年03月19日
    瀏覽(30)
  • 一個注解實現(xiàn)接口冪等性,真心優(yōu)雅!

    一個注解實現(xiàn)接口冪等性,真心優(yōu)雅!

    簡單來說,就是對一個接口執(zhí)行重復(fù)的多次請求,與一次請求所產(chǎn)生的結(jié)果是相同的,聽起來非常容易理解,但要真正的在系統(tǒng)中要始終保持這個目標(biāo),是需要很嚴(yán)謹?shù)脑O(shè)計的,在實際的生產(chǎn)環(huán)境下,我們應(yīng)該保證任何接口都是冪等的,而如何正確的實現(xiàn)冪等,就是本文要討

    2024年02月03日
    瀏覽(27)
  • Spring Boot 實現(xiàn)接口冪等性的 4 種方案

    Spring Boot 實現(xiàn)接口冪等性的 4 種方案

    現(xiàn)在的系統(tǒng)或平臺,為了追求體驗性、內(nèi)容豐富性,都是前后端分離,系統(tǒng)為了解藕會引入各種MQ等,都不可避免就引入了數(shù)據(jù)冪等性的問題。 冪等是一個數(shù)學(xué)與計算機學(xué)概念,在數(shù)學(xué)中某一運算為冪等時,其作用在任一元素兩次會和其作用一次的結(jié)果相同。 在計算機編程中

    2024年02月06日
    瀏覽(26)
  • 冪等性設(shè)計與實現(xiàn)

    冪等性設(shè)計與實現(xiàn)

    冪等性(Idempotence) 是一個在計算機科學(xué)中使用的術(shù)語。當(dāng)某個操作無論進行一次或多次都產(chǎn)生相同的結(jié)果,我們就說這個操作是冪等的。 例如,刪除文件的操作就是冪等的,因為無論你嘗試刪除一次還是兩次,結(jié)果都是文件被刪除。相對地,計數(shù)器增加操作就不是冪等的,

    2024年02月16日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包