冪等性問題的常見處理辦法
在計算機中的冪等操作是指任意多次執(zhí)行產(chǎn)生的效果和一次執(zhí)行的效果相同。
前端重復(fù)提交同一表單,比如由于網(wǎng)絡(luò)延遲用戶多次點擊提交按鈕 惡意重復(fù)提交,比如繞過前端組件的限制,直接請求接口進(jìn)行投票刷票 失敗重試,比如 nginx 和 dubbo 的 retry 消息重復(fù)消費,比如消費方未確認(rèn)消費、網(wǎng)絡(luò)問題導(dǎo)致 MQ 未收到確認(rèn)消費、消費方處理超時、MQ 收到確認(rèn)消費但處理失敗,都可能會重復(fù)發(fā)送消息
前端表單提交之后,提交按鈕 disable 使用 token 機制防止重復(fù)提交,客戶端調(diào)用接口前先從后端申請 token,然后調(diào)用接口帶上 token,第一次調(diào)用成功后端將 token 刪除,若后續(xù)重復(fù)調(diào)用,后端校驗 token 已刪除,返回失敗 在插入和刪除場景,使用分布式 ID + 數(shù)據(jù)庫主鍵或唯一索引的方式處理,重復(fù)插入相同 ID 的數(shù)據(jù),數(shù)據(jù)庫會拋出異常,Java 代碼對異常進(jìn)行處理 更新場景,使用數(shù)據(jù)庫的樂觀鎖,表結(jié)構(gòu)加上版本字段,version 不匹配不更新 update t set field=?, version=version+1 where ID=? and version = ?;帶條件的數(shù)據(jù)庫插入 insert into t values(?, ?) where not exists (select id from t where id = ?)MQ 的冪等處理,客戶端給消息生成全局唯一 msg-id,MQ 根據(jù) msg-id 判斷是否消息已投遞;根據(jù) msg-id 或業(yè)務(wù)相關(guān)的 biz-id,這里暫且記為 ID,業(yè)務(wù)端判斷 ID 是否已處理,已處理丟棄即可。
評論
圖片
表情
