기록하는 습관

lock 오픈소스 (ShedLock, dLock) 본문

개발/Research

lock 오픈소스 (ShedLock, dLock)

로그뉴 2022. 7. 12. 15:50

ShedLock


같은 잡을 수행하는 각각 다른 서버에서의 인스턴스 A,B가 있을 때,

A,B 둘 중 하나가 수행하도록, 2개 이상의 서버에서 중복 수행을 방지하도록 Lock 을 걸게 하는 라이브러리로 shedlock 이 있다.

순서 관계없이 lock을 설정한 시간 동안은 하나의 인스턴스만 작동하도록 되어있다.

 

0) 지원하는 저장소

  • MySQL
  • Redis
  • MongoDB
  • In-Memory
  • ... (굉장히 다양함)

 

1) 3가지 속성

  1. name : 스케줄 작업의 고유 이름. 해당 문자열은 shedlock 테이블의 name 칼럼으로 PK 역할을 하게 되므로 스케줄 작업의 고유한 이름을 입력해야 함.
    1. name은 다른 scheduled 함수와 중복되지 않도록 고유하게 설정해야 함.
  2. lockAtLeastFor : 작업이 lock 되어야 할 최소한 시간. 짧은 작업일 경우 노드간의 클럭 차이로 중복 실행되는 것을 막기 위함.
    1. 작업이 지정된 시간보다 빨리 끝날 경우에도 지정된 시간까지 lock을 보장함.
    2. 작업이 지정된 시간을 초과하면 이 값은 무시됨.
    3. (ex. PT5M 은 최소 5분간 이 락을 홀드하겠다는 의미)
  3. lockAtMostFor : 작업을 진행 중인 노드가 소멸될 경우에도 lock 이 유지될 시간. 잠금을 유지해야 하는 최소 시간을 지정하는 속성.
    1. 해당 시간을 따로 입력하지 않으면 @EnableSchedulerLock의 디폴트 값으로 세팅 됨.
    2. 기본 설정에서 lock이 설정된 작업은 실행이 종료되면 즉시 lock이 해제됨. 하지만 예외 발생 등의 이유로 작업이 완료되지 못했을 때, lockAtMostFor를 설정하여 작업 실행 중 여부와 관계 없이 지정된 시간이 지난 후에는 강제로 락을 해제할 수 있음.
    3. 이 값은 반드시 실제 작업의 예상 소요 시간보다 길게 설정해야 함.

 

2) Lock 시간은 보통 실행 주기 -1 을 권장하고 있다.

몇 분의 실행시간이 걸리는 작업을 15분 단위로 진행한다고 하였을 때 권장되는 Lock시간은 14분으로, 실행시간이 짧은 경우 주기 내에 한 번 이상의 실행을 방지하기 위함.

 

3) 주의

lockAtLeastFor 값은 lockAtMostFor 값보다 크면 실행시 오류가 남. (컴파일 에러는 안남)

 

4) 결론

shedlock은 lock 정보를 저장할 테이블로 여러 저장소를 지원함.

shedlock을 사용하게 된다면 lock은 휘발성으로, 생성/삭제가 빈번하므로 Redis로 관리하는게 적합하다고 생각.

 

 

링크

 

기타

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

dLock


Interval lock을 얻기 위한 라이브러리로, 각각의 Interval Lock 구현은 프로세스와 스레드에 원자성을 보장한다.

예상대로 한 번에 하나의 프로세스 또는 스레드에 의해서만 잠금을 획득할 수 있다.

 

0) 지원하는 저장소

  • MySQL
  • Postgres

 

1) 3가지 속성

  1. name : 스케줄 작업의 고유 이름.
    1. name은 다른 scheduled 함수와 중복되지 않도록 고유하게 설정해야 함.
  2. owner
  3. lockFor : lock을 설정하고자 하는 시간. 해당 시간동안은 잠금이 보장된다.

 

 

2) 결론

dlock은 공식문서 (GitHub readme)에도 정보가 많이 없으며, 구글에도 자료가 shedlock에 비해 많이 없는 편.

속성도 lockFor 1개 지원하고 있어 상대적으로 shedlock에 비해 세밀한 옵션 조정이 힘들다고 생각.

dLock은 MySQL / Postgres 2개 지원하고 있기 때문에 dLock을 사용한다면 MySQL로 선택해야 함.

 

 

링크

 

 

비교


구분 shedlock Redisson
차이점
  • 만약 하나의 테스크가 하나의 노드에서 진행 중이라면 다른 노드는 테스크를 대기하지 않고 지나감.
  • 만약 하나의 테스크가 하나의 노드에서 진행 중이라면 다른 노드는 락을 획득할 때까지 대기한다.
    • pubsub을 이용하여 메세지가 올 때까지 대기하다가 락이 해제되었다는 메세지가 오면 대기를 풀고 다시 락 획득을 시도

'개발 > Research' 카테고리의 다른 글

Spark, Hadoop  (0) 2022.07.12
offset, cursor 기반 pagination  (0) 2022.07.12
AWS lambda (s3)  (0) 2022.07.12
DB 리서치 (S3, Mongo, Mysql - InnoDB, MyISAM, heap)  (0) 2022.07.12
Redis, Redisson, Jedis  (0) 2022.07.12
Comments