엘릭서의 잡 처리 프레임워크 Oban이 파이썬으로 이식되다

1 week ago 6

  • 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만으로 완전한 잡 큐를 구현한 깔끔하고 구조적인 파이썬 포트로, 엘릭서 사용자나 외부 인프라 없는 잡 시스템을 원하는 개발자에게 적합

Read Entire Article