- PostgreSQL 내부에서 재시도, 스케줄링, 병렬 fan-out, 조건 분기를 작은 SQL DSL만으로 처리하는 durable function 확장
- 컨테이너나 외부 서비스 없이 Postgres와 백그라운드 워커만으로 동작
- 모든 단계가 PostgreSQL에 상태를 체크포인트로 기록해 크래시·재시작·연결 끊김에도 중단 지점부터 재개
- 큐 관리, 상태 추적, 크래시 복구, 단계 조정, 재시도를 직접 구현할 필요 없이 SQL만 작성하면 오케스트레이션 엔진이 처리
- 직접 구현 시 300줄 이상의 보일러플레이트가 필요한 작업을 단일 DSL 호출로 대체, PostgreSQL 17에서 오픈소스로 즉시 사용 가능
개요와 핵심 가치
- Postgres에 내장된 크래시 방지(crash-proof) durable function으로, 재시도·스케줄링·병렬 fan-out·조건 분기를 작은 SQL DSL로 오케스트레이션
- 추가 인프라 없이 Postgres + 백그라운드 워커만으로 동작, 별도 컨테이너나 외부 서비스 불필요
- 큐 관리·상태 추적·크래시 복구·단계 조정·재시도를 모두 담당하는 오케스트레이션 엔진 역할, 사용자는 SQL만 작성
pg_durable 없이 구현할 경우
- 3개 집계를 병렬 실행 후 대시보드를 갱신하면서 재시도와 크래시 복구까지 넣으려면 300줄 이상의 보일러플레이트 필요
- 직접 구축해야 하는 항목: 큐 설정 및 구성, 워커 관리 및 폴링, 메시지 처리 및 상태 추적, 에러 처리 및 재시도, 수동 단계 조정
- 예시 코드에는
job_queue,job_results,job_state,workflow_steps,step_variables,scheduled_jobs등 다수의 상태 테이블과 폴링 워커, 워크플로 진행, 크래시 복구, 병렬 실행 코디네이터, 변수 전달, 스케줄링, 정리 함수가 포함 - 스케줄링의
next_run계산에는 외부 cron 파서 라이브러리가 추가로 요구됨
pg_durable로 구현할 경우
- 동일한 병렬 집계 + 대시보드 갱신을 단일
df.start()호출로 표현,&연산자로 fan-out 후~>로 join 처리- 예: 3개 쿼리가 병렬로 분기된 뒤
refresh dashboard단계로 합류해 결과 생성 - 라이브 실행 예시에서 3단계 병렬 실행 후 join → dashboard ready까지 1.9초만에 durable하게 완료
- 예: 3개 쿼리가 병렬로 분기된 뒤
- 큐 관리, 상태 추적, 크래시 복구, 단계 조정, 재시도를 모두 pg_durable이 처리
주요 특징
-
Durable by default
- 모든 단계가 PostgreSQL에 상태를 체크포인트로 기록, 크래시·재시작·연결 끊김에도 워크플로 생존
- 중단된 지점에서 정확히 그대로 재개
-
Automatic retries
- flaky 작업을 위한 재시도 로직 내장, 단계 실패 시 해당 단계만 재시도되고 나머지 워크플로는 계속 진행
- 수동 에러 처리 코드 불필요
-
Full observability in SQL
- 모든 워크플로 상태가 Postgres 테이블에 저장, 실행 이력 조회·단계 출력 확인·실패 디버깅을 표준 SQL로 수행
- 외부 대시보드 불필요
-
Parallel execution
&연산자 또는df.join()으로 독립 작업을 fan-out, 집계·API 호출·ETL 단계를 자동 조정과 함께 동시 실행
만들 수 있는 패턴
-
ETL Pipelines
- cleanup → transform → load를 순차 보장과 함께 연결, 각 단계가 이전 단계를 대기하고 실패 시 파이프라인을 깔끔히 중단 (
~> sequence,|=> variables)
- cleanup → transform → load를 순차 보장과 함께 연결, 각 단계가 이전 단계를 대기하고 실패 시 파이프라인을 깔끔히 중단 (
-
Parallel Aggregation
- 사용자 수 집계 + 매출 합산 + 재고 확인을 동시에 수행, 여러 쿼리로 fan-out 후 전체 완료 대기 (
&,df.join())
- 사용자 수 집계 + 매출 합산 + 재고 확인을 동시에 수행, 여러 쿼리로 fan-out 후 전체 완료 대기 (
-
Order Processing
- 주문 ID를 캡처해 검증·처리·완료 단계로 전달, 단계 간 변수가 자동 흐름 (
|=> capture,$var substitution,df.sleep())
- 주문 ID를 캡처해 검증·처리·완료 단계로 전달, 단계 간 변수가 자동 흐름 (
-
Scheduled Jobs
- cron 스케줄로 API 폴링·레코드 아카이브·데이터 동기화, 루프가 영구 실행되며 재시작에도 생존 (
@> loop,df.wait_for_schedule())
- cron 스케줄로 API 폴링·레코드 아카이브·데이터 동기화, 루프가 영구 실행되며 재시작에도 생존 (
-
Conditional Branching
- 대기 작업·행 수·플래그를 확인해 처리 또는 건너뛰기 분기, 분기 로직이 애플리케이션이 아닌 SQL에 위치 (
df.if(),?> conditional)
- 대기 작업·행 수·플래그를 확인해 처리 또는 건너뛰기 분기, 분기 로직이 애플리케이션이 아닌 SQL에 위치 (
-
Multi-step Validation
- 데이터 가져오기 → 스키마 검증 → 비즈니스 규칙 확인 → 승인/거부, 각 단계가 체크포인트되어 실패해도 진행 상황 유실 없음
-
Database Maintenance
- autovacuum 차단 요소·테이블 bloat·wraparound 위험을 탐지해 검토용으로 노출, 승인 대기 후 재시작에도 durable하게 교정 (
?> conditional,df.wait_for_signal(),@> loop)
- autovacuum 차단 요소·테이블 bloat·wraparound 위험을 탐지해 검토용으로 노출, 승인 대기 후 재시작에도 durable하게 교정 (
-
Azure Functions & HTTP
df.http()로 Azure Functions나 허용된 HTTPS 엔드포인트를 SQL에서 직접 호출, 문서 청킹·행 보강·레코드 분류를 인라인 처리
-
Human-in-the-Loop Approval
- 일상 작업은 자동 승인하고 고위험 작업(대형 청구서, 파괴적 작업)은 사람의 승인 신호 전까지 일시 정지 (
df.wait_for_signal(),df.if())
- 일상 작업은 자동 승인하고 고위험 작업(대형 청구서, 파괴적 작업)은 사람의 승인 신호 전까지 일시 정지 (
AI 기반 작성 지원
- 워크플로를 평문 영어로 설명하면 Copilot이 올바른 durable-function SQL을 생성, 문법 학습 없이 원하는 내용만 기술
- 저장소에 재사용 가능한 에이전트 스킬
pg-durable-sql포함, GitHub Copilot 및 기타 에이전트에 연산자·변수 치환·루프·병렬 join 등 올바른 SQL 생성법을 학습시킴
오픈소스 제공
- 대기 명단·락인 없이 완전 오픈소스로 제공, 저장소를 클론·빌드해 자신의 PostgreSQL에서 즉시 실행
- 노트북·서버·클라우드 어디서나 durable orchestration을 적용 가능
Azure HorizonDB 매니지드 옵션
- Azure HorizonDB는 Microsoft의 새 PostgreSQL 클라우드 서비스로, pg_durable이 내장되어 작성한 durable function을 그대로 유지하면서 엔터프라이즈 확장·보안·AI 추가
- 최대 3× 빠른 성능, 스토리지 자동 확장 최대 128 TB, 컴퓨트 스케일아웃 최대 3,072 vCore
- Microsoft Defender 실시간 위협 탐지, Microsoft Entra ID 신원 관리
- Filtered DiskANN 벡터 검색, 시맨틱 랭킹, 인데이터베이스 AI 모델 큐레이션
- Microsoft Fabric 근실시간 미러링, VS Code 통합, GitHub Copilot 연계
-
내장 AI 파이프라인
- HorizonDB가 pg_durable의 durable 실행 위에 매니지드 엔드투엔드 AI 파이프라인을 계층화, 각 단계가 체크포인트·재시도·크래시 안전
- 단계 흐름: Ingest(문서·데이터 로드) → Chunk(콘텐츠 분할) → Embed(벡터화) → Index(DiskANN 저장) → Serve(검색·랭킹)