티스토리 뷰
사용 배경
프로젝트를 진행하면서 스프링 스케줄러를 사용해 주기적으로 이용자들에게 이메일을 보내는 기능을 구현했었다. Scale Out 시, 서버의 수만큼 해당 job이 반복되는 이슈가 발생했다. 해당 이슈를 해결하기 위해 ShedLock을 사용했다.
ShedLock
같은 잡을 수행하는 각각 다른 서버에서의 인스턴스 A,B가 있을 때 A, B 둘 중 하나가 수행하도록, 2개 이상의 서버에서 중복 수행을 방지하도록 Lock을 걸게하는 라이브러리
1. 테이블 생성
아래와 같이 lock을 저장하기위한 테이블을 만들어준다.
CREATE TABLE shedlock (
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
2. ShedLock Dependency 주입
implementation 'net.javacrumbs.shedlock:shedlock-spring:4.14.0'
implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.14.0'
3. Bean 주입
@Configuration
public class SchedulerConfiguration {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
}
4. Scheduler 설정
17일부터 25일까지 오전 7시 30분마다 실행하는 스케줄러이다.
@Component
@EnableSchedulerLock(defaultLockAtMostFor = "PT10S")
public class Scheduler {
@Scheduled(cron = "0 30 7 17-25 * *")
@SchedulerLock(name="SchedulerLock", lockAtMostForString = "PT10S", lockAtLeastForString = "PT10S")
public void sendDailyMessage() {
// do something
}
lockAtLeastForString
잠금을 유지해야하는 기간을 지정하는 속성이다. 예를들어 PT10S는 최소 10초간 이 lock을 들고있다는 것을 의미한다.
lockAtMostForString
잠금을 유지해야 하는 최소 시간을 지정하는 속성이다. 해당 스케줄러 노드가 다운되었을 때 언제까지 lock을 보장해주는지에 대한 최대 시간 설정이다.
여기서 lockAtLeastForString보다 lockAtMostForString을 더 작은 시간으로 설정하면 에러가 발생한다.
참고
'Spring' 카테고리의 다른 글
[JPA] 엔티티 설계 시 주의점 (0) | 2023.12.17 |
---|---|
[Spring] Lombok 사용시 주의사항 (0) | 2023.04.20 |