다중 인스턴스용 스케줄러(2) 각종 오류 해결과 리팩토링
문제1. 최신 서버가 unhealthy 하여 롤백 될 수 있음
현재 TaskHandler는 메인 서버의 상태가 어떻든 "최신 인스턴스" 라면 Redis에 해당 인스턴스 정보를 등록중이다.
헬스체크 로직을 추가해, healthy한 최신 서버만을 redis에 등록하도록 만들었다.
이제 최신 서버를 롤백 할 상황이 되어도 정상적으로 스케줄링을 이어갈 수 있다.
만약 healthcheck에 성공했는데도 롤백을 해야한다면, redis에서 key를 삭제하면 된다.
문제2. "특정 시간"에만 스케줄링을 진행하는 로직
현재 TaskHandler는 고정 주기만 지원하고 있고, 특정 시간(매일 자정, 6시정각 등등..)에 스케줄링을 진행하는 로직이 없다.
전략패턴을 사용해 고정 주기 실행과 특정 시간 실행 로직을 분리했다.
다음과 같이 return new SpecificTimeStrategy(실행시간) 을 입력하면 구현가능하도록 설계했다.(디폴트는 고정 주기)
TestTaskHandler는 매일 17시 30분에 한 번 실행된다.
다른 Task들과 마찬가지로 ScoredSortedSet에 Score로 실행시간을 가지며 예약되고,
ZoneId를 서울로 설정해서 한국 시간에 맞춰서 실행된다.
문제3. RedissonClient 의존성 문제
모든 구현부가 RedissonClient를 주입받고 있어서 나중에 다른 라이브러리로 교체할 때 번거로워진다.
TaskRepository와 RedissonRepository로 나누어, TaskHandler만을 위한 RedissonClient 연결부와 어플리케이션 전역에 사용할 수 있는 RedissonClient 연결부를 분리했다.
ISP와 DIP를 동시에 지킬 수 있었다.
그리고 RedissonRepository는 또 한번 KeyValueRepository와 LockRepository로 나누어서,
조금 더 높은 수준으로 추상화하였다.
최종 패키지 구조당 전체적으로 인터페이스를 의존하게 되었다!