주제
- 다중 어플리케이션 환경에서 스케줄 작업을 하기 위한 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
'# Back-End > Spring' 카테고리의 다른 글
스프링 배치 익혀보기 : 개념 정리 + 간단한 실습 (0) | 2023.08.03 |
---|---|
[JPA] 낙관적 락(Optimistic Lock), 비관적 락(Pessimistic Lock) (0) | 2023.04.22 |
Insert문 전에 발생하는 Select문을 제거해보자 (0) | 2023.04.15 |
JPA Batch Insert/Update를 적용하여 성능 향상하기 (0) | 2023.04.15 |
@Transactional 어노테이션을 이용한 트랜잭션 관리 (0) | 2023.04.08 |
[Spring Data JPA] Pageable을 이용한 Paging 조회 (0) | 2022.10.01 |
Logback과 slf4j 간단한 예제 (0) | 2022.09.02 |