pg_durable - PostgreSQL 내부에서 실행되는 지속 실행 워크플로우
1 hour ago
2
- pg_durable는 PostgreSQL 안에서 장기 실행·장애 허용 SQL 함수를 정의하고, 각 단계를 체크포인트로 저장해 충돌·재시작·실패 후에도 마지막 지속 체크포인트부터 재개하는 PostgreSQL 확장
- 상태를 이미 Postgres에 두는 팀이 cron 작업, 워커, 큐, 상태 테이블을 이어 붙이지 않고도 백그라운드 작업을 신뢰성 있게 실행하도록 설계
- 워크플로우는 SQL 단계의 그래프로 구성되며, ~>와 |=> 같은 조합형 연산자로 정의하고 df.start()로 시작해 인스턴스 ID를 반환받는 방식
- 함수 상태는 PostgreSQL에 영속 저장되며, 확장은 PostgreSQL 서버 내부에서 실행되어 Redis, Temporal 같은 외부 서비스나 별도 인프라가 필요 없음
- 벡터 임베딩 파이프라인, 대량 배치 수집·중복 제거·변환·게시, 예약 유지보수, 병렬 집계, 외부 API 기반 보강·분류·웹훅식 호출에 활용 가능
- 기존 방식의 문제로는 장기 작업 중 재시작 시 성공한 작업 재실행, 실패한 행이나 API 호출 이후 수동 정리, 긴 트랜잭션의 락·WAL 증가, 앱 계층 병렬 처리의 부분 실패 버그, 분산된 워크플로우 로직 등이 대상
- 아키텍처 변화는 워크플로우 정의를 SQL로 옮기고, 재시도 상태·진행 추적·체크포인트를 Postgres 안으로 이동하며, 운영 가시성을 df.instances 같은 PostgreSQL 테이블에서 확인하는 구조
- 단일 INSERT ... SELECT나 일반 SQL 한 문장으로 충분한 작업, 밀리초 미만 동기 요청 처리, 확장 설치나 백그라운드 워커 실행이 불가능한 환경, SQL 단계·분기·루프·HTTP 호출로 잘 매핑되지 않는 임의 애플리케이션 로직에는 부적합
- 태그 릴리스는 PostgreSQL 17·18용 Debian 패키지를 amd64 대상으로 제공하며, 패키지는 확장 라이브러리·control 파일·SQL 업그레이드 파일을 해당 PostgreSQL 설치 디렉터리에 설치
- 설치 후 shared_preload_libraries에 pg_durable을 추가하고 PostgreSQL을 재시작한 뒤 설정된 pg_durable 데이터베이스에서 CREATE EXTENSION pg_durable; 실행 필요
- 개발 환경 요구사항은 PostgreSQL 17 또는 18, Rust nightly, cargo-pgrx 0.16.1이며, GitHub Codespace와 VS Code Dev Container 구성을 제공
- 멀티 사용자 환경에서 CREATE EXTENSION pg_durable은 PUBLIC 권한을 부여하지 않으며, 관리자가 df.grant_usage('app_role')로 애플리케이션 역할에 명시적 접근 권한을 부여해야 함
- 행 수준 보안(RLS)은 각 사용자가 자신의 durable function 인스턴스와 노드만 보고 관리하도록 제한하며, pg_durable.worker_role의 기본값인 postgres 백그라운드 워커 역할은 모든 사용자 인스턴스 관리를 위해 슈퍼유저여야 함
- 내부 구조는 pgrx 기반 PostgreSQL 확장, SQL DSL, 백그라운드 워커, 오케스트레이션 런타임 duroxide, PostgreSQL 상태 제공자 duroxide-pg 조합
- 프로젝트 상태는 Preview이며, Microsoft로 텔레메트리를 보내지 않고 라이선스는 PostgreSQL License임
-
Homepage
-
개발자
- pg_durable - PostgreSQL 내부에서 실행되는 지속 실행 워크플로우