ShedLock을 이용한 스케줄 작업 중복 방지하기
# Back-End/Spring

ShedLock을 이용한 스케줄 작업 중복 방지하기

 

 

주제

  • 다중 어플리케이션 환경에서 스케줄 작업을 하기 위한 ShedLock을 알아본다

 


1. ShedLock에 대해 알아보기

1.1 ShedLock이란?

  • 스프링 부트 애플리케이션에서 분산된 환경에서 스케줄된 작업을 동시에 실행하지 않도록 막아주는 라이브러리
  • 이를 통해 여러 인스턴스 또는 클러스터에서 동시에 실행되어서는 안 되는 작업을 안전하게 스케줄링할 수 있음
  • ShedLock은 데이터베이스를 사용하여 작업 잠금을 관리하며, 다양한 데이터베이스를 지원

 

1.2 ShedLock의 3가지 속성

name : 잠금의 이름

lockAtMostFor : 최대 잠금 기간

lockAtLeastFor : 최소 잠금 기간

 

lockAtLeastFor의 설정이 너무 짧으면 작업이 충분한 시간 동안 Lock으로 보호되지 않을 수 있고, 너무 길면 다른 작업들이 오랜 시간 동안 기다려야 할 수 있습니다.

 

주로 해당 작업이 최소한으로 실행되어야 하는 시간을 고려하여 결정하고, 실행 시간이 일정하지 않거나 예상보다 빨리 완료될 가능성이 있다면 넉넉한 여유 시간을 설정하는게 좋습니다.

 

권장되는 주기는 작업 예상 분의 -1분 (ex: 10분 걸리는 작업은 최소 9분 Lock)

반대로 너무 길어도, 10초 안에 끝냈는데 1분을 최소 기다려야 할 수도..

 

적절한 설정 필요

 

 

2. ShedLock 설정하기

2.1 ShedLock

1. gradle dependency

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

 

2. ShedLockConfig

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class ShedLockConfig {

    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }

}

 

3. SpringBootApplication 설정 추가

@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
@EnableBatchProcessing
@SpringBootApplication
public class BatchServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(BatchServerApplication.class, args);
    }
}

 

4. SchedulerLock 설정

    @Scheduled(cron="0 * * * * *") // 1 min interval
    @SchedulerLock(
            name = JOB_WEEKLY_USE_RATE_STAT,
            lockAtLeastFor = "1m",
            lockAtMostFor = "10m"
    )
    public void schedulerForABC() {
        try {
            ...
        } catch (Exception e) {
            log.error(ErrorUtil.exceptionToString(e));
        }
    }

 

# 참고자료

  • ChatGPT
728x90