作為一個后端程序員,做后端接口的我的日常工作。其實我和大部分的后端程序員日常的工作一樣都是CRUD,最常用的就是一個controller,一個service,一個impl實現類,直到最近有被問起,你做的接口有冪等性嗎?一開始有點懵,后來去查了下,整理了下思路,做個隨筆。
冪等性的定義:對於后端業務系統來說 ,外部對於同一個操作的一次或者多次請求如果都能返回一樣的結果,那么我的接口就是擁有冪等性的。
在實際的開發中,可以根據不同的場景來使用不同的方式來做接口的冪等性處理。
場景:比如在一個支付場景 ,用戶確認了訂單,點擊支付去付款,可能由於手誤或者網絡原因,前端向后端發起了兩次請求支付的請求,如果接口沒有冪等性的保證,那么用戶會支付兩次,這顯然是不合理的。這種情況下我們有多種方式來保證接口的冪等性
方案1:我們的處理一般是給訂單加一個支付狀態,在付款之前會查詢這個訂單的支付狀態,如果這個訂單在之前的一次請求中已經支付,那么后面來的這個請求我們就不用去發起支付,直接返回用戶支付成功即可,這樣這個接口就可以說是有冪等性保證的。
文案2:就是我們在設計表的時候,有一張表來記錄用戶的支付記錄,這個支付記錄其中的一個字段是訂單ID,我們可以把這個訂單ID設置為唯一性的索引,如果用戶對同一個訂單發起了多交的支付,那么在插入這個表的時候必定會違反唯一性索引約束,這個時候我們也可以直接返回用戶支付成功而不用真的去二次付款。
場景3:使用全局的唯一ID,比如我們可以把用戶的ID和訂單ID和對訂單的操作類型生成一個唯一的ID,那么同一個用戶對一筆訂單的支付操作它的唯一ID一定是一樣的,我們在每一個請求進來的時候去查詢這個唯一 的ID,如果存在,那么這筆訂單是已經支付過的,我們也可以不用再次支付而直接返回用戶成功。
其實的我們的日常開發中,雖然不一定有接口冪等性的概念,但是我們在設計接口並且開發的過程中會不知不覺的對接口的冪等性做一定的保證,這次隨筆也只是把接口冪等性的概念加深一些,以便在日后接口的開發過程中更加注意接口性能和接口可用性的思考。更加高效,快樂的寫代碼