<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 冪等定義 定義:服務調用一次和重復調用多次產生的結果相同,即服務具有冪等性 ### 冪等設計 1. 防止表單重復提交 2. 新增數據主鍵\(聯合唯一索引\)去重 3. 分布式鎖 4. 狀態機或狀態檢查 5. 版本號控制 6. bigLog增加流水日志; 7. 冪等框架\(美團GTIS\) ### 冪等性定義 冪等性是指對同一個系統使用同樣的條件,一次請求和重復的多次請求對系統資源的影響是一致的; 那么我們為什么需要接口具有冪等性呢?設想一下以下情形: * 在App中下訂單的時候,點擊確認之后,沒反應,就又點擊了幾次。在這種情況下,如果無法保證該接口的冪等性,那么將會出現重復下單問題。 * 在接收消息的時候,消息推送重復。如果處理消息的接口無法保證冪等,那么重復消費消息產生的影響可能會非常大 分布式環境中,有些接口是天然保證冪等性的,如查詢操作。有些對數據的修改是一個常量,并且無其他記錄和操作,那也可以說是具有冪等性的。其他情況下,所有涉及對數據的修改、狀態的變更就都有必要防止重復性操作的發生。通過間接的實現接口的冪等性來防止重復操作所帶來的影響,成為了一種有效的解決方案。 ### HTTP的冪等性 * **HTTP GET方法用于獲取資源,不應有副作用,所以是冪等的。** 比如:GET [http://www.bank.com/account/123456,不會改變資源的狀態,不論調用一次還是N次都沒有副作用。請注意,這里強調的是一次和N次具有相同的副作用,而不是每次GET的結果相同。GET](http://www.bank.com/account/123456,不會改變資源的狀態,不論調用一次還是N次都沒有副作用。請注意,這里強調的是一次和N次具有相同的副作用,而不是每次GET的結果相同。GET) [http://www.news.com/latest-news這個HTTP請求可能會每次得到不同的結果,但它本身并沒有產生任何副作用,因而是滿足冪等性的](http://www.news.com/latest-news這個HTTP請求可能會每次得到不同的結果,但它本身并沒有產生任何副作用,因而是滿足冪等性的) * **HTTP DELETE方法用于刪除資源,有副作用,但它應該滿足冪等性。** 比如:DELETE [http://www.forum.com/article/4231,調用一次和N次對系統產生的副作用是相同的,即刪掉id為4231的帖子;因此,調用者可以多次調用或刷新頁面而不必擔心引起錯誤](http://www.forum.com/article/4231,調用一次和N次對系統產生的副作用是相同的,即刪掉id為4231的帖子;因此,調用者可以多次調用或刷新頁面而不必擔心引起錯誤) * **HTTP POST方法用于創建資源,所對應的URI并非創建的資源本身,而是去執行創建動作的操作者,有副作用,不滿足冪等性。** 比如:POST [http://www.forum.com/articles的語義是在http://www.forum.com/articles下創建一篇帖子,HTTP響應中應包含帖子的創建狀態以及帖子的URI。兩次相同的POST請求會在服務器端創建兩份資源,它們具有不同的URI;所以,POST方法不具備冪等性](http://www.forum.com/articles的語義是在http://www.forum.com/articles下創建一篇帖子,HTTP響應中應包含帖子的創建狀態以及帖子的URI。兩次相同的POST請求會在服務器端創建兩份資源,它們具有不同的URI;所以,POST方法不具備冪等性) * **HTTP PUT方法用于創建或更新操作,所對應的URI是要創建或更新的資源本身,有副作用,它應該滿足冪等性。** 比如:PUT [http://www.forum/articles/4231的語義是創建或更新ID為4231的帖子。對同一URI進行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有冪等性](http://www.forum/articles/4231的語義是創建或更新ID為4231的帖子。對同一URI進行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有冪等性) ### 冪等解決方案 #### 1. MVCC 多版本并發控制,樂觀鎖的一種實現,在數據更新時需要去比較持有數據的版本號,版本號不一致的操作無法成功。例如博客點贊次數自動+1的接口: ``` public boolean addCount (Long id, Long version) ; ``` ``` update blogTable set count= count+1,version=version+1 where id=321 and version=123 ``` 每一個version只有一次執行成功的機會,一旦失敗必須重新獲取。 #### 2. 去重表: 利用數據庫表單的特性來實現冪等,常用的一個思路是在表上構建唯一性索引,保證某一類數據一旦執行完畢,后續同樣的請求再也無法成功寫入。 例子還是上述的博客點贊問題,要想防止一個人重復點贊,可以設計一張表,將博客id與用戶id綁定建立唯一索引,每當用戶點贊時就往表中寫入一條數據,這樣重復點贊的數據就無法寫入。 #### 3. TOKEN機制: 這種機制就比較重要了,適用范圍較廣,有多種不同的實現方式。其核心思想是為每一次操作生成一個唯一性的憑證,也就是token。一個token在操作的每一個階段只有一次執行權,一旦執行成功則保存執行結果。對重復的請求,返回同一個結果。 以電商平臺為例子,電商平臺上的訂單id就是最適合的token。當用戶下單時,會經歷多個環節,比如生成訂單,減庫存,減優惠券等等。 每一個環節執行時都先檢測一下該訂單id是否已經執行過這一步驟,對未執行的請求,執行操作并緩存結果,而對已經執行過的id,則直接返回之前的執行結果,不做任何操作。這樣可以在最大程度上避免操作的重復執行問題,緩存起來的執行結果也能用于事務的控制等。 * **多版本控制** 這種方法適合在更新的場景中,比如我們要更新商品的名字,這時我們就可以在更新的接口中增加一個版本號,來做冪等 ``` boolean updateGoodsName(int id,String newName,int version); ``` 在實現時可以如下 ``` update goods set name=#{newName},version=#{version} where id=#{id} and version<${version} ``` _**參考資料**_ [https://tech.meituan.com/distributed-system-mutually-exclusive-idempotence-cerberus-gtis.html](https://tech.meituan.com/distributed-system-mutually-exclusive-idempotence-cerberus-gtis.html)
                  <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>

                              哎呀哎呀视频在线观看