pg_durable - PostgreSQL을 위한 내구성 SQL 함수

17 hours ago 8
  • 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하게 완료
  • 큐 관리, 상태 추적, 크래시 복구, 단계 조정, 재시도를 모두 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)
  • Parallel Aggregation

    • 사용자 수 집계 + 매출 합산 + 재고 확인을 동시에 수행, 여러 쿼리로 fan-out 후 전체 완료 대기 (&, df.join())
  • Order Processing

    • 주문 ID를 캡처해 검증·처리·완료 단계로 전달, 단계 간 변수가 자동 흐름 (|=> capture, $var substitution, df.sleep())
  • Scheduled Jobs

    • cron 스케줄로 API 폴링·레코드 아카이브·데이터 동기화, 루프가 영구 실행되며 재시작에도 생존 (@> loop, df.wait_for_schedule())
  • Conditional Branching

    • 대기 작업·행 수·플래그를 확인해 처리 또는 건너뛰기 분기, 분기 로직이 애플리케이션이 아닌 SQL에 위치 (df.if(), ?> conditional)
  • Multi-step Validation

    • 데이터 가져오기 → 스키마 검증 → 비즈니스 규칙 확인 → 승인/거부, 각 단계가 체크포인트되어 실패해도 진행 상황 유실 없음
  • Database Maintenance

    • autovacuum 차단 요소·테이블 bloat·wraparound 위험을 탐지해 검토용으로 노출, 승인 대기 후 재시작에도 durable하게 교정 (?> conditional, df.wait_for_signal(), @> loop)
  • 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(검색·랭킹)
Read Entire Article