kok202
스프링 부트 - Shedlock

2019. 4. 9. 17:15[정리] 기능별 개념 정리/스프링 부트

클러스터 환경에서 @Scheduled 한번만 띄우기
공식 : https://github.com/lukas-krecan/ShedLock
참조 : https://www.baeldung.com/shedlock-spring

ShedLock 특징
1. [아파치 2.0 라이센스] 이다.
2. 클러스터 환경에서 하나의 노드만 스케줄링을 실행하도록 도와준다.
3. Annotation 방식으로 문제를 해결한다.

Quartz 를 대신할 수 있는 괜찮은 대안. Quartz 보다 가볍다.
Quartz 는 클러스터 안의 서버 노드들 중 스케줄링을 수행할 서버를 Quartz 가 고르고 방식이다.

반면 Shedlock 의 동작 방식은 다르다.
Shedlock에서는 모든 서버 노드들이 Scheduling을 수행하려고 시도한다.
각 노드들중 가장 먼저 스케줄링을 시도하는 노드는 스케줄링 하기전에 Lock을 걸고 들어간다.
이 후 다른 노드들이 스케줄링을 시도하지만 Lock이 걸려있으므로 호출이 되지 않고 이러한 호출을 차단하여 스케줄 메소드가 단 한번만 수행되도록 보장하는 방식이다.

사용법
1. 스케줄링을 사용하는 클래스에 @EnableSchedulerLock
2. 스케줄링을 수행하는 메소드에 @SchedulerLock
3. LockProvider 설정해주기


[추정]
LockProvider 이 뭐고, 필요한 이유
=> Shedlock 이 Lock 기능을 내부적으로 구현할 때, Database의 Lock 기능을 그대로 가져다 쓴 듯 하다.
=> 그러므로 Shedlock library 입장에서는 순수하게 Lock 만 걸고 들어가기 위한 전용 테이블이 필요하다. (README 를 읽어보면 사용자가 Shedlock을 사용하기 위해 Shedlock table을 만들어줘야하는 과정이 있다.)
=> Shedlock library 는 Shedlock table 에 접근하기 위한 Bean 객체 lockProvider 를 Autowired 해서 구현된다.
=> 그런데 Shedlock table 이 MongoDB 에 생성될지 MySQL 에 생성될지 Oracle에 생성될지 모른다.
=> 그러므로 lockProvider 을 사용자가 직접 빈 객체를 만들어줘야한다.