Springboot?定時(shí)任務(wù)分布式下冪等性解決方案
一、概述:
在分布式環(huán)境下,定時(shí)任務(wù)的冪等性問題需要考慮多個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)一致性和事務(wù)處理。
一種解決方法是使用分布式鎖來保證同一時(shí)間只有一個(gè)節(jié)點(diǎn)能夠執(zhí)行該任務(wù)。具體實(shí)現(xiàn)可以使用Redis或Zookeeper等分布式協(xié)調(diào)工具提供的分布式鎖功能。
另一種解決方法是使用消息隊(duì)列來保證任務(wù)的冪等性。當(dāng)一個(gè)節(jié)點(diǎn)執(zhí)行任務(wù)時(shí),先將任務(wù)發(fā)送到消息隊(duì)列中,然后等待其他節(jié)點(diǎn)確認(rèn)任務(wù)已經(jīng)執(zhí)行完畢后再進(jìn)行后續(xù)操作。如果有節(jié)點(diǎn)出現(xiàn)故障或者網(wǎng)絡(luò)異常導(dǎo)致任務(wù)未能成功執(zhí)行,則可以重新發(fā)送任務(wù)并等待其他節(jié)點(diǎn)確認(rèn)。
二、示例
如下圖,有三臺(tái)機(jī)器同時(shí)啟動(dòng)定時(shí)任務(wù),將數(shù)據(jù)保存到Redis中,如何保證數(shù)據(jù)的冪等性?

解決方法–Redission分布式鎖:
- 在啟動(dòng)定時(shí)任務(wù)時(shí),獲取分布式鎖,保證只有一個(gè)線程進(jìn)入
- 在獲取鎖之后,鎖定10秒
- 然后執(zhí)行業(yè)務(wù)
- 業(yè)務(wù)執(zhí)行完成后,釋放分布式鎖
@Scheduled(cron = "*/10 * * * * ? ")
public void uploadSeckillSkuLatest3Days() {
// 重復(fù)上架無需處理
log.info("上架秒殺的商品...");
// 分布式鎖(冪等性)
RLock lock = redissonClient.getLock(SeckillConstant.UPLOAD_LOCK);
try {
lock.lock(10, TimeUnit.SECONDS);
// 上架最近三天需要秒殺的商品
seckillService.uploadSeckillSkuLatest3Days();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}上架商品時(shí),判斷redis是否有該商品,沒有才上架
Boolean hasKey = redisTemplate.hasKey(key);
if (!hasKey) {
}全部代碼
private void saveSessionInfos(List<SeckillSessionWithSkusTO> sessions) {
if (!CollectionUtils.isEmpty(sessions)) {
sessions.stream().forEach(session -> {
// 1.遍歷場次
long startTime = session.getStartTime().getTime();// 場次開始時(shí)間戳
long endTime = session.getEndTime().getTime();// 場次結(jié)束時(shí)間戳
String key = SeckillConstant.SESSION_CACHE_PREFIX + startTime + "_" + endTime;// 場次的key
// 2.判斷場次是否已上架(冪等性)
Boolean hasKey = redisTemplate.hasKey(key);
if (!hasKey) {
// 未上架
// 3.封裝場次信息
List<String> skuIds = session.getRelationSkus().stream()
.map(item -> item.getPromotionSessionId() + "_" + item.getSkuId().toString())
.collect(Collectors.toList());// skuId集合
// 4.上架
redisTemplate.opsForList().leftPushAll(key, skuIds);
}
});
}
}到此這篇關(guān)于Springboot 定時(shí)任務(wù)分布式下冪等性如何解決的文章就介紹到這了,更多相關(guān)Springboot 冪等性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot?定時(shí)任務(wù)分布式下冪等性解決方案
- SpringBoot Redis實(shí)現(xiàn)接口冪等性校驗(yàn)方法詳細(xì)講解
- SpringBoot關(guān)于自定義注解實(shí)現(xiàn)接口冪等性方式
- Springboot利用Redis實(shí)現(xiàn)接口冪等性攔截
- SpringBoot結(jié)合Redis實(shí)現(xiàn)接口冪等性的示例代碼
- SpringBoot處理接口冪等性的兩種方法詳解
- SpringBoot實(shí)現(xiàn)接口冪等性的4種方案
- SpringBoot與Quartz集成實(shí)現(xiàn)分布式定時(shí)任務(wù)集群的代碼實(shí)例
相關(guān)文章
詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤
本篇文章主要介紹了淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)
在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。2017-04-04
java servlet手機(jī)app訪問接口(二)短信驗(yàn)證
這篇文章主要介紹了java servlet手機(jī)app訪問接口(二),短信驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解
這篇文章主要介紹了 Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03

