国产TS紫迹丝袜高跟鞋在线,一区二区三区国产自产视频免费,67pao国产人成视频,午国产午夜激无码毛片不卡

愛碼網(wǎng)專注于資源免費(fèi)下載

冪等設(shè)計(jì)的6種實(shí)現(xiàn)方式

古語云:“一而再,再而三,其效不二”
俗語講:被虐千百遍,依然如初戀
數(shù)學(xué)符號(hào):f(f(f(x))) = f(x)
即無論操作執(zhí)行一次還是多次,其效果始終如一,不會(huì)有差異。這就是冪等性。

接口冪等性就是用戶對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用。

注意:數(shù)據(jù)庫可能產(chǎn)生冪等性問題,但是冪等性問題不只發(fā)生在數(shù)據(jù)庫。

比如在訂單系統(tǒng)中,訂單可以直接支付、積分抵扣、余額支付等不同的支付方式,除直接支付外,其他資產(chǎn)在獲取的過程中可能存在以下過程:

冪等設(shè)計(jì)的6種實(shí)現(xiàn)方式-第1張圖片

由于網(wǎng)絡(luò)存在不穩(wěn)定的因素,這個(gè)通知可能會(huì)發(fā)送多次,極端請(qǐng)況下,同一筆訂單的多次通知可能會(huì)同時(shí)到達(dá)商城服務(wù)端,如果不做冪等,那么同一筆訂單就可能被多次處理,繼而出現(xiàn)多次發(fā)放、ABA等一系列并發(fā)問題。

如何產(chǎn)生冪等問題

  1. 網(wǎng)絡(luò)請(qǐng)求重試:網(wǎng)絡(luò)波動(dòng)或超時(shí),客戶端可能會(huì)重復(fù)發(fā)送相同的請(qǐng)求。

  2. 用戶界面重復(fù)提交:用戶在用戶界面上可能會(huì)不小心重復(fù)點(diǎn)擊按鈕,導(dǎo)致仙童的請(qǐng)求多次發(fā)送。

  3. 消息隊(duì)列重試機(jī)制:使用消息隊(duì)列時(shí),消息可能會(huì)被重復(fù)消費(fèi)。

  4. 數(shù)據(jù)庫并發(fā)操作:數(shù)據(jù)庫插入、更新和刪除操作多個(gè)事物同時(shí)修改同一條記錄,而沒有使用適當(dāng)?shù)逆i機(jī)制或事務(wù)隔離級(jí)別。

  5. 外部系統(tǒng)API接口重試:對(duì)外提供的API接口可能由于調(diào)用方的重試邏輯,導(dǎo)致數(shù)據(jù)庫操作被重復(fù)調(diào)用。

如何解決這個(gè)問題

唯一性約束

利用數(shù)據(jù)庫的唯一性約束,如唯一索引或主鍵,來避免插入重復(fù)數(shù)據(jù)。

mysql> INSERT INTO `mydb`.`orders` (`order_id`, `user_id`, `product_id`, `quantity`, `order_status`, `create_time`, `pay_time`, `version`) VALUES ('ORD-20231023-0001', 'USR-A123456', 'PRD-X123', 2, 0, '2023-10-23 10:15:30', NULL, 1);
ERROR 1062 (23000): Duplicate entry 'ORD-20231023-0001' for key 'orders.PRIMARY'

樂觀鎖

通過記錄數(shù)據(jù)的`版本號(hào)`或`時(shí)間戳`,僅當(dāng)數(shù)據(jù)未被其他事務(wù)修改時(shí),才允許更新操作執(zhí)行。每次更新數(shù)據(jù)時(shí),版本號(hào)都會(huì)遞增。

UPDATE ordersSET
  quantity = 1,
  order_status = 1,
  pay_time = '2024-04-30 10:20:00',
  version = version + 1WHERE
  order_id = 'ORD-20231023-0001' AND
  version = 1;

悲觀鎖

使用悲觀鎖,事務(wù)在讀取數(shù)據(jù)時(shí)會(huì)鎖定相應(yīng)的數(shù)據(jù)行,直到事務(wù)結(jié)束(提交或回滾)。這可以防止其他事務(wù)在鎖定期間修改這些數(shù)據(jù),從而確保數(shù)據(jù)的一致性。

在執(zhí)行讀取操作時(shí),使用 SELECT ... FOR UPDATE 語句來鎖定相關(guān)記錄。

在執(zhí)行讀取操作時(shí),使用 SELECT ... FOR UPDATE 語句來鎖定相關(guān)記錄。

- 鎖定記錄SELECT * FROM orders WHERE order_id = 'ORD-20231023-0001' FOR UPDATE;-- 執(zhí)行業(yè)務(wù)邏輯
 UPDATE orders SET quantity = 1, order_status = 1, pay_time = '2023-10-23 10:20:00' WHERE order_id = 'ORD-20231025-0003';

悲觀鎖確保每個(gè)事務(wù)也能安全地執(zhí)行,而不會(huì)導(dǎo)致數(shù)據(jù)不一致的問題。但是,悲觀鎖可能會(huì)因?yàn)殒i定機(jī)制而導(dǎo)致 性能問題 ,尤其是在高并發(fā)的系統(tǒng)中,這可能會(huì)引起 鎖爭(zhēng)用和死鎖 。

分布式鎖

在分布式系統(tǒng)中,使用分布式鎖來保證同一時(shí)間只有一個(gè)實(shí)例處理特定消息或請(qǐng)求。

狀態(tài)機(jī)

使用狀態(tài)機(jī)是判斷業(yè)務(wù)流程,確保操作只執(zhí)行一次。

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

  1. 訂單創(chuàng)建:訂單初始化,狀態(tài)為 PENDING(待支付)。

  2. 支付操作:當(dāng)訂單狀態(tài)為 PENDING 時(shí),允許執(zhí)行支付操作,支付成功后狀態(tài)變?yōu)?nbsp;PAID(已支付)。

  3. 重復(fù)支付檢查:如果再次嘗試支付一個(gè)已經(jīng)是 PAID 狀態(tài)的訂單,狀態(tài)機(jī)將拒絕該操作,保持訂單狀態(tài)不變。

全局請(qǐng)求唯一ID

調(diào)用接口時(shí),生成一個(gè)唯一 id,redis 將數(shù)據(jù)保存到集合中(去重),存在即處理過??梢允褂?nginx 設(shè)置每一個(gè)請(qǐng)求的唯一 id;

proxy_set_header X-Request-Id $request_id;


來源:http://zxse.cn/archives/1717684955907

本文鏈接:http://fangxuan.com.cn/article/598.html

網(wǎng)友評(píng)論

熱門文章
隨機(jī)文章
熱門標(biāo)簽
側(cè)欄廣告位