개인프로젝트

성능 향상을 위한 공부1 - 스케쥴러 분산

ydin 2024. 2. 13. 21:18

프로젝트를 진행하면서 CPU가 새벽에 꺼지는 문제가 발생했었다. 프로젝트 진행 중에 원인이 무엇인지 알아보기는 했지만 단지 CPU 성능이 좋지 않아 트래픽을 견뎌내지 못한 것이라고 판단했지만, 찾아보니 성능을 향상하기 위한 기능이 많아서 관련 기술 찾아본 내용을 정리했다. 

 

찾아보니 위 기술들은 MSA 환경에서 대량 트래픽의 유량 제어를 위해 사용할 수 있는 옵션들이었다. 

 

스케줄러 분산

분산된 환경에서 스케쥴러를 관리하는 방법이 꽤 복잡하고 어려운 것 같다. 

 

상황

Scalling 중이고, Scheduler 있는 서버인 경우 Multiple Scheduler Instances 발생한다. 이때 고민할 수 있는 2가지는 다음과 같다.

 

  1. Quartz 같은 분산 스케줄링 프레임워크 사용해서 여러 인스턴스에서의 스케줄러 실행 조정하기
    1. 한 번에 하나의 스케쥴러 인스턴스만 실행하게 함 
  2. SchedLock으로 번에 하나의 스케줄러 인스턴스만 실행되게 있음
    1. SpringBoot에서 Scheduler에 Lock을 거는 방법
    2. 한 번에 하나의 스케줄러 인스턴스만 실행하게 하기
    3. 스케줄러 인스턴스 실행 시 공유 자원에 잠금을 획득해 작업을 진행한다. 락이 없는 인스턴스는 대기한다

 

ShedLock

예약된 작업에 대한 분산 잠금을 제공하는 Spring Boot 라이브러다. 

잠금 데이터베이스 테이블과의 조합을 사용해 분산 환경에서 실행되는 애플리케이션의 여러 인스턴스에서 예약된 작업이 한 번만 실행되도록 한다.

 

  • 예약된 작업 ShedLock에 등록
  • 가용 테이블 확인 : ShedLock이 Lock DB 테이블 사용할 수 있는지 확인
    • Lock DB 테이블 사용할 수 없는 경우 경고 기록하고 작업 건너뜀
    • 사용할 수 있으면 예약된 작업의 cron 표현식을 기반으로 시간 계산
  • 잠금 획득 시도 : 시간상 실행할 수 있는 예약된 작업인 경우, 테이블에 레코드를 삽입해 예약된 작업에 대한 잠금 획득 시도
    • 삽입 성공 : SchedLock이 잠금 획득 성공
    • 삽입 실패 : ShedLock 잠금 획득 실패, 경고 기록하고 작업 건너뜀
  • 작업 완료: ShedLock은 Lock DB 테이블에서 잠금 레코드 삭제하고 잠금을 해제한다

 

잠금이 해제되기 전에 잠금을 보유한 응용 프로그램 인스턴스가 다운되면 ShedLock은 지정한 시간 초과 기간 후에 잠금을 해재해 다른 인스턴스가 차단되지 않도록 한다. 

 

 

Reference

https://developer-been.tistory.com/34