피드로 돌아가기
Dev.toDatabase
원문 읽기
인프라 추가 없이 PostgreSQL로 분당 10K Job 스케줄링 구현
PostgreSQL Advisory Locks for Distributed Job Scheduling
AI 요약
Context
분산 Job 스케줄링 구현을 위해 Redis나 SQS 같은 별도 인프라를 도입함에 따른 운영 복잡성 증가. 데이터베이스 연결을 이미 보유한 환경에서 네트워크 홉으로 인한 지연 시간 발생 및 관리 포인트 증가가 병목 지점으로 작용.
Technical Solution
pg_try_advisory_xact_lock기반의 Transactional Lock을 채택하여 애플리케이션 크래시 시 Lock 누수 원천 차단FOR UPDATE SKIP LOCKED구문을 결합하여 Row 수준의 경합을 회피하고 작업 처리 효율 극대화bigint해싱 및 2-integer 복합 키 구조를 통한 Lock Namespace 설계로 식별자 충돌 가능성 제어- PgBouncer Transaction 모드에서 Session Lock이 유실되는 문제를 해결하기 위해 Worker 전용 Session Pool 분리 운영
- Non-blocking 방식의
_try_변형 함수를 사용하여 워커가 경합 중인 Job을 대기 없이 건너뛰는 구조 설계
실천 포인트
1. PgBouncer 사용 시 Session Lock 대신 Transactional Lock을 우선 검토할 것
2. Worker 전용 Connection Pool을 분리하여 일반 트래픽과 Job 처리 간 간섭을 차단할 것
3. 10만 개 이상의 Distinct Lock ID 사용 시 단순 해싱 대신 Namespace 기반 복합 키를 적용할 것
4. `SKIP LOCKED`를 통해 Row-level 경합을 최소화하고 있는지 확인할 것