개념 정리/Spring

[Spring] ShedLock을 통해 서버간 스케줄 중복 수행 방지

쇼티드 2023. 7. 29. 02:09
728x90
반응형

꽤 스케일이 큰 프로젝트를 하다보면 서버를 여러개 열게 된다.

알림을 보내거나 이메일을 보내는 작업 등과 같이

여러개의 서버를 통해 같은  이벤트를 수행하려다 이를 중복 수행하게 되는 경우가 있다.

이런 경우를 방지하기 위해 스프링에서는 @SchedulerLock 어노테이션을 지원해준다.

https://github.com/lukas-krecan/ShedLock

 

GitHub - lukas-krecan/ShedLock: Distributed lock for your scheduled tasks

Distributed lock for your scheduled tasks. Contribute to lukas-krecan/ShedLock development by creating an account on GitHub.

github.com

https://www.baeldung.com/shedlock-spring

 

1. Dedpendency 추가

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

 

2. ShedLock 테이블 생성

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

 

3. Configuration을 통해 Bean 주입

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

 

4. ScheduledLock 설정

@Scheduled(cron = "0 0/10 17-01 * * *")
    @SchedulerLock(
            name = "scheduledLockTest1",
            lockAtLeastFor = "PT30S",
            lockAtMostFor = "PT30S")
    public void scheduledTest() {
    	//코드
    }

name : SchedulerLock을 구분하기 위해 이름을 설정한다.

lockAtLeastFor : 잠금을 유지하는 최소 시간을 설정해준다. PT30S는 30초, PT30M은 30분을 의미한다.

lockAtMostFor : 해당 스케줄러 노드에 문제가 생겨 다운되었을 때 얼마나 lock을 할지에 대한 최대 시간이다.

lockAtMostForlockAtLeastFor 보다 더 작다면 에러가 발생한다.

 

728x90
반응형