<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # :-: 系統冪等性設計與實 ## 一、冪等性的定義 就是用戶對于同一操作發起的一次請求或者多次請求的結果是一致的,不會因為多次點擊而產生了副作用。舉個最簡單的例子,那就是支付,用戶購買商品使用支付,支付扣款成功,但是返回結果的時候網絡異常,此時錢已經扣了,用戶再次點擊按鈕,此時會進行第二次扣款,返回結果成功,用戶查詢余額返發現多扣錢了,流水記錄也變成了兩條。 ## 二、確定需要冪等性的范圍 ### 2.1. 確定大范圍 1. 請求層面:`讀請求`、`寫請求` * 其中讀請求沒有影響數據變化不需要做冪等性 2. 微服務層面:`負載均衡`、`api網關`、`業務邏輯層`、`數據訪問層` * 其中負載均衡、api網關、業務邏輯層沒有影響數據變化不需要做冪等性 > 總結:上面的范圍里只有`數據訪問層`和`寫請求` ### 2.2. 數據訪問層-寫請求 1. Insert * **需要做冪等性** 2. Update * 直接更新某個值的:不需要做冪等性 * 累加操作等計算式的更新:**需要做冪等性** 3. Delete * 重復刪除結果是一樣:不需要做冪等性 ## 三、冪等性解決方案 * 沒有最優的方案只有最適合的,因為這個和業務的邏輯強相關,所以就簡單列舉通用的方案 ### 3.1. Insert冪等方案 1. **數據字段增加唯一索引** * 優點:實現簡單方便 * 缺點:影響數據庫性能不適合該字段會被頻繁更新的場景,唯一索引比普通索引在寫操作上開銷會大很多 2. **insert時使用臨時表查詢判斷** ~~~ insert into sys_user(name,password) select 'admin', '123456' from dual where not exists(select 1 from sys_user where name='admin'); ~~~ * 優點:不需要創建唯一索引,語法相對通用(mysql和oracle) * 缺點:寫操作會增加一次select子查詢開銷,增加sql語法的復雜度可讀性較差 3. **細粒度分布式鎖+select + insert** * 意思就是先加一個細粒度的分布式鎖,然后select查一下是否存在,不存在再insert * 例子可參考文檔:[開發說明](http://www.hmoore.net/zlt2000/microservices-platform/919421)中的`方法級冪等性` * 優點:性能影響較少,使用的是細粒度鎖,所以只有重復提交記錄時才會阻塞 * 缺點:寫操作會增加一次select開銷,實現難度相對較大因為需要分布式細粒度鎖 ### 3.2. Update計算操作冪等方案 * 這個需要結合具體業務來設計方案,常用的場景可通過版本號的方式來控制 * 在表里面添加`version`字段 * ~~~ alter table sys_user add version int default 0; ~~~ * 然后更新的時候通過這個`version`來判斷是否為過期無效操作,這是樂觀鎖的一種思路 * ~~~ update sys_user set age=age+1, version=version+1 where version=xx ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看