国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式任務(wù)同步:在Spring中利用ShedLock

詳細(xì)討論了ShedLock的原理、配置步驟以及在實(shí)際項(xiàng)目中的應(yīng)用場(chǎng)景,為處理復(fù)雜的分布式系統(tǒng)任務(wù)提供了有力支持。

Spring ShedLock,分布式任務(wù),任務(wù)同步,定時(shí)任務(wù),多實(shí)例同步,并發(fā)控制

在當(dāng)今的分布式計(jì)算環(huán)境中,協(xié)調(diào)多個(gè)節(jié)點(diǎn)之間的任務(wù)執(zhí)行,確保它們?cè)跊](méi)有沖突或重復(fù)的情況下執(zhí)行,面臨著重大挑戰(zhàn)。無(wú)論是管理周期性任務(wù)、批處理過(guò)程還是關(guān)鍵系統(tǒng)任務(wù),保持同步和一致性對(duì)于無(wú)縫運(yùn)行至關(guān)重要。

問(wèn)題

假設(shè)我們需要按計(jì)劃運(yùn)行某些任務(wù),無(wú)論是數(shù)據(jù)庫(kù)清理任務(wù)還是某些數(shù)據(jù)生成任務(wù)。如果直接解決這個(gè)問(wèn)題,你可以使用Spring Framework中包含的`@Schedules`注解來(lái)解決這個(gè)問(wèn)題。該注解允許您按固定間隔或按cron計(jì)劃運(yùn)行代碼。但是,如果我們的服務(wù)實(shí)例數(shù)量超過(guò)一個(gè)怎么辦?在這種情況下,任務(wù)將在我們的每個(gè)服務(wù)實(shí)例上執(zhí)行。

ShedLock

ShedLock確保您的定時(shí)任務(wù)在同一時(shí)間最多只執(zhí)行一次。該庫(kù)通過(guò)外部存儲(chǔ)實(shí)現(xiàn)鎖。如果一個(gè)任務(wù)在一個(gè)實(shí)例上執(zhí)行,鎖被設(shè)置,所有其他實(shí)例不等待,并跳過(guò)任務(wù)的執(zhí)行。這實(shí)現(xiàn)了“最多執(zhí)行一次”。外部存儲(chǔ)可以是關(guān)系型數(shù)據(jù)庫(kù)(PostgreSQL、MySQL、Oracle等)通過(guò)JDBC工作,NoSQL(Mongo、Redis、DynamoDB)以及許多其他存儲(chǔ)(完整列表可以在項(xiàng)目頁(yè)面上找到)。

讓我們以使用PostgreSQL為例。首先,讓我們使用Docker啟動(dòng)數(shù)據(jù)庫(kù):

docker run -d -p 5432:5432 --name db \
    -e POSTGRES_USER=admin \
    -e POSTGRES_PASSWORD=password \
    -e POSTGRES_DB=demo \
    postgres:alpine

現(xiàn)在需要?jiǎng)?chuàng)建一個(gè)鎖表。在項(xiàng)目頁(yè)面上,我們需要找到針對(duì)PostgreSQL的SQL腳本:

CREATE TABLE shedlock(
    name VARCHAR(64) NOT NULL,
    lock_until TIMESTAMP NOT NULL,
    locked_at TIMESTAMP NOT NULL, 
    locked_by VARCHAR(255) NOT NULL, 
    PRIMARY KEY (name)
);

這里:

  • `name` - 鎖的唯一標(biāo)識(shí)符,通常表示被鎖定的任務(wù)或資源

  • `lock_until` - 指示持有鎖的結(jié)束時(shí)間的時(shí)間戳

  • `locked_at` - 指示獲取鎖的時(shí)間戳

  • `locked_by` - 獲取鎖的實(shí)體的標(biāo)識(shí)符(例如,應(yīng)用程序?qū)嵗?/p>

接下來(lái),創(chuàng)建一個(gè)Spring Boot項(xiàng)目并在`build.gradle`中添加必要的依賴項(xiàng):

implementation 'net.javacrumbs.shedlock:shedlock-spring:5.10.2'
implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:5.10.2'

現(xiàn)在描述配置:

@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")
public class ShedLockConfig {
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(
            JdbcTemplateLockProvider.Configuration.builder()
                    .withJdbcTemplate(new JdbcTemplate(dataSource))
                    .usingDbTime()
                    .build()
        );
    }
}

讓我們創(chuàng)建一個(gè)`ExampleTask`,每分鐘開始一次并執(zhí)行一些耗時(shí)動(dòng)作。為此,我們將使用`@Scheduled`注解:

@Service
public class ExampleTask {
    
    @Scheduled(cron = "0 * * ? * *")
    @SchedulerLock(name = "exampleTask", lockAtMostFor = "50s", lockAtLeastFor = "20s")
    public void scheduledTask() throws InterruptedException {
        System.out.println("task scheduled!");
        Thread.sleep(15000);
        System.out.println("task executed!");
    }
}

在這里,我們使用`Thread.sleep`模擬任務(wù)的執(zhí)行時(shí)間為15秒。一旦應(yīng)用程序啟動(dòng)并任務(wù)執(zhí)行開始,將在數(shù)據(jù)庫(kù)中插入一條記錄。

如果同時(shí),另一個(gè)應(yīng)用程序嘗試運(yùn)行任務(wù),它將無(wú)法獲取鎖并跳過(guò)任務(wù)執(zhí)行:

2024-02-18 08:08:50.057 DEBUG 45988 --- [   scheduling-1] n.j.s.core.DefaultLockingTaskExecutor    
: Not executing 'exampleTask'. It's locked.

在第一個(gè)應(yīng)用程序獲取鎖時(shí),會(huì)在數(shù)據(jù)庫(kù)中創(chuàng)建一條記錄,該記錄的鎖時(shí)間等于鎖設(shè)置中的`lockAtMostFor`。這個(gè)時(shí)間是必要的,以確保鎖不會(huì)永遠(yuǎn)設(shè)置,以防應(yīng)用程序崩潰或由于某種原因終止(例如,在Kubernetes中從一個(gè)節(jié)點(diǎn)驅(qū)逐Pod到另一個(gè)節(jié)點(diǎn))。成功執(zhí)行任務(wù)后,應(yīng)用程序?qū)⒏聰?shù)據(jù)庫(kù)條目,并將鎖定時(shí)間減少到當(dāng)前時(shí)間,但如果任務(wù)執(zhí)行時(shí)間非常短,則此值不能小于配置中的`lockAtLeastFor`。此值有助于最大程度地減少實(shí)例之間的時(shí)鐘不同步。它確保您的定時(shí)任務(wù)只被同時(shí)執(zhí)行一次。

結(jié)論

ShedLock是協(xié)調(diào)復(fù)雜Spring應(yīng)用程序中任務(wù)的有用工具。它確保任務(wù)順利運(yùn)行且僅運(yùn)行一次,即使跨多個(gè)實(shí)例也是如此。它易于設(shè)置,并為Spring應(yīng)用程序提供了可靠的任務(wù)處理能力,使其成為處理分布式系統(tǒng)的任何人都很有價(jià)值的工具。

項(xiàng)目代碼可在GitHub上找到。https://github.com/vshago/shedlock-demo文章來(lái)源地址http://www.zghlxwxcb.cn/article/714.html

到此這篇關(guān)于分布式任務(wù)同步:在Spring中利用ShedLock的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/714.html

如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系站長(zhǎng)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java中定時(shí)任務(wù) schedule 分布式下沒(méi)有鎖住 時(shí)間不同步 執(zhí)行滯后 相對(duì)時(shí)間 系統(tǒng)時(shí)間 spring springboot

    java.util.Timer計(jì)時(shí)器可以進(jìn)行:管理任務(wù)延遲執(zhí)行(“如1000ms后執(zhí)行任務(wù)”),及周期性執(zhí)行(“如每500ms執(zhí)行一次該任務(wù)”)。 但是,Timer存在一些缺陷,應(yīng)考慮使用ScheduledThreadPoolExecutor代替,Timer對(duì)調(diào)度的支持是基于絕對(duì)時(shí)間,而不是相對(duì)時(shí)間的,由此任務(wù)對(duì)系統(tǒng)時(shí)鐘的改變是敏感

    2024年02月10日
    瀏覽(27)
  • spring boot + xxl-job 分布式任務(wù)調(diào)度

    spring boot + xxl-job 分布式任務(wù)調(diào)度

    1、任務(wù)調(diào)度 1.1、什么是任務(wù)調(diào)度 我們可以先思考一下下面業(yè)務(wù)場(chǎng)景的解決方案: 某電商系統(tǒng)需要在每天上午10點(diǎn),下午3點(diǎn),晚上8點(diǎn)發(fā)放一批優(yōu)惠券。 某財(cái)務(wù)系統(tǒng)需要在每天上午10點(diǎn)前結(jié)算前一天的賬單數(shù)據(jù),統(tǒng)計(jì)匯總。 某電商平臺(tái)每天凌晨3點(diǎn),要對(duì)訂單中的無(wú)效訂單進(jìn)行

    2024年02月09日
    瀏覽(29)
  • Spring Boot 3 整合 xxl-job 實(shí)現(xiàn)分布式定時(shí)任務(wù)調(diào)度,結(jié)合 Docker 容器化部署(圖文指南)

    Spring Boot 3 整合 xxl-job 實(shí)現(xiàn)分布式定時(shí)任務(wù)調(diào)度,結(jié)合 Docker 容器化部署(圖文指南)

    xxl-job 是一個(gè)分布式任務(wù)調(diào)度平臺(tái),它提供了強(qiáng)大的任務(wù)調(diào)度和執(zhí)行能力,可以幫助我們實(shí)現(xiàn)任務(wù)的自動(dòng)化調(diào)度和執(zhí)行。本文將介紹如何在 Docker 環(huán)境下部署 xxl-job,并將其與 Spring Boot 進(jìn)行整合。 數(shù)據(jù)庫(kù)腳本:tables_xxl_job-2.4.0.sql Docker 鏡像地址: https://hub.docker.com/r/xuxueli/xxl-jo

    2024年02月06日
    瀏覽(34)
  • 分布式任務(wù)調(diào)度,定時(shí)任務(wù)的處理方案

    分布式任務(wù)調(diào)度,定時(shí)任務(wù)的處理方案

    適用場(chǎng)景: Spring 定時(shí)任務(wù)是 Spring 框架提供的一種輕量級(jí)的任務(wù)調(diào)度方案,它的特點(diǎn)是簡(jiǎn)單易用、輕量級(jí)。Spring 定時(shí)任務(wù)的執(zhí)行是在 單個(gè)節(jié)點(diǎn) 上進(jìn)行的,如果需要分布式任務(wù)調(diào)度,需要自己實(shí)現(xiàn)相應(yīng)的解決方案。 1.導(dǎo)入依賴版本自己控制 2.啟動(dòng)類加上@EnableScheduling 3.編寫業(yè)

    2023年04月14日
    瀏覽(44)
  • 分布式定時(shí)任務(wù)

    分布式定時(shí)任務(wù)

    本文引用了谷粒商城的課程 定時(shí)任務(wù)是我們系統(tǒng)里面經(jīng)常要用到的一些功能。如每天的支付訂單要與支付寶進(jìn)行對(duì)賬操作、每個(gè)月定期進(jìn)行財(cái)務(wù)匯總、在服務(wù)空閑時(shí)定時(shí)統(tǒng)計(jì)當(dāng)天所有信息數(shù)據(jù)等。 定時(shí)任務(wù)有個(gè)非常流行的框架Quartz和Java原生API的Timer類。Spring框架也可以支持

    2023年04月15日
    瀏覽(24)
  • 分布式、鎖、延時(shí)任務(wù)

    分布式、鎖、延時(shí)任務(wù)

    Redis分布式鎖-這一篇全了解(Redission實(shí)現(xiàn)分布式鎖完美方案) ls / / 下有哪些子節(jié)點(diǎn) get /zookeeper 查看某個(gè)子節(jié)點(diǎn)內(nèi)容 create /aa “test” delete /aa set /aa “test01” 模式 默認(rèn)創(chuàng)建永久 create -e 創(chuàng)建臨時(shí) create -e /zz “hello zz” create -s 創(chuàng)建 有序節(jié)點(diǎn) create -s -e 臨時(shí)序列化節(jié)點(diǎn) 一次性的監(jiān)

    2024年02月09日
    瀏覽(30)
  • 分布式任務(wù)調(diào)度系統(tǒng)分析

    分布式任務(wù)調(diào)度系統(tǒng)分析

    首先,我們來(lái)思考一些幾個(gè)業(yè)務(wù)場(chǎng)景: XX 信用卡中心,每月 28 日凌晨 1:00 到 3:00 需要完成全網(wǎng)用戶當(dāng)月的費(fèi)用清單的生成 XX 電商平臺(tái),需要每天上午 9:00 開始向會(huì)員推送送優(yōu)惠券使用提醒 XX 公司,需要定時(shí)執(zhí)行 Python 腳本,清理掉某文件服務(wù)系統(tǒng)中無(wú)效的 tmp 文件 最開始,

    2023年04月22日
    瀏覽(37)
  • 分布式運(yùn)用——rsync遠(yuǎn)程同步

    分布式運(yùn)用——rsync遠(yuǎn)程同步

    rsync(Remote Sync,遠(yuǎn)程同步)是由Andrew Tridgell于1996年開發(fā)的一款開源軟件。 是一個(gè)開源的快速備份工具,可以在不同主機(jī)之間鏡像同步整個(gè)目錄樹,支持增量備份,并保持鏈接和權(quán)限,且采用優(yōu)化的同步算法,傳輸前執(zhí)行壓縮,因此非常適用于異地備份、鏡像服務(wù)器等應(yīng)用。

    2024年02月12日
    瀏覽(31)
  • 分布式異步任務(wù)框架celery

    Celery是一個(gè)基于消息中間件的分布式任務(wù)隊(duì)列框架,專門用于處理異步任務(wù)。它允許生產(chǎn)者發(fā)送任務(wù)到消息隊(duì)列,而消費(fèi)者則負(fù)責(zé)處理這些任務(wù)。Celery的核心特性包括異步執(zhí)行、實(shí)時(shí)操作支持以及強(qiáng)大的調(diào)度能力,使其每天可以處理數(shù)以百萬(wàn)計(jì)的任務(wù)。 在Celery中,任務(wù)是以

    2024年04月10日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包