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

搞了個線上故障,被老板罵了....

開發(fā) 架構
本文的案例有點特殊,訂單號是后端系統(tǒng)生成的,前后兩次請求無法區(qū)分重復狀態(tài),所以系統(tǒng)會創(chuàng)建兩條不同訂單 ID 記錄,繞過了「唯一索引約束」這個限制。

大家好,我是Tom哥。

前幾天跟一位小伙伴聊天,心情特別沮喪,剛被老板罵完.....

差點丟了飯碗,還好老板沒說 “滾”。

就今年這就業(yè)行情,滿眼都是淚哇。

小伙伴在一家初創(chuàng)公司,團隊規(guī)模很小,老板為了節(jié)省成本,也沒配置什么豪華陣容。

他的工作時間也不長,負責交易訂單,前幾天接到用戶投訴,「我的訂單列表」有多條一模一樣的訂單。

雖沒造成什么資損,但嚴重影響用戶體驗。

看到這里,有經驗的同學可能猜到,應該是接口沒做防重控制。

日常開發(fā)中,重復提交也是蠻常見問題。

比如:用戶提交一個表單,鼠標點的太快,正好前端又是個新兵蛋子,沒做任何控制,瞬間就會有多個請求發(fā)到后端系統(tǒng)。

如果后端同學也沒做兜底方案的話,悲劇就發(fā)生了。

常見的解決方案是借助數據庫自身的「唯一索引約束」,來保證數據的準確性,這種方案一般在插入場景用的多些。

變種方案可以考慮單獨創(chuàng)建一個防重表。

本文的案例有點特殊,訂單號是后端系統(tǒng)生成的,前后兩次請求無法區(qū)分重復狀態(tài),所以系統(tǒng)會創(chuàng)建兩條不同訂單 ID 記錄,繞過了「唯一索引約束」這個限制,這.....

另外,MySQL 性能也單薄了點,單機 QPS 在「千」維度,如果是面對一個高并發(fā)接口,性能也有點吃緊。

接下來,我們就來講下,借助 Redis 來實現(xiàn)接口防重復提交。

技術方案

首先,我們來看下整理的流程,如下圖所示:

圖片

大致步驟:

1、客戶端發(fā)送請求到服務端。

2、服務端接收請求,然后從請求參數中提取唯一標識。這個標識可以沒有什么特殊業(yè)務含義,client 端隨機生成即可。

3、服務端系統(tǒng)將唯一標識先嘗試寫入 Redis 緩存中,可以認為是加鎖操作。

4、加鎖失敗,說明請求還在處理,此次是重復請求,可以丟棄。

5、加鎖成功,繼續(xù)后面正常業(yè)務邏輯處理。

6、業(yè)務邏輯處理完成后,刪除加鎖的標記。

7、最后,將處理成功的結果返回給客戶端。

注意事項:

  • 重復提交場景一般都是在極短時間內,同時發(fā)送了多次請求(比如:頁面表單重復提交),我們只認第一次請求為有效請求。
  • 鎖用完后,要記得手動刪除。為了防止鎖沒有正常釋放,我們可以為鎖設置一個極短的過期時間(比如 10 秒)。

項目實戰(zhàn)

1、引入 redis 組件

實戰(zhàn)的項目采用 Spring Boot 搭建,這里需要引入 Redis 相關依賴。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

2、redis 變量配置

application.properties 配置文件中,添加redis相關服務配置。

spring.redis.host=127.0.0.1
spring.redis.port=6379

3、定義注解類

定義一個注解,配置在需要防重復的接口方法上,提高開發(fā)效率,同時降低代碼的耦合度。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented

public @interface IdempotentRule {

/**
* 業(yè)務自定義前綴
*/
String prefix() default "";

/**
* 業(yè)務重復標識
*/
String key() default "";
}

4、接口攔截器

上面定義了IdempotentRule?注解,需要通過攔截器對正常的業(yè)務方法做攔截,增加一些特殊邏輯處理。

@Aspect
@Component
@Slf4j
public class IdempotentAspect {

@Autowired
private RedisTemplate<String, Serializable> idempotentRedisTemplate;

@Around("execution(public * *(..)) && @annotation(com.onyone.idempotent.annotation.IdempotentRule)")
public Object limit(ProceedingJoinPoint pjp) {
MethodSignature signature = (MethodSignature) pjp.getSignature();


Object[] params = pjp.getArgs();
String[] paramNames = signature.getParameterNames();

Method method = signature.getMethod();
IdempotentRule idempotentRule = method.getAnnotation(IdempotentRule.class);
String key = idempotentRule.key();
String prefix = idempotentRule.prefix();

ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = new StandardEvaluationContext();
context.setVariable(paramNames[0], params[0]);
String repeatKey = (String) parser.parseExpression(key).getValue(context);

try {
// 先在緩存中做個標記
Boolean lockResult = idempotentRedisTemplate.opsForValue().setIfAbsent(prefix + repeatKey, "正在處理....", 20, TimeUnit.SECONDS);
if (lockResult) {
// 業(yè)務邏輯處理
return pjp.proceed();
} else {
throw new Exception("重復提交..................");
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
// 處理完成后,將標記刪除
idempotentRedisTemplate.delete(prefix + repeatKey);
}

return null;
}


}

這里,比較特殊的是提取請求的唯一標識,由于不同的業(yè)務請求唯一標識不一樣。

所以,這里采用 SPEL 表達式,將規(guī)則設置能力開放出去,由業(yè)務方自己定義,比如:

@IdempotentRule(key = "#userParam.cardNumber", prefix = "repeat_")。

攔截器根據 SPEL 表達式( 如 "#userParam.cardNumber")以及請求參數對象,計算當前請求唯一標識的值,

然后將值寫入 Redis 中,并設置過時間。

如果設置成功,說明是第一次請求,繼續(xù)下面的業(yè)務邏輯處理;否則,判定為重復請求,直接丟棄。

5、上層業(yè)務接口

@RestController
@RequestMapping("/user")
public class UserController {
/**
* 創(chuàng)建一個新的用戶
*/
@RequestMapping(value = "/create_user")
@IdempotentRule(key = "#userParam.cardNumber", prefix = "repeat_")
public String createUser(@RequestBody UserParam userParam) {
// 模擬業(yè)務處理

return "創(chuàng)建用戶成功!";
}
}
@Data
public class UserParam {
private String cardNumber;
private String name;
}

測試結果

1、構造客戶端請求,第一次處理成功。

圖片

2、 Redis 緩存中,能查到請求設置的鎖標記。

圖片

3、模擬重復,連續(xù)多次快速提交請求,請求會被攔截,并拋出異常。

圖片

責任編輯:姜華 來源: 微觀技術
相關推薦

2025-11-04 07:20:00

Vue前端開發(fā)

2022-03-23 18:00:34

循環(huán)CPU線程

2025-11-13 10:07:08

2022-07-28 14:22:50

元宇宙AI

2023-04-24 08:12:59

2024-09-10 14:50:00

2025-08-27 09:12:00

谷歌AI模型

2024-08-12 00:00:00

NPMCTOJavaScrip

2020-07-09 09:08:24

Java系統(tǒng)故障

2022-04-08 08:48:16

線上事故日志訂閱者

2009-10-28 09:14:43

員工分析軟件

2020-07-13 07:49:38

Kubernetes容器架構

2021-09-27 10:15:10

故障業(yè)務方電腦

2024-03-11 08:51:08

JVMSWAP內存

2020-04-13 17:17:28

MySQL8.0功能

2021-08-05 06:46:39

P0故障公司

2021-05-12 09:15:48

Facebook 開發(fā)技術

2021-04-13 17:17:08

線上故障交付

2019-06-27 22:23:56

谷歌Android開發(fā)者

2022-02-07 15:12:17

系統(tǒng)日志定位
點贊
收藏

51CTO技術棧公眾號

久久网站热最新地址| 日韩激情免费| 亚洲1区2区3区视频| 国产精品大全| 久久久久久久久久久久久av| 精品国产一区二区三区噜噜噜| 福利视频一区二区| 亚洲精品视频一二三| www.香蕉视频| 久久午夜精品一区二区| 久久夜色精品国产欧美乱| 国产情侣久久久久aⅴ免费| 亚洲精品动漫| 亚洲人成在线观看一区二区| 精品一区二区三区自拍图片区| 最近中文字幕免费在线观看| 国产精品v一区二区三区| 亚洲欧美日本另类| 杨幂一区二区国产精品| 另类激情视频| 亚洲一区二区不卡免费| 亚洲国产一区在线| 午夜成人免费影院| 国产精品一区二区在线播放| 国产成人91久久精品| 高h视频免费观看| 国产精品一区二区av交换| 日韩视频一区二区三区在线播放| 欧美一级黄色片视频| 在线观看午夜av| 国产欧美精品一区| 免费精品视频一区| 亚洲AV无码国产精品午夜字幕| 久久九九免费| 久久久噜噜噜久久| 亚洲最大的黄色网址| 精品理论电影| 精品亚洲精品福利线在观看| 91porn在线| 日韩美女在线| 欧美性生交片4| 国产黄色一级网站| caoprom在线| 亚洲欧美经典视频| 伊人久久大香线蕉成人综合网| 日韩a在线观看| 成人aa视频在线观看| 97碰碰视频| 99国产精品欲| 精品中文字幕一区二区小辣椒| 国产精品精品久久久| 久草视频一区二区| 亚洲永久视频| 4444欧美成人kkkk| 日韩精品1区2区| 亚洲麻豆视频| 性欧美激情精品| jizz国产免费| 99国产精品私拍| 午夜精品久久久久久99热软件| 精品无码人妻一区二区三区品| 欧美日本久久| 欧美激情一级精品国产| 国产精品嫩草影院俄罗斯| 欧美电影免费观看高清| 色一区av在线| 少妇视频一区二区| 亚洲美女视频| 久久久亚洲国产| 日韩aaaaaa| 午夜影院日韩| 国产福利视频一区二区| 中文字幕网址在线| 久久精品国产第一区二区三区| 国产九九精品视频| 国产一区二区三区成人| 国产在线精品一区在线观看麻豆| 91美女高潮出水| 不卡视频免费在线观看| 成人av在线影院| 久久久久se| 北岛玲一区二区三区| 国产精品灌醉下药二区| www.日本在线视频| 亚洲精品动漫| 欧美日韩国产小视频在线观看| 一级做a爱视频| 97se亚洲| 亚洲天堂网站在线观看视频| 5566中文字幕| 极品尤物久久久av免费看| 91po在线观看91精品国产性色| www.五月婷婷.com| 国产黑丝在线一区二区三区| 国产精品久久久久7777婷婷| 中文字幕第31页| 国产99久久精品| 欧美一卡2卡3卡4卡无卡免费观看水多多| 成人全视频高清免费观看| 亚洲视频 欧洲视频| 日本丰满少妇xxxx| 视频精品导航| 日韩精品中文字幕一区二区三区| 强迫凌虐淫辱の牝奴在线观看| 欧美日韩亚洲在线观看| 欧美成人精品一区| 中文字幕在线看人| 国产乱码一区二区三区| 免费成人av网站| 八戒八戒神马在线电影| 欧美色播在线播放| 天天久久综合网| 伊人久久综合影院| 欧美日韩福利视频| 中文无码精品一区二区三区| 国产91露脸合集magnet| 午夜精品一区二区三区四区| 2020国产在线| 91精品国产综合久久久久久漫画| 3d动漫精品啪啪一区二区下载| 亚洲精品网址| 国产精品91在线观看| 高h放荡受浪受bl| 国产精品第四页| av片中文字幕| 红杏视频成人| 欧美黑人极品猛少妇色xxxxx| 国产污视频网站| 成人av在线影院| 青青在线视频免费观看| 亚洲国产aⅴ精品一区二区三区| 亚洲精品视频网上网址在线观看 | 久久精品一区二区三区四区| 国产精品国产三级国产专区51| 日本免费成人| 在线观看欧美日韩| 亚洲永久精品在线观看| av成人动漫在线观看| 日本免费a视频| 在线播放一区二区精品视频| 欧美成人精品影院| 国产精品人人妻人人爽| 中文天堂在线一区| 波多野结衣天堂| 精品理论电影在线| 国产精品成人av在线| 蝌蚪视频在线播放| 色综合天天在线| 波多野结衣 在线| 宅男一区二区三区| 国产精品国产亚洲精品| 久青草国产97香蕉在线视频| 亚洲综合免费视频| 亚洲欧洲精品成人久久奇米网| 午夜国产一区二区三区| 日韩一区自拍| 91精品视频一区| 超碰人人在线| 日韩一卡二卡三卡国产欧美| 好吊日在线视频| 国产精品夜夜嗨| 国产精品va在线观看无码| 加勒比色综合久久久久久久久| 久久久久久69| 性插视频在线观看| 色av一区二区| 91麻豆精品久久毛片一级| 精品一区二区三区久久久| 在线电影看在线一区二区三区| 欧美日韩破处视频| 欧美成人午夜激情视频| 好吊色视频一区二区| 婷婷六月综合亚洲| 扒开jk护士狂揉免费| 日韩黄色小视频| 26uuu成人| 99国产精品久久一区二区三区| 97视频在线免费观看| 九一国产在线| 51午夜精品国产| 国产亚洲精品久久久久久无几年桃 | 色婷婷av一区二区三区丝袜美腿| 欧美一区二区三区……| av在线电影网| 日韩精品一区国产麻豆| 亚洲 欧美 日韩 综合| 欧美激情一区二区三区不卡| a级大片免费看| 亚洲专区一区| av电影一区二区三区| 精品人人人人| 国产精品视频在线播放| 色呦呦在线免费观看| 亚洲免费电影一区| 国产精品欧美激情在线| 精品国产乱码久久久久久虫虫漫画 | 亚洲午夜性刺激影院| 国产乱淫a∨片免费视频| 午夜精品福利一区二区蜜股av| 大胸美女被爆操| 成人精品视频.| 91极品尤物在线播放国产| 精品成人一区| 亚洲春色在线视频| 久久狠狠久久| 亚洲mm色国产网站| 亚洲成人看片| 久久久久久久久网站| 在线看av的网址| 日韩国产在线看| 国产肥老妇视频| 精品视频色一区| 亚洲黄色三级视频| 樱花草国产18久久久久| 蜜臀久久99精品久久久久久| 丰满岳乱妇一区二区三区 | 九一九一国产精品| 免费在线激情视频| 黄色亚洲在线| 日本免费在线视频观看| 精品视频99| 蜜桃视频成人| 精品亚洲免a| 91精品久久久久久蜜桃| 成人看片毛片免费播放器| 91av在线影院| 国产盗摄——sm在线视频| 久久久999精品免费| 不卡在线视频| 尤物yw午夜国产精品视频| 五月天久久久久久| 精品av久久707| 亚洲av永久纯肉无码精品动漫| 欧美色成人综合| 青青国产在线视频| 欧美视频13p| 亚洲免费在线观看av| 亚洲高清在线视频| 久久精品性爱视频| 一区二区三区四区av| 色婷婷在线视频观看| 国产精品大尺度| 成年人在线免费看片| 国产亚洲一区二区三区四区 | 奇米影视777在线欧美电影观看| 成人动漫在线视频| 亚洲大奶少妇| 99高清视频有精品视频| 试看120秒一区二区三区| 91在线中文字幕| 国产精品18| 99精品国产高清在线观看| 午夜视频在线观看精品中文| 北条麻妃高清一区| 18国产精品| 国产精品亚洲综合| 九九热播视频在线精品6| 国内精品**久久毛片app| 欧美自拍一区| 乱色588欧美| 精品理论电影在线| 国产福利片一区二区| 亚洲理论电影网| 青草网在线观看| 国产精品久久久亚洲一区| 国产一区视频免费观看| 美女视频第一区二区三区免费观看网站| 冲田杏梨av在线| 久久99精品久久久久久| 日本少妇一区二区三区| 成人黄色网址在线观看| 丰满少妇在线观看资源站| 国产网红主播福利一区二区| 日本裸体美女视频| 亚洲小说欧美激情另类| www.伊人久久| 欧美视频一区二区三区| 国产女人爽到高潮a毛片| 精品国产免费人成在线观看| 少妇性bbb搡bbb爽爽爽欧美| 亚洲最新av在线| 亚洲欧美成人影院| 91大神在线播放精品| 欧美日韩卡一| 精品亚洲第一| 国产精品成人a在线观看| 男女视频网站在线观看| 日本不卡一区二区三区| 日本中文字幕精品| 久久久亚洲欧洲日产国码αv| 中文字幕资源站| 精品二区三区线观看| 一本色道久久综合精品婷婷| 精品国产一区二区三区忘忧草| 国产尤物视频在线| 久久成人av网站| 欧美7777| 国产成人免费电影| 热久久天天拍国产| 国产美女主播在线| 久久精品国产网站| 国产伦精品一区二区三区妓女| 国产精品久久久久久久久久久免费看 | 久国产精品视频| 99久久久久久99| 四虎884aa成人精品| 欧美视频不卡中文| www.久久久久久久久久| 在线日韩欧美视频| gogo久久| 91影院未满十八岁禁止入内| 日韩88av| 国产又黄又大又粗视频| 国产九色精品成人porny | 爱情岛论坛亚洲首页入口章节| proumb性欧美在线观看| 国产精品国产精品88| 在线精品观看国产| 图片区 小说区 区 亚洲五月| 久久久www成人免费精品张筱雨| 日韩pacopacomama| 精品国产乱码久久久久软件| 重囗味另类老妇506070| 成人亚洲精品777777大片| 久久伊人蜜桃av一区二区| 久草视频免费播放| 欧美三级日韩三级国产三级| 日本成人一区| 91成人在线视频| 久久国产精品色av免费看| 丁香婷婷综合激情| 国产九色精品成人porny| 国产又粗又长又黄的视频| 欧美在线三级电影| 国产综合视频一区二区三区免费| 7777kkkk成人观看| 国产精品调教| 韩日视频在线观看| 成人免费看的视频| 免费在线观看国产精品| 91麻豆精品国产无毒不卡在线观看| 超碰在线影院| 国产精品视频久久久久| 欧美日韩国产在线观看网站| 久久久久久久少妇| 久久久精品免费观看| 黄色在线免费观看| 日韩精品在线视频| 成人性生活av| 日本不卡二区| 美洲天堂一区二卡三卡四卡视频| 少妇精品无码一区二区免费视频| 欧美性淫爽ww久久久久无| 第九色区av在线| 国产精品高潮在线| 日本一二区不卡| 日韩欧美国产片| 1024国产精品| www.久久久久久久久久| 国语自产在线不卡| 日韩黄色网络| 亚洲福利精品视频| 国产精品久久毛片| av免费观看网址| 欧美俄罗斯乱妇| 欧美自拍一区| 亚洲欧美另类动漫| 亚洲欧美一区二区三区久本道91| av网站免费大全| 国语对白做受69| 国产中文字幕一区二区三区| 亚洲国产成人va在线观看麻豆| 亚洲欧美一区二区三区国产精品| 精品国产av一区二区| 羞羞色国产精品| 精品国精品国产自在久国产应用| 日韩av片专区| 亚洲成人免费视| 国产区高清在线| 91最新国产视频| 免播放器亚洲| av黄色免费在线观看| 精品久久一二三区| 波多野结衣久久精品| 伊人久久大香线蕉av一区| 丁香激情综合五月| 国产精品第6页| 久久99久国产精品黄毛片入口| 亚洲丝袜啪啪| 国产精品igao网网址不卡| 天天做天天摸天天爽国产一区 | 国产香蕉久久精品综合网| 亚洲中文字幕在线观看| 欧美精品xxx| 不卡在线一区| 永久免费未满蜜桃| 欧美亚洲精品一区| 韩国日本一区| 伊人色综合影院| 久久天天做天天爱综合色|