Springboot?定時任務(wù)分布式下冪等性解決方案
一、概述:
在分布式環(huán)境下,定時任務(wù)的冪等性問題需要考慮多個節(jié)點(diǎn)之間的數(shù)據(jù)一致性和事務(wù)處理。
一種解決方法是使用分布式鎖來保證同一時間只有一個節(jié)點(diǎn)能夠執(zhí)行該任務(wù)。具體實(shí)現(xiàn)可以使用Redis或Zookeeper等分布式協(xié)調(diào)工具提供的分布式鎖功能。
另一種解決方法是使用消息隊(duì)列來保證任務(wù)的冪等性。當(dāng)一個節(jié)點(diǎn)執(zhí)行任務(wù)時,先將任務(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)。
二、示例
如下圖,有三臺機(jī)器同時啟動定時任務(wù),將數(shù)據(jù)保存到Redis中,如何保證數(shù)據(jù)的冪等性?
解決方法–Redission分布式鎖:
- 在啟動定時任務(wù)時,獲取分布式鎖,保證只有一個線程進(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(); } }
上架商品時,判斷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();// 場次開始時間戳 long endTime = session.getEndTime().getTime();// 場次結(jié)束時間戳 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 定時任務(wù)分布式下冪等性如何解決的文章就介紹到這了,更多相關(guān)Springboot 冪等性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot?定時任務(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)分布式定時任務(wù)集群的代碼實(shí)例
相關(guān)文章
詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤
本篇文章主要介紹了淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)
在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。2017-04-04java servlet手機(jī)app訪問接口(二)短信驗(yàn)證
這篇文章主要介紹了java servlet手機(jī)app訪問接口(二),短信驗(yàn)證,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解
這篇文章主要介紹了 Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03