<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          冪等性問題的常見處理辦法

          共 1056字,需瀏覽 3分鐘

           ·

          2021-05-02 14:50

          在計算機中的冪等操作是指任意多次執(zhí)行產(chǎn)生的效果和一次執(zhí)行的效果相同。


          在以下場景中會遇到非冪等的情況:
          1. 前端重復(fù)提交同一表單,比如由于網(wǎng)絡(luò)延遲用戶多次點擊提交按鈕
          2. 惡意重復(fù)提交,比如繞過前端組件的限制,直接請求接口進(jìn)行投票刷票
          3. 失敗重試,比如 nginx 和 dubbo 的 retry
          4. 消息重復(fù)消費,比如消費方未確認(rèn)消費、網(wǎng)絡(luò)問題導(dǎo)致 MQ 未收到確認(rèn)消費、消費方處理超時、MQ 收到確認(rèn)消費但處理失敗,都可能會重復(fù)發(fā)送消息


          這時候就要加入冪等性處理:
          1. 前端表單提交之后,提交按鈕 disable
          2. 使用 token 機制防止重復(fù)提交,客戶端調(diào)用接口前先從后端申請 token,然后調(diào)用接口帶上 token,第一次調(diào)用成功后端將 token 刪除,若后續(xù)重復(fù)調(diào)用,后端校驗 token 已刪除,返回失敗
          3. 在插入和刪除場景,使用分布式 ID + 數(shù)據(jù)庫主鍵或唯一索引的方式處理,重復(fù)插入相同 ID 的數(shù)據(jù),數(shù)據(jù)庫會拋出異常,Java 代碼對異常進(jìn)行處理
          4. 更新場景,使用數(shù)據(jù)庫的樂觀鎖,表結(jié)構(gòu)加上版本字段,version 不匹配不更新
            update t set field=?, version=version+1 where ID=? and version = ?;
          5. 帶條件的數(shù)據(jù)庫插入
            insert into t values(?, ?) where not exists (select id from t where id = ?)
          6. MQ 的冪等處理,客戶端給消息生成全局唯一 msg-id,MQ 根據(jù) msg-id 判斷是否消息已投遞;根據(jù) msg-id 或業(yè)務(wù)相關(guān)的 biz-id,這里暫且記為 ID,業(yè)務(wù)端判斷 ID 是否已處理,已處理丟棄即可。

          上述第 2 點判斷 token 是否刪除、第 6 點判斷消息是否已處理,都存在競態(tài)條件,需要加入鎖,至于是 JVM 級別的鎖還是分布式鎖,要看具體架構(gòu)。

          祝:假期愉快!
          瀏覽 97
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码一区二区三区四 | 精品免费视频 | 国产精品男女考逼视频 | 欧美一级做一级a 做片性视频 | 天天干天天射天天快乐 |