분산 작업 스케줄러(Distributed Job Scheduler)는 여러 노드에 분산된 작업(Job)을 지정된 시간 또는 조건에 따라 실행하고 관리하는 시스템이다. Cron, Quartz, Airflow 등이 대표적이다.
핵심 요구사항
기능 요구사항:
- 크론(Cron) 표현식 기반 반복 스케줄
- 단발성(one-time) 작업 예약
- 작업 우선순위 및 의존성(DAG)
- 실패 시 재시도 (Retry with backoff)
- 작업 실행 이력 조회
비기능 요구사항:
- 고가용성 (단일 장애점 없음)
- 정확히 한 번(at-least-once or exactly-once) 실행 보장
- 수평 확장 (노드 추가로 처리량 증가)
- 레이턴시: 예약 시간 ±1초 이내 실행
아키텍처
[API Server] → [Job Store (DB/Redis)] → [Scheduler Service]
↓
[Task Queue (Kafka/RQ)]
↓
[Worker Pool] → [Result Store]
Scheduler Service (HA):
- Leader Election (ZooKeeper/etcd)
- 리더만 스케줄링 트리거
- 팔로워는 리더 장애 시 즉시 승계
리더 선출 (Leader Election)
python
import etcd3
client = etcd3.client()
lease = client.lease(10) # 10초 TTL
def try_become_leader():
# 분산 락: 오직 1개 노드만 성공
success, _ = client.put_if_not_exists(
'/scheduler/leader',
'node-1',
lease=lease
)
if success:
print('I am the leader')
schedule_jobs()
else:
print('I am a follower, watching...')
watch_leader_key()
정확히 한 번 실행 보장
| 전략 | 방법 | 적합성 |
|---|
| DB 락 | 작업 실행 전 row lock | 단순, 낮은 처리량 |
| 멱등 작업 ID | 작업 실행 시 unique ID 기록 | 권장 |
| 분산 트랜잭션 | 2PC/SAGA | 복잡도 높음 |
| 메시지 중복 제거 | Kafka exactly-once | 메시지 큐 의존 |
관련 문서
- •[[message-queue|메시지 큐]]
- •[[leader-election|리더 선출]]
- •[[mq-design|분산 메시지 큐 설계]]