마이크로소프트, 크래시에도 이어 실행되는 SQL 확장 'pg_durable' 공개
마이크로소프트가 SQL로 정의한 장시간 작업을 크래시·재시작·실패 이후에도 이어서 실행하는 포스트그레SQL 확장 pg_durable을 공개하며 깃허브 트렌딩에 올랐다. 별도의 서비스 인프라 없이 지속 실행(durable execution) 패턴을 데이터베이스 안으로 가져오는 것으로, 마이크로소프트는 이를 연산을 데이터 가까이로 가져온다는 자사 미션의 일부라고 설명했다.
기존에는 백그라운드 작업을 안정적으로 돌리기 위해 크론, 워커, 큐, 상태 테이블을 엮어야 했고, pg_cron과 작업 테이블에 상태 컬럼·재시도 카운터·폴링 워커를 더하거나 에어플로·템포럴·스텝 펑션·아르고 같은 외부 오케스트레이터를 포스트그레SQL과 연동해야 했다. 이 과정에서 워크플로 로직이 SQL, 워커, 큐, 대시보드, 상태 테이블에 흩어지는 문제가 있었다.
pg_durable 함수는 포스트그레SQL이 실행하면서 단계마다 체크포인트를 남기는 SQL 단계 그래프다. 데이터베이스가 크래시·재시작되거나 한 단계가 실패하면 마지막 체크포인트부터 실행을 재개하므로, 이미 성공한 작업을 다시 돌리거나 상태를 수동으로 복원할 필요가 없다.
마이크로소프트가 제시한 핵심 특징은 네 가지다. 함수 상태가 포스트그레SQL에 영속화돼 크래시·재시작·페일오버에서 살아남는 '내구성', 합성 가능한 연산자로 함수를 정의하는 'SQL 네이티브', 스케줄링·조건·병렬 실행을 일급 기능으로 다루는 '데이터베이스 인지', 그리고 레디스·템포럴·외부 서비스 없이 포스트그레SQL 확장으로만 동작하는 '제로 인프라'다.
활용 사례로는 청크 분할 후 임베딩 API를 호출해 pgvector에 업서트하는 벡터 임베딩 파이프라인, 대량 배치를 스테이징·중복 제거·변환·발행하는 적재 파이프라인, 비대화를 감지해 알림을 보내고 승인을 기다린 뒤 다음 작업을 실행하는 예약 유지보수, 독립 쿼리를 병렬 실행한 뒤 결과를 합치는 팬아웃 집계, 그리고 SQL에서 보강·분류·웹훅 호출을 수행하는 외부 API 워크플로 등이 제시됐다.
사용 방식은 ~>와 |=> 같은 합성 연산자로 SQL에 워크플로를 정의하고 df.start()로 시작해 인스턴스 ID를 받는 식이다. 런타임이 단계마다 체크포인트를 두며 각 단계를 내구성 있게 실행하고, 진행 중이거나 완료된 워크플로의 상태와 결과는 df.instances 같은 포스트그레SQL 테이블에서 조회할 수 있어 데이터와 동일한 인증·백업 모델을 공유한다.
다만 마이크로소프트는 단일 INSERT나 일반 SQL 한 문장으로 끝나는 작업, 밀리초 이하의 동기 요청 처리가 필요한 경우, 확장 설치나 백그라운드 워커 실행이 불가능한 환경, 워크플로 대부분이 포스트그레SQL 밖 여러 이기종 시스템에 걸쳐 있는 경우에는 적합하지 않다고 밝혔다. 단계에 임의 코드나 비HTTP SDK가 필요하면 해당 로직을 SQL 함수로 감싸거나 df.http()용 HTTP 엔드포인트로 노출해야 한다.
pg_durable은 마이크로소프트가 성능을 위해 새로 내놓은 포스트그레SQL 클라우드 서비스 Azure HorizonDB에 내장돼 있으며, 마이크로소프트는 이 서비스가 pg_durable을 품고 설계됐다고 밝혔다.
태그된 릴리스는 amd64용 포스트그레SQL 17·18 데비안 패키지를 깃허브 릴리스 자산으로 배포한다. 설치 후 shared_preload_libraries에 pg_durable을 추가하고 포스트그레SQL을 재시작한 다음 CREATE EXTENSION pg_durable로 확장을 생성하면 된다. 소스 빌드에는 포스트그레SQL 17 또는 18, 러스트 나이틀리, cargo-pgrx 0.16.1이 필요하다.
보안 측면에서 CREATE EXTENSION은 PUBLIC에 어떤 권한도 부여하지 않으며, 관리자가 df.grant_usage로 애플리케이션 역할에 명시적으로 접근 권한을 줘야 한다. 행 수준 보안(RLS)으로 각 사용자는 자신의 함수 인스턴스만 보고 관리할 수 있고, 모든 인스턴스를 관리하는 백그라운드 워커 역할은 RLS를 우회하는 슈퍼유저여야 한다.