-
Oban.py는 엘릭서의 잡 처리 프레임워크 Oban을 PostgreSQL 기반으로 파이썬에 이식한 버전으로, 데이터베이스만으로 잡을 삽입하고 처리할 수 있음
- 잡은 데이터베이스 트랜잭션 내에서 생성·롤백되며, 큐 관리·결과 저장·크론 스케줄링 등 다양한 기능을 지원
- 오픈소스 버전은 단일 스레드 asyncio 실행과 개별 삽입·확인 처리 등 제약이 있으나, Pro 버전은 병렬 처리·워크플로·스마트 동시성을 제공
- 내부 동작은 Insert → Notify → Fetch → Execute → Ack의 다섯 단계로 구성되며, PostgreSQL의 FOR UPDATE SKIP LOCKED를 활용해 동시성 충돌을 방지
- 리더 선출, 고아 잡 복구, 백오프 재시도 등도 데이터베이스 기반으로 수행되어 외부 브로커 없이 안정적 분산 처리를 가능하게 함
Oban.py 개요
-
Oban.py는 엘릭서의 Oban을 파이썬으로 포팅한 데이터베이스 기반 잡 처리 프레임워크
- 잡을 데이터베이스 트랜잭션 내에서 삽입·처리하며, 실패 시 전체 트랜잭션이 롤백됨
-
큐 제한, 완료 잡 저장, 결과 유지, 크론 스케줄링 등 다양한 제어 기능을 포함
- 두 가지 버전 제공
-
오픈소스(OSS) : 단일 스레드 asyncio 실행, 개별 삽입·확인, 단순 복구
-
Pro 버전: 프로세스 풀 기반 병렬 처리, 워크플로·릴레이·유니크 잡·스마트 동시성 지원
- OSS는 개인 프로젝트나 평가용으로 적합하며, 대규모 환경에는 Pro 버전 권장
잡 처리 경로
- 잡 삽입 후 oban_jobs 테이블에 state='available'로 저장되고, PostgreSQL의 NOTIFY로 각 노드에 알림 전송
- 각 노드의 Stager가 해당 큐를 감지해 Producer를 깨우고, Producer는 잡을 가져와 실행
- 잡 선택 시 SQL의 FOR UPDATE SKIP LOCKED를 사용해 중복 실행 없이 병렬 처리 가능
- 이미 잠긴 행은 건너뛰어 다른 프로듀서가 다른 잡을 즉시 가져올 수 있음
- 잡은 async task로 디스패치되며, 완료 시 콜백으로 acknowledgement 처리
- Pro 버전은 asyncio 대신 프로세스 풀 디스패처를 사용해 다중 코어 병렬 실행 지원
백그라운드 프로세스
-
리더 선출(Leader Election)
- PostgreSQL의 INSERT ... ON CONFLICT와 TTL 기반 임대(lease)로 리더를 결정
- 별도 합의 프로토콜 없이 단일 리더가 잡 정리·복구를 담당
-
Lifeline(고아 잡 복구)
- 실행 중인 잡이 일정 시간(rescue_after, 기본 5분) 이상 지속되면 available 상태로 복구
- Pro 버전은 프로듀서 생존 여부를 확인하지만, OSS는 시간 기반으로만 판단
-
Pruner(잡 정리)
- 완료·취소·폐기된 잡 중 max_age(기본 1일) 이상 지난 항목을 삭제
-
LIMIT으로 삭제 범위를 제한해 데이터베이스 부하 방지
재시도 및 백오프
- 잡이 예외를 발생시키면 Executor가 재시도 여부를 결정
- 최대 시도 횟수(max_attempts) 미만이면 재시도, 초과 시 폐기
- 기본 백오프는 지터(jitter) 가 포함된 지수형 증가
- 대량 실패 시 동시 재시도를 방지해 부하 급증(Thundering Herd) 완화
- 예: 1회차 약 17초, 5회차 약 47초, 10회차 약 17분 대기
- 워커 클래스는 backoff() 메서드로 사용자 정의 백오프 로직 구현 가능
주요 특징 및 평가
-
PostgreSQL이 핵심 역할 수행
-
FOR UPDATE SKIP LOCKED, LISTEN/NOTIFY, ON CONFLICT를 통해 동시성 제어·신호 전달·리더 선출을 모두 처리
- Redis나 외부 브로커 없이 단일 데이터베이스로 조정 계층 구성
-
비병렬적이지만 동시성 지원
- asyncio 기반으로 I/O 바운드 작업에 적합, CPU 바운드 작업은 Pro 버전 권장
-
코드 구조 명확성
- 일관된 네이밍과 분리된 책임 구조로 읽기 쉬운 코드베이스
-
OSS와 Pro의 역할 분리 명확
- OSS는 실험·소규모용, Pro는 대규모·고성능 환경용
-
결론: PostgreSQL만으로 완전한 잡 큐를 구현한 깔끔하고 구조적인 파이썬 포트로, 엘릭서 사용자나 외부 인프라 없는 잡 시스템을 원하는 개발자에게 적합