最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot接口冪等插件用法示例解析

 更新時(shí)間:2020年11月19日 10:23:47   作者:冷冷zz  
這篇文章主要介紹了Spring Boot接口冪等插件用法示例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

冪等概述

冪等性原本是數(shù)學(xué)上的概念,即使公式:f(x)=f(f(x)) 能夠成立的數(shù)學(xué)性質(zhì)。用在編程領(lǐng)域,則意為對(duì)同一個(gè)系統(tǒng),使用同樣的條件,一次請(qǐng)求和重復(fù)的多次請(qǐng)求對(duì)系統(tǒng)資源的影響是一致的。

冪等性是分布式系統(tǒng)設(shè)計(jì)中十分重要的概念,具有這一性質(zhì)的接口在設(shè)計(jì)時(shí)總是秉持這樣的一種理念:調(diào)用接口發(fā)生異常并且重復(fù)嘗試時(shí),總是會(huì)造成系統(tǒng)所無法承受的損失,所以必須阻止這種現(xiàn)象的發(fā)生。

實(shí)現(xiàn)冪等的方式很多,目前基于請(qǐng)求令牌機(jī)制適用范圍較廣。其核心思想是為每一次操作生成一個(gè)唯一性的憑證,也就是 token。一個(gè) token 在操作的每一個(gè)階段只有一次執(zhí)行權(quán),一旦執(zhí)行成功則保存執(zhí)行結(jié)果。對(duì)重復(fù)的請(qǐng)求,返回同一個(gè)結(jié)果(報(bào)錯(cuò))等。參考《冪等性淺談》

冪等處理實(shí)現(xiàn)加入依賴

復(fù)制代碼 代碼如下:
<dependency> <groupId>com.pig4cloud.plugin</groupId> <artifactId>idempotent-spring-boot-starter</artifactId> <version>0.0.1</version></dependency>

配置 Redis

鏈接默認(rèn)情況下,可以不配置。理論是支持 redisson-spring-boot-starter 全部配置

spring:
 redis:
  host: 127.0.0.1
  port: 6379

接口

@Idempotent(key = "#key", expireTime = 10, info = "請(qǐng)勿重復(fù)查詢")
@GetMapping("/test")
public String test(String key) {
  return "success";
}

測(cè)試10 個(gè)獨(dú)立線程請(qǐng)求

執(zhí)行查看結(jié)果,10 個(gè)請(qǐng)求只會(huì)有一個(gè)成功

查看后臺(tái)異常報(bào)錯(cuò),9 個(gè)異常報(bào)錯(cuò)滿足預(yù)期

idempotent 注解說明

  • key: 冪等操作的唯一標(biāo)識(shí),使用 spring el 表達(dá)式 用#來引用方法參數(shù) 。 可為空則取當(dāng)前 url + args 做請(qǐng)求的唯一標(biāo)識(shí)
  • expireTime: 有效期 默認(rèn):1 有效期要大于程序執(zhí)行時(shí)間,否則請(qǐng)求還是可能會(huì)進(jìn)來
  • timeUnit: 時(shí)間單位 默認(rèn):s (秒)
  • info: 冪等失敗提示信息,可自定義
  • delKey: 是否在業(yè)務(wù)完成后刪除 key true:刪除 false:不刪除

冪等處理設(shè)計(jì)原理

流程設(shè)計(jì)參考

1.請(qǐng)求開始前,根據(jù) key 查詢 查到結(jié)果:報(bào)錯(cuò) 未查到結(jié)果:存入 key-value-expireTime key=ip+url+args

2.請(qǐng)求結(jié)束后,直接刪除 key 不管 key 是否存在,直接刪除 是否刪除,可配置

3.expireTime 過期時(shí)間,防止一個(gè)請(qǐng)求卡死,會(huì)一直阻塞,超過過期時(shí)間,自動(dòng)刪除 過期時(shí)間要大于業(yè)務(wù)執(zhí)行時(shí)間,需要大概評(píng)估下;

4.此方案直接切的是接口請(qǐng)求層面。

5.過期時(shí)間需要大于業(yè)務(wù)執(zhí)行時(shí)間,否則業(yè)務(wù)請(qǐng)求 1 進(jìn)來還在執(zhí)行中,前端未做遮罩,或者用戶跳轉(zhuǎn)頁面后再回來做重復(fù)請(qǐng)求 2,在業(yè)務(wù)層面上看,結(jié)果依舊是不符合預(yù)期的。

6.建議 delKey = false。即使業(yè)務(wù)執(zhí)行完,也不刪除 key,強(qiáng)制鎖 expireTime 的時(shí)間。預(yù)防 5 的情況發(fā)生。

7.實(shí)現(xiàn)思路:同一個(gè)請(qǐng)求 ip 和接口,相同參數(shù)的請(qǐng)求,在 expireTime 內(nèi)多次請(qǐng)求,只允許成功一次。

8.頁面做遮罩,數(shù)據(jù)庫層面的唯一索引,先查詢?cè)偬砑?,等處理方式?yīng)該都處理下。

9.此注解只用于冪等,不用于鎖,100 個(gè)并發(fā)這種壓測(cè),會(huì)出現(xiàn)問題,在這種場景下也沒有意義,實(shí)際中用戶也不會(huì)出現(xiàn) 1s 或者 3s 內(nèi)手動(dòng)發(fā)送了 50 個(gè)或者 100 個(gè)重復(fù)請(qǐng)求,或者弱網(wǎng)下有 100 個(gè)重復(fù)請(qǐng)求;

總結(jié)

pig-mesh/pig

pig-mesh/idempotent-spring-boot-starter

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java并發(fā)編程示例(六):等待線程執(zhí)行終止

    Java并發(fā)編程示例(六):等待線程執(zhí)行終止

    這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務(wù),需要的朋友可以參考下
    2014-12-12
  • SpringBoot @Retryable注解使用

    SpringBoot @Retryable注解使用

    SpringBoot提供的@Retryable注解可以方便地實(shí)現(xiàn)方法的重試機(jī)制,可以在不侵入原有邏輯代碼的方式下,優(yōu)雅地實(shí)現(xiàn)重處理功能
    2024-12-12
  • 實(shí)例解析Java設(shè)計(jì)模式編程中的適配器模式使用

    實(shí)例解析Java設(shè)計(jì)模式編程中的適配器模式使用

    適配器模式的主要作用是在新接口和老接口之間進(jìn)行適配,通過將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,讓原本不兼容的接口可以合作無間,本文以實(shí)例解析Java設(shè)計(jì)模式編程中的適配器模式使用,需要的朋友可以參考下
    2016-05-05
  • java中Collections.sort排序詳解

    java中Collections.sort排序詳解

    這篇文章主要介紹了java中Collections.sort排序詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Android開發(fā)Activity管理工具類的操作方法

    Android開發(fā)Activity管理工具類的操作方法

    這篇文章主要介紹了Android開發(fā)Activity管理工具類,下面是一個(gè)完整的Activity管理工具類實(shí)現(xiàn),可以幫助你管理應(yīng)用中的所有Activity,方便一鍵退出應(yīng)用、獲取當(dāng)前Activity等操作,需要的朋友可以參考下
    2021-02-02
  • SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼

    SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼

    WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),本文主要介紹了SpringBoot整合Netty+Websocket實(shí)現(xiàn)消息推送的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 用代碼更新你的jar包

    用代碼更新你的jar包

    這篇文章主要介紹了用程序代碼更新com目錄下的所有文件到j(luò)ar的對(duì)應(yīng)目錄結(jié)構(gòu)中去,這樣可以做到自動(dòng)更新程序吧
    2014-01-01
  • Apache?SkyWalking?監(jiān)控?MySQL?Server?實(shí)戰(zhàn)解析

    Apache?SkyWalking?監(jiān)控?MySQL?Server?實(shí)戰(zhàn)解析

    這篇文章主要介紹了Apache?SkyWalking?監(jiān)控?MySQL?Server?實(shí)戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SpringBoot實(shí)戰(zhàn)之高效使用枚舉參數(shù)(原理篇)案例詳解

    SpringBoot實(shí)戰(zhàn)之高效使用枚舉參數(shù)(原理篇)案例詳解

    這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)之高效使用枚舉參數(shù)(原理篇)案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • SpringCloud FeignClient 超時(shí)設(shè)置

    SpringCloud FeignClient 超時(shí)設(shè)置

    FeignClient?默認(rèn)的超時(shí)時(shí)間可能不滿足你的需求,你可以通過幾種方式來自定義這些超時(shí)設(shè)置,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08

最新評(píng)論

汉阴县| 方城县| 万山特区| 承德县| 嘉鱼县| 习水县| 合山市| 内丘县| 铁岭县| 台中县| 营口市| 准格尔旗| 苍南县| 山东| 阿瓦提县| 元江| 乡宁县| 仁寿县| 太康县| 延寿县| 晋宁县| 繁峙县| 湘潭县| 新巴尔虎右旗| 古蔺县| 巴楚县| 集安市| 阿尔山市| 巫山县| 红安县| 扶绥县| 马鞍山市| 宜君县| 高雄市| 昌平区| 盐源县| 宁乡县| 宣城市| 白沙| 武夷山市| 鄂伦春自治旗|