Java 에서의 스케쥴링, 어떻게 가능한 것인가?
· 20 min read
우리는 Spring 에서 스케쥴링 잡을 수행하기 위해, @Scheduled
라는 어노테이션을 사용하곤 한다.
@Scheduled(cron = "0/5 * * * * ?")
public void scheduledCron() {
// do something...
}
@Scheduled(fixedDelay = 1000)
public void scheduledfixed() {
// do something...
}
그런데 상식적으로 생각을 해보면, 정말로 Java가 1ms 단위까지 세밀하게 스케쥴링을 할 수 있을까? 라는 의문이 들 수 있다.
Java 이야기는 아니지만 Redis/MongoDB 같은 데이터베이스의 TTL 또한 ms 단위로 넣을 수 있지만 실제로는 ms 단위로 데이터 체킹 및 삭제가 이뤄지지 않기도 한다. Redis는 기본적으로 사용자가 데이터 조회 시도 전 까지 삭제를 수행하지 않고, (주기적으로 샘플링하여 체킹하고 지우는 작업이 존재하지만, 이는 보조적인 역할이다.) MongoDB는 TTL Monitor 스레드가 주기적으로 데이터를 확인하여 제거한다. (ttlMonitorSleepSecs
파라미터에 따라 다르지만, 디폴트는 1분이다. 즉, 최대 59초까지는 데이터가 안 지워질 수 있다.)
결국, 수많은 상용 기술들은