精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從零搭建開發腳手架 保證服務的冪等性和防止重復請求

開發 架構
前端同步阻塞按鈕置灰,用戶點擊“發布”按鈕后,在網絡請求沒有返回,或者超時之前,用戶都不可以繼續點擊“發布按鈕”,界面可以將按鈕置灰或者轉圈。
本文轉載自微信公眾號「Java大廠面試官」,作者laker。轉載本文請聯系Java大廠面試官公眾號。
  •  什么是冪等?
  • 重復請求原因
  • 解決方案
    • 方案一:前端同步阻塞按鈕置灰
    • 方案二:前后端搭配干活,預生成訂單號
    • 方案三:通用方案,鎖模式
  • 實現
    • 自定義注解限制重復提交
    • 自定義切面攔截過濾處理
    • 使用示例

什么是冪等?

多次執行的結果和一次執行的結果相同,例如查詢操作天然就是冪等的。

重復請求原因

我們以電商場景中的下單來舉例,造成下單重復一般有以下幾個原因:

  • 用戶手抖點快了,導致多次重復下單。
  • 網絡抖動導致失敗或者超時重傳,例如nginx、Fegin、RPC框架等

解決方案

方案一:前端同步阻塞按鈕置灰

前端同步阻塞按鈕置灰,用戶點擊“發布”按鈕后,在網絡請求沒有返回,或者超時之前,用戶都不可以繼續點擊“發布按鈕”,界面可以將按鈕置灰或者轉圈。

優點:實現成本極低

缺點:

  1. 只能防御用戶手抖的誤操作。
  2. 確防不住遠程調用的重試以及惡意重放。

方案二:前后端搭配干活,預生成訂單號

可以通過預先生成訂單號(在進入下單頁面的時候生成訂單號),然后利用數據庫中訂單號的唯一約束這個特性,避免重復寫入訂單。

時序圖如下:

細節如下:

訂單號生成時機

是在進入訂單頁面,而不是提交訂單的時候 。

訂單號生成規則

  • 小規模系統完全可以用MySQL的Sequence或者Redis來生成。大規模系統也可以采用類似雪花算法之類的方式分布式生成GUID。
  • 訂單號中最好包含一些品類、時間等信息,便于業務處理,它不能是一個單純自增的ID,否則別人很容易根據訂單號計算出你大致的銷量,所以訂單號的生產算法在保證不重復的前提下,一般都會加入很多業務規則在里面。

訂單號是否是主鍵

方式一:使用訂單號做主鍵

如果訂單號不是遞增的可能造成頻繁頁分裂,導致并發高的時候性能降低,所以要保證訂單號全局遞增。

方式二:有自增主鍵和訂單號列并設置唯一索引

因為訂單號不是主鍵,所以根據訂單號查詢會多一次回表操作,且如果訂單號不遞增二級訂單號索引也會有頁分裂。

訂單號可以由前端生成嗎

不可以,訂單號一定是在后端生成,后端生成可以保證全局唯一,且可以用于做安全認證,不是后端頒發的訂單號不予處理。

提交訂單的時候,一種是先拿著訂單號去查庫,讓業務代碼校驗是否存在,另一種是直接利用庫表主鍵唯一約束拋異常,這兩種處理方式哪種性能更好?

選后者,等查完庫確定不存在再插入的時候,可能數據已經變化了,訂單存在了,還是要拋異常,檢查意義不大。

方案三:通用方案,鎖模式

使用鎖來控制一段時間內的重復請求,注意: 鎖的粒度為用戶+業務。

請求流程如下:

  • 1.請求接口時,獲取一個鎖 鎖的粒度 :同一用戶的同一操作邏輯 鎖名稱規則:業務名稱+用戶ID
  • 2.給鎖設置過期時間10秒,防止業務邏輯執行錯誤,用戶一直被鎖住
  • 3.如果被鎖了,返回“正在處理,請勿重復提交”
  • 4.沒有被鎖,執行正常邏輯,在邏輯結束后,刪掉鎖

實現

針對方案三實現如下:

自定義注解限制重復提交

  1. @Target(ElementType.METHOD) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Inherited 
  5. public @interface RepeatSubmitLimit { 
  6.     /** 
  7.      * 業務key,例如下單業務 order 
  8.      */ 
  9.     String businessKey(); 
  10.  
  11.     /** 
  12.      * 業務參數,用于做更細粒度鎖,例如鎖到具體 訂單id #orderId 
  13.      */ 
  14.     String businessParam() default ""
  15.  
  16.     /** 
  17.      * 是否用戶隔離,默認啟用 
  18.      */ 
  19.     boolean userLimit() default true
  20.  
  21.     /** 
  22.      * 鎖時間 默認10s 
  23.      */ 
  24.     int time() default 10; 

自定義切面攔截過濾處理

  1. @Component 
  2. @Aspect 
  3. @Slf4j 
  4. public class LimitSubmitAspect { 
  5.     LFUCache<Object, Object> LFUCACHE = CacheUtil.newLFUCache(100, 60 * 1000); 
  6.  
  7.     @Pointcut("@annotation(RepeatSubmitLimit)"
  8.     private void pointcut() { 
  9.     } 
  10.  
  11.     @Around("pointcut()"
  12.     public Object handleSubmit(ProceedingJoinPoint joinPoint) throws Throwable { 
  13.  
  14.  
  15.         Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); 
  16.         //獲取注解信息 
  17.         RepeatSubmitLimit repeatSubmitLimit = method.getAnnotation(RepeatSubmitLimit.class); 
  18.         int limitTime = repeatSubmitLimit.time(); 
  19.         String key = getLockKey(joinPoint, repeatSubmitLimit); 
  20.         Object result = LFUCACHE.get(keyfalse); 
  21.         if (result != null) { 
  22.             throw new BusinessException("請勿重復訪問!"); 
  23.         } 
  24.         LFUCACHE.put(key, StpUtil.getLoginId(), limitTime * 1000); 
  25.         try { 
  26.             Object proceed = joinPoint.proceed(); 
  27.             return proceed; 
  28.         } catch (Throwable e) { 
  29.             log.error("Exception in {}.{}() with cause = \'{}\' and exception = \'{}\'", joinPoint.getSignature().getDeclaringTypeName(), 
  30.                     joinPoint.getSignature().getName(), e.getCause() != null ? e.getCause() : "NULL", e.getMessage(), e); 
  31.             throw e; 
  32.         } finally { 
  33.             LFUCACHE.remove(key); 
  34.         } 
  35.     } 
  36.  
  37.     private static final ParameterNameDiscoverer NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); 
  38.  
  39.     private static final ExpressionParser PARSER = new SpelExpressionParser(); 
  40.  
  41.     private String getLockKey(ProceedingJoinPoint joinPoint, RepeatSubmitLimit repeatSubmitLimit) { 
  42.         String businessKey = repeatSubmitLimit.businessKey(); 
  43.         boolean userLimit = repeatSubmitLimit.userLimit(); 
  44.         String businessParam = repeatSubmitLimit.businessParam(); 
  45.         if (userLimit) { 
  46.             businessKey = businessKey + ":" + StpUtil.getLoginId(); 
  47.         } 
  48.  
  49.         if (StrUtil.isNotBlank(businessParam)) { 
  50.             Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); 
  51.             EvaluationContext context = new MethodBasedEvaluationContext(null, method, joinPoint.getArgs(), NAME_DISCOVERER); 
  52.             String key = PARSER.parseExpression(businessParam).getValue(context, String.class); 
  53.             businessKey = businessKey + ":" + key
  54.         } 
  55.         return businessKey; 
  56.     } 

使用示例

  1. @RepeatSubmitLimit(businessKey = "tokenInfo", businessParam = "#name"
  2.   @GetMapping("/api/v1/tokenInfo"
  3.   public Response tokenInfo(String name) { 
  4.   } 

請求示例:http://localhost:8080/api/v1/tokenInfo?name=123

鎖粒度為:taokeninfo:1:123

防重效果:

  1.  code: "500"
  2.  msg: "請勿重復訪問!" 

參考:

后端存儲實踐課

 

責任編輯:武曉燕 來源: Java大廠面試官
相關推薦

2021-04-28 16:10:48

開發腳手架 Spring

2021-04-13 14:47:53

認證授權Java

2021-07-13 18:42:38

Spring Boot腳手架開發

2021-05-13 17:02:38

MDC腳手架日志

2021-02-19 22:43:50

開發腳手架Controller

2021-07-29 18:49:49

Spring開發腳手架

2020-08-19 08:55:47

Redis緩存數據庫

2021-04-20 19:24:16

腳手架 Java微信

2021-09-01 10:07:43

開發零搭建Groovy

2021-03-09 17:11:09

數據庫腳手架開發

2021-03-11 14:16:47

Spring Boo開發腳手架

2021-04-14 17:18:27

冪等性數據源MySQL

2016-08-10 14:59:41

前端Javascript工具

2021-01-07 05:34:07

腳手架JDK緩存

2023-11-21 17:36:04

OpenFeignSentinel

2023-09-01 15:27:31

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js

2014-08-15 09:36:06

2020-07-15 08:14:12

高并發
點贊
收藏

51CTO技術棧公眾號

欧美成人精品三级在线观看| 在线观看亚洲一区| 国外成人在线视频网站| 五月天婷婷久久| 欧美三级三级| 欧美大片在线观看一区| 九九九九免费视频| 1024国产在线| 成人小视频免费观看| 国产精品扒开腿做爽爽爽视频| 四虎影视1304t| 国产精品天天看天天狠| 欧美午夜片在线看| 日韩亚洲欧美视频| 秋霞影院午夜丰满少妇在线视频| av在线播放一区二区三区| 国产精品自产拍在线观看| 国产精品第二十页| 五月精品视频| 国产一区二区三区直播精品电影| 成人欧美精品一区二区| 天天综合在线观看| 日韩欧美主播在线| 800av在线免费观看| 爱久久·www| 91年精品国产| 国产不卡一区二区三区在线观看| 中国女人真人一级毛片| 亚洲欧美成人综合| 久久久免费高清电视剧观看| 色哟哟一一国产精品| 国产亚洲欧美日韩在线观看一区二区| 精品少妇一区二区三区在线视频| 999在线观看| 精品亚洲美女网站| 欧美体内谢she精2性欧美| 99热这里只有精品免费| 精品欧美色视频网站在线观看| 久久亚洲免费视频| 精品产品国产在线不卡| 人人妻人人澡人人爽精品日本| 经典一区二区三区| 成人h猎奇视频网站| 久久久久久少妇| 在线一区视频| 欧美精品xxx| 久久久久久av无码免费网站| 91精品国产成人观看| 最新国产成人av网站网址麻豆| 黄色正能量网站| 网红女主播少妇精品视频| 亚洲国产另类久久精品| 最近中文字幕无免费| 噜噜噜狠狠夜夜躁精品仙踪林| 精品福利在线导航| www国产视频| 欧美午夜18电影| 日韩精品免费在线播放| 野花社区视频在线观看| 欧洲亚洲成人| 亚洲香蕉成视频在线观看| 日韩人妻无码精品综合区| 精品国产99| 中文字幕亚洲综合久久筱田步美| 久久久久99精品成人| 97精品中文字幕| 久久国产精品影片| 久久久久人妻一区精品色欧美| 国产精品a级| 51色欧美片视频在线观看| 亚洲 欧美 中文字幕| 轻轻草成人在线| 91免费视频国产| 国产77777| 26uuu欧美| 五月天色一区| 天堂va在线| 精品久久久在线观看| 国产xxxxx视频| 日韩黄色三级| 精品国产123| 色一情一交一乱一区二区三区| 日韩av专区| 欧美激情视频一区二区三区不卡| 日本va欧美va国产激情| 日韩国产欧美在线播放| 亚洲999一在线观看www| 天堂网在线播放| 中文字幕av一区二区三区| 久久久久亚洲av无码专区喷水| 成人黄色动漫| 欧美在线free| 国产人成视频在线观看| 国内亚洲精品| 欧美极品少妇xxxxⅹ裸体艺术| 中文字幕在线播| 国产精品亚洲综合一区在线观看| 久久精品综合一区| 免费在线视频欧美| 狠狠综合久久av一区二区小说 | 欧美日韩精品专区| 亚洲欧洲日韩综合| 欧洲grand老妇人| 欧美激情小视频| 亚洲手机在线观看| proumb性欧美在线观看| 亚洲午夜在线观看| 天堂√中文最新版在线| 91精品国产综合久久精品图片| 久久久午夜精品福利内容| 99久久久久国产精品| 7777免费精品视频| 国产wwwxxx| 国产精品人人做人人爽人人添 | 国产社区精品视频| 91精品国产综合久久精品性色| 亚欧洲乱码视频| 国内精品亚洲| 亚洲自拍在线观看| 爱爱爱免费视频在线观看| 欧美日韩性生活视频| 麻豆传媒在线看| 日韩在线中文| 国产aⅴ夜夜欢一区二区三区 | 神马久久桃色视频| www亚洲视频| 99久久婷婷国产综合精品电影| 中文字幕第一页亚洲| 成人免费在线观看视频| 亚洲欧美国产精品va在线观看| 在线看成人av| 国产a级毛片一区| 蜜桃视频一区二区在线观看| 电影一区中文字幕| 久久久国产在线视频| 亚洲无码精品在线观看| 国产欧美日韩另类视频免费观看| av7777777| 欧美成人午夜77777| 久久久久久久香蕉网| 国产成人手机在线| 亚洲色图.com| 日本在线视频播放| 夜间精品视频| 亚洲一区二区三区毛片| 影音先锋男人资源在线| 日韩一级在线观看| 国产女人被狂躁到高潮小说| 国产美女视频一区| 国产精品视频一二三四区| 亚洲一区二区三区中文字幕在线观看 | 色综合一个色综合亚洲| 日本少妇高潮喷水xxxxxxx| 久久高清免费观看| 日韩欧美电影一区二区| 成人黄色免费观看| 久久视频在线免费观看| 亚洲第一天堂在线观看| 五月综合激情网| asian性开放少妇pics| 日韩电影免费一区| 亚洲欧洲精品在线| 精品国产亚洲一区二区在线观看| 九九久久久久久久久激情| 高清毛片aaaaaaaaa片| 欧美日韩国产一区二区| 欧美成人国产精品一区二区| 久久精品国产免费| av久久久久久| 日韩欧美ww| 国产成人中文字幕| 欧美jizz18性欧美| 精品国产乱码久久久久久牛牛| 欧美三日本三级少妇99| 91视频www| 8x8x成人免费视频| 欧美日一区二区在线观看 | 91视频婷婷| 女海盗2成人h版中文字幕| 国产亚洲欧美aaaa| 国产三级伦理片| 激情成人在线视频| a资源在线观看| 国产二区国产一区在线观看| 国产av天堂无码一区二区三区| 精品国产aⅴ| 丁香婷婷久久久综合精品国产| 免费观看一级欧美片| 综合激情国产一区| 人妻与黑人一区二区三区| 欧美亚洲一区二区在线| 久久久久久久黄色| 久久久一区二区| 亚洲精品永久视频| 国产欧美激情| 特级黄色录像片| 亚欧日韩另类中文欧美| 91久久久久久| 国模一区二区| 欧美激情中文字幕乱码免费| 国产二区在线播放| 精品国产乱码久久久久久免费| 69视频免费看| 午夜在线电影亚洲一区| 色老板免费视频| 久久亚洲二区三区| 折磨小男生性器羞耻的故事| 日韩国产高清影视| 久久国产精品网| 99久久婷婷| 欧美精品二区三区四区免费看视频| 精品一区视频| 国产精品一区二区三区成人| 中文字幕一区久| 欧美精品久久久久久久久久| 在线观看h片| 亚洲欧美日韩国产中文| 国产综合在线播放| 678五月天丁香亚洲综合网| 蜜臀99久久精品久久久久小说| 午夜视频一区在线观看| 青青草原在线免费观看| 亚洲欧美一区二区视频| 波多野结衣一二三四区| 久久久国产精华| www.超碰97| av在线不卡网| 中文在线观看免费视频| 国产精品一区二区三区四区| 五月天婷婷影视| 精品一区二区三区av| 国产精品久久a| 日韩电影在线看| 一区二区成人网| 日韩高清在线观看| 嫩草av久久伊人妇女超级a| 翔田千里一区二区| 成人免费观看视频在线观看| 国产亚洲激情| 91精品91久久久中77777老牛| 亚洲精品乱码| 久久久一本二本三本| 国产欧美在线| 美女福利视频在线| 天堂成人国产精品一区| 好男人www社区| 热久久免费视频| 岛国毛片在线播放| 黄页网站大全一区二区| 亚洲无在线观看| 国产美女视频91| gogo亚洲国模私拍人体| 成人在线一区二区三区| 999精品免费视频| 91丝袜高跟美女视频| 亚洲欧美va天堂人熟伦 | 久久久久亚洲av片无码下载蜜桃| 一区二区免费在线| 激情五月色婷婷| 一本一道综合狠狠老| 丰满人妻一区二区三区四区| 欧美日韩高清一区二区三区| 国产精品视频a| 精品成人在线观看| 久草福利在线| 日韩性xxxx爱| 国产白丝在线观看| 欧美伊久线香蕉线新在线| av成人在线观看| 亚洲va电影大全| 老司机精品在线| 色一情一区二区三区四区| 亚洲乱码电影| 少妇人妻大乳在线视频| 日韩极品在线观看| 中文av字幕在线观看| 成人激情小说网站| 亚洲av熟女国产一区二区性色| 亚洲欧美日韩一区二区| 日韩三级一区二区三区| 欧美亚洲国产怡红院影院| av无码精品一区二区三区宅噜噜| 亚洲国产精品一区二区久| av在线电影播放| 欧美精品www| 成人精品国产| 国产欧美日韩亚洲| 成人av国产| 蜜臀av色欲a片无码精品一区| 老司机精品导航| 久久久久99人妻一区二区三区| 久久久精品一品道一区| 日韩女优一区二区| 色哟哟在线观看一区二区三区| 国产精品羞羞答答在线| 日韩毛片中文字幕| 亚洲七七久久综合桃花剧情介绍| 51午夜精品视频| 亚洲精品在线a| 亚洲高清123| 99热精品在线| 国产精品igao网网址不卡| 久久伊99综合婷婷久久伊| 欧美国产精品一二三| 欧美自拍偷拍午夜视频| 三级在线观看网站| 久久视频在线播放| 国产精品99| 蜜桃视频日韩| 亚洲第一在线| 91性高潮久久久久久久| 亚洲国产精品激情在线观看| 日韩精品――中文字幕| 91精品国产91久久综合桃花| 国产精品麻豆一区二区三区 | 亚洲精品三区| 欧美一区2区三区4区公司二百| 尤物在线精品| 性生活在线视频| 中文字幕在线不卡一区二区三区| 神马久久久久久久| 亚洲国产又黄又爽女人高潮的| av免费在线观看网址| 国产乱肥老妇国产一区二 | 在线观看91久久久久久| 成人国产二区| 久久av免费观看| 日韩视频一区| av黄色一级片| 激情久久av一区av二区av三区| 成人福利小视频| 欧美美最猛性xxxxxx| 国产色99精品9i| 国产精品无码乱伦| 狠狠色狠狠色合久久伊人| 天堂资源在线视频| 欧美色图一区二区三区| av一本在线| 91精品免费久久久久久久久| 日本激情一区| 蜜臀一区二区三区精品免费视频 | 国产精品亚洲一区二区三区在线| 欧美乱大交做爰xxxⅹ小说| 欧美视频日韩视频在线观看| 国产特黄在线| 国产精品一区二区三| 91精品国产福利在线观看麻豆| 又色又爽又黄视频| 亚洲日本一区二区三区| 国产极品999| 欧美极品少妇xxxxⅹ免费视频| 蜜桃久久久久| 毛片av免费在线观看| 欧美激情综合五月色丁香 | 久久精品av麻豆的观看方式| 99在线视频免费| 欧美精品电影在线播放| 综合图区亚洲| 黄色国产精品一区二区三区| 免费亚洲网站| 精品视频第一页| 欧美一区二区免费| 国产丝袜在线观看视频| 久久99精品久久久久久久久久 | 国产人成在线视频| 国产精品视频播放| 亚洲欧美伊人| 朝桐光av一区二区三区| 欧美专区日韩专区| 97超碰资源站在线观看| 精品国产一区二区三区久久久久久| 噜噜爱69成人精品| 免费看特级毛片| 亚洲国产精品va在看黑人| 国产精品久久久久av电视剧| 欧美日韩一级在线| av在线不卡网| 91在线公开视频| 91精品国产高清| 日韩中文欧美| 小毛片在线观看| 欧美日韩亚洲综合一区| 欧美14一18处毛片| 日本不卡一区二区三区在线观看| 狠狠网亚洲精品| 制服.丝袜.亚洲.中文.综合懂色| 日韩中文字幕视频在线| 久久夜色精品国产噜噜av小说| 欧美大尺度做爰床戏| 亚洲高清在线精品| 999国产在线视频| 精品国产第一页| 极品少妇一区二区三区精品视频 | 蜜桃久久av| 欧美 日韩 国产 一区二区三区| 日韩av在线精品| 欧洲一区在线| 91插插插插插插插插| 五月天婷婷综合| 国产在线高清视频|