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

          如何保證接口的冪等性?常見的實現(xiàn)方案有哪些?

          共 2044字,需瀏覽 5分鐘

           ·

          2021-08-26 09:34

          什么是冪等性

          冪等用于表示任意多次請求均與一次請求執(zhí)行的結果相同,也就是說對于一個接口而言,無論調(diào)用了多少次,最終得到的結果都是一樣的。

          如何保證接口的冪等性

          1、前端攔截

          2、使用數(shù)據(jù)庫實現(xiàn)冪等性

          3、使用 JVM 鎖實現(xiàn)冪等性

          4、使用分布式鎖實現(xiàn)冪等性

          保證接口的冪等性的實現(xiàn)過程

          1、前端攔截

          前端攔截是指通過 Web 站點的頁面進行請求攔截,比如在用戶點擊完“提交”按鈕后,我們可以把按鈕設置為不可用或者隱藏狀態(tài),避免用戶重復點擊。

          但前端攔截有一個致命的問題,如果是懂行的程序員或者黑客可以直接繞過頁面的 JS 執(zhí)行,直接模擬請求后端的接口,這樣的話,我們前端的這些攔截就不能生效了。因此除了前端攔截一部分正常的誤操作之外,后端的驗證必不可少。

          2、數(shù)據(jù)庫實現(xiàn)

          a、通過悲觀鎖來實現(xiàn)冪等性

          b、通過唯一索引來實現(xiàn)冪等性

          c、通過樂觀鎖來實現(xiàn)冪等性

          3. JVM 鎖實現(xiàn)

          JVM 鎖實現(xiàn)是指通過 JVM 提供的內(nèi)置鎖如 Lock 或者是 synchronized 來實現(xiàn)冪等性。使用 JVM 鎖來實現(xiàn)冪等性的一般流程為:首先通過 Lock 對代碼段進行加鎖操作,然后再判斷此訂單是否已經(jīng)被處理過,如果未處理則開啟事務執(zhí)行訂單處理,處理完成之后提交事務并釋放鎖,如圖所示


          JVM 鎖存在的最大問題在于,它只能應用于單機環(huán)境,因為 Lock 本身為單機鎖,所以它就不適應于分布式多機環(huán)境。

          4. 分布式鎖實現(xiàn)

          分布式鎖實現(xiàn)冪等性的邏輯是,在每次執(zhí)行方法之前先判斷是否可以獲取到分布式鎖,如果可以,則表示為第一次執(zhí)行方法,否則直接舍棄請求即可

          冪等性需要注意什么問題

          冪等性的實現(xiàn)與判斷需要消耗一定的資源,因此不應該給每個接口都增加冪等性判斷,要根據(jù)實際的業(yè)務情況和操作類型來進行區(qū)分。例如,我們在進行查詢操作和刪除操作時就無須進行冪等性判斷。查詢操作查一次和查多次的結果都是一致的,因此我們無須進行冪等性判斷。刪除操作也是一樣,刪除一次和刪除多次都是把相關的數(shù)據(jù)進行刪除(這里的刪除指的是條件刪除而不是刪除所有數(shù)據(jù)),因此也無須進行冪等性判斷。

          實現(xiàn)冪等性的關鍵步驟有哪些

          1、每個請求操作必須有唯一的 ID,而這個 ID 就是用來表示此業(yè)務是否被執(zhí)行過的關鍵憑證,例如,訂單支付業(yè)務的請求,就要使用訂單的 ID 作為冪等性驗證的 Key;

          2、每次執(zhí)行業(yè)務之前必須要先判斷此業(yè)務是否已經(jīng)被處理過;

          3、第一次業(yè)務處理完成之后,要把此業(yè)務處理的狀態(tài)進行保存,比如存儲到 Redis 中或者是數(shù)據(jù)庫中,這樣才能防止業(yè)務被重復處理。

          說一說數(shù)據(jù)庫實現(xiàn)冪等性的執(zhí)行細節(jié)

          1、通過悲觀鎖來實現(xiàn)冪等性

          2、通過唯一索引來實現(xiàn)冪等性

          3、通過樂觀鎖來實現(xiàn)冪等性

          ① 悲觀鎖

          使用悲觀鎖實現(xiàn)冪等性,一般是配合事務一起來實現(xiàn)。

          在實現(xiàn)的過程中需要注意以下兩個問題:

          a、如果使用的是 MySQL 數(shù)據(jù)庫,必須選用 innodb 存儲引擎,因為 innodb 支持事務;

          b、id 字段一定要是主鍵或者是唯一索引,不然會鎖表,影響其他業(yè)務執(zhí)行。

          比如:

          begin;  # 1.開始事務

          select * from table_name where id='xxx' for update; # 2.查詢狀態(tài)

          insert into table_name (id) values ('xxx'); # 3.添加操作

          update table_name set status='xxx'; # 4.更改操作

          commit; # 5.提交事務

          ② 唯一索引

          我們可以創(chuàng)建一個唯一索引的表來實現(xiàn)冪等性,在每次執(zhí)行業(yè)務之前,先執(zhí)行插入操作,因為唯一字段就是業(yè)務的 ID,因此如果重復插入的話會觸發(fā)唯一約束而導致插入失敗。在這種情況下(插入失?。┪覀兙涂梢耘卸ㄋ鼮橹貜吞峤坏恼埱?。比如:

          CREATE TABLE `table_name` (

            `id` int NOT NULL AUTO_INCREMENT,

            `orderid` varchar(32) NOT NULL DEFAULT '' COMMENT '唯一id',

            PRIMARY KEY (`id`),

            UNIQUE KEY `uq_orderid` (`orderid`) COMMENT '唯一約束'

          ) ENGINE=InnoDB;

          ③ 樂觀鎖

          樂觀鎖是指在執(zhí)行數(shù)據(jù)操作時(更改或添加)進行加鎖操作,其他時間不加鎖,因此相比于整個執(zhí)行過程都加鎖的悲觀鎖來說,它的執(zhí)行效率要高很多。

          樂觀鎖可以通過版本號來實現(xiàn),例如以下 SQL:

          update table_name set version=version+1 where version=0;


          瀏覽 59
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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片免费观看 | 三级片大香蕉 | 另类一区二区 | 国产午夜精品久久久久久久 |