코드 90% 줄여주는 새로운 Postgres 확장 기능

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

스크립트

00:00:00모두가 사랑하는 데이터베이스가 대대적인 업그레이드를 거쳤습니다. 내구성을 갖춘 크래시 방지 기능이
00:00:05Postgres에 탑재되어, 이제 예약 작업, 자동 재시도, 혹은 장기 실행 프로세스를 관리할 수 있습니다.
00:00:11외부 서비스 없이도 인간 개입이 필요한 승인 워크플로우까지 모두 처리 가능합니다. 이것이 바로 pg_durable입니다.
00:00:17Microsoft가 개발한 오픈 소스 Postgres 확장 프로그램이죠. 오늘은 pg_durable이 정확히 무엇인지,
00:00:22어떻게 Postgres에 직접 일정을 예약하는지 등 몇 가지 예제를 통해 살펴보겠습니다.
00:00:28이제 기존에 사용하던 외부 서비스는 버릴 수 있습니다. 저희 채널은 개발자를 위한 방대한
00:00:33콘텐츠를 제공하고 있으니, 최신 정보를 계속 받아보고 싶다면 구독해 주세요.
00:00:42pg_durable의 내구성이 보장된 함수는 매 단계 디스크에 저장됩니다. 이는 단순히
00:00:48begin-commit 블록이나 cron 작업에서는 얻을 수 없는 특별한 보장을 제공합니다. 즉, 데이터베이스
00:00:53충돌, 재시작, 긴 대기 시간, 오류와 같은 상황들을 이제 Postgres 내부에서 직접 관리할 수 있다는 뜻이죠.
00:00:59그럼 이 모든 것이 어떻게 작동하는지 알아볼까요? pg_durable은 내구성이 보장된 함수를 제공하는데,
00:01:05이는 SQL DSL로 제출하고 df_start 함수를 통해 실행하는 단계들의 그래프일 뿐입니다. 아주 간단한
00:01:11개념 이해를 위한 예제를 보겠습니다. 'SELECT hello world'라는 SQL을 실행하면 문자열
00:01:17'hello world'가 반환되겠지만, 이제 'SELECT df_start(SELECT hello world)'로 실행할 수 있습니다.
00:01:23물론 장기 실행 프로세스에 유용하겠지만, 여기서 8자리 ID가 반환되는데,
00:01:28이 ID를 df_status 함수에 전달하여 작업 상태를 확인하거나, df_results를 사용해
00:01:34작업이 완료된 후 최종 결과를 얻을 수 있습니다. 이렇게 장기 실행 작업이나
00:01:39승인 단계가 필요한 작업에 얼마나 유용한지 바로 알 수 있습니다. pg_durable은
00:01:45여러 작업을 순차적으로 실행하거나, 여러 작업을 병렬로 실행하거나,
00:01:50가장 빨리 완료된 결과를 반환하는 등 다양한 내장 연산 기능을 제공합니다. 또한 df.wait_for_schedule처럼
00:01:56cron 표현식을 대기하는 함수도 포함되어 있어, 이를 사용하면 제3자 시스템 없이도
00:02:01예약된 작업을 실행할 수 있습니다. 그럼 바로 데모를 통해 어떻게 하는지 보여드리겠습니다.
00:02:07이 예제에서는 스케줄을 설정하고 있습니다. df_start 함수로 SELECT를 호출하고,
00:02:13그 안에서 loop 연산을 사용하여 분 단위 일정으로 영원히 반복되도록 설정했습니다.
00:02:18즉, 매 분마다 실행되죠. 여기에 sequence 연산을 사용하여
00:02:23먼저 1분을 기다린 다음, 그 작업이 완료되면 'refresh materialized views'라는
00:02:29프로시저를 호출합니다. 여기서는 어떤 SQL이든 호출할 수 있지만, 저희는
00:02:34프로시저를 호출하여 'refresh log'라는 테이블에 'weekday refresh'라는 값을
00:02:40삽입하도록 했습니다. 이제 실행해 보면, 먼저 원래의 df_start 작업이
00:02:47실행되고 ID가 반환됩니다. 이제 SQL을 실행하여 refresh_log 테이블에
00:02:52로그가 채워지는 것을 확인하고 ID 순으로 정렬해 보겠습니다.
00:02:58몇 번 실행된 것을 볼 수 있죠. 데이터베이스 클라이언트로 이동해서 새로고침하면,
00:03:03이제 데이터베이스에 세 개의 로그가 쌓인 것을 볼 수 있습니다. 영구적인
00:03:08루프에서 실행 중이기 때문에 스크립트가 실행되는 한 계속해서 1분 주기로
00:03:13테이블에 데이터를 삽입할 것입니다. 다음 예제에서는 사람이 직접 승인하는
00:03:18주문 승인 워크플로우를 살펴보겠습니다. 다시 df_start를 사용하여
00:03:23데이터베이스에서 최상위 주문을 선택하는 SQL을 먼저 실행합니다.
00:03:28이것은 변수 할당 명령이며, 결과는 'order' 변수에 저장됩니다.
00:03:34그다음 sequence 명령을 통해 주문을 가져온 후,
00:03:39사람의 승인 신호를 기다립니다. 이 신호는 'sig' 변수에 저장되며
00:03:44최대 24시간까지 기다릴 수 있습니다. 다시 sequence 연산과 if 함수를 사용하여
00:03:50승인 시간이 초과되지 않고 사용자가 승인했다면, 주문 상태를 'approved'로
00:03:55업데이트하고, 그렇지 않으면 'rejected'로 업데이트합니다. 첫 번째 터미널에서
00:04:01npm run workflow로 스크립트를 실행하면 SQL이 실행되고 ID를 반환받은 뒤,
00:04:07두 번째 스크립트로부터의 승인을 기다리게 됩니다. 이때 데이터베이스를 보면
00:04:11주문 상태가 'pending'으로 설정되어 있습니다. 이제 승인 스크립트를 실행하면,
00:04:16상태가 'approved'로 변경됩니다. 승인이 완료되었으므로 첫 번째 스크립트는 종료됩니다.
00:04:21실제 승인 시 사용된 SQL을 보면, df_signal 함수를 사용하여
00:04:27대기 중인 워크플로우를 깨워 데이터베이스 레코드를 승인하게 됩니다. 이 모든 것을 직접
00:04:32실행해 보고 싶다면, 로컬에서 실행할 수 있도록 docker-compose 파일을 간단히 살펴보겠습니다.
00:04:37docker-compose 파일에서는 Microsoft의 pg_durable 이미지를 사용하며, 이는 Postgres 17을 실행합니다.
00:04:43물론 여기에는 pg_durable 확장 프로그램이 포함되어 있죠. 아래 명령어를 보시면
00:04:48shared_preload_libraries가 pg_durable로 설정된 것을 확인할 수 있습니다. 그 외 설정은
00:04:54원하는 대로 커스텀할 수 있습니다. 이를 통해 pg_durable 확장 프로그램이
00:04:59실행되는 Postgres 데이터베이스가 구동되어 예제들을 직접 실행해 볼 수 있습니다. 또한
00:05:04pg_durable 사이트에는 호출 예제가 많은데, 300줄의 SQL을 7줄의 SQL 문으로
00:05:11바꾸는 방법을 보여주는 예제도 있습니다. 왼쪽을 보시면 pg_durable 없이 300줄에 달하는
00:05:17보일러플레이트 코드가 있습니다. 큐 설정 및 구성, 워커 관리, 폴링 메시지
00:05:22처리, 상태 추적, 오류 처리 및 재시도 등을 수행하는데, 이 300줄의 보일러플레이트가
00:05:30pg_durable을 사용하면 단 7줄로 줄어듭니다. 이는 먼저 세 가지 작업을
00:05:36&(앰퍼샌드) 문자를 사용해 병렬로 실행한 다음, sequence 문자를 사용해
00:05:41대시보드를 새로고침합니다. 이렇게 간결한 이유는 새로운 연산 기능을 사용할 수 있기 때문만은
00:05:46아니라, 오류 처리나 재시도 같은 기능이 pg_durable 내부에서 자동으로 처리되기 때문입니다.
00:05:53pg_durable에 대해 더 자세히 알아보고 싶다면 영상 설명란의 관련 링크를 확인하세요. 즐겁게
00:05:58보셨길 바랍니다. Better Stack의 Warren이었고, 시청해 주셔서 감사합니다. 다음 시간에 뵙겠습니다.

핵심 요약

pg_durable은 복잡한 워크플로우 관리를 위한 외부 시스템 의존도를 제거하고, 300줄 규모의 보일러플레이트 코드를 단 7줄의 SQL 문으로 줄여 PostgreSQL 데이터베이스 내에서 직접 장기 실행 작업을 자동화합니다.

하이라이트

  • Microsoft에서 개발한 오픈 소스 PostgreSQL 확장 기능인 pg_durable은 데이터베이스 내에서 예약 작업, 재시도, 워크플로우 관리를 처리합니다.

  • pg_durable은 장기 실행 프로세스 단계마다 상태를 디스크에 저장하여 데이터베이스 충돌이나 재시작 상황에서도 내구성을 보장합니다.

  • df_start 함수를 사용하여 SQL 기반으로 작업을 제출하고, df_status나 df_results 함수로 진행 상황과 결과를 조회할 수 있습니다.

  • cron 표현식 대기 기능과 병렬 및 순차 실행 연산자를 지원하여 외부 서비스 없이도 복잡한 자동화 스케줄을 구현합니다.

  • 300줄에 달하던 큐 설정, 워커 관리, 상태 추적, 오류 재시도 보일러플레이트 코드를 단 7줄의 SQL로 단축할 수 있습니다.

타임라인

pg_durable의 개념과 필요성

  • pg_durable은 Microsoft가 개발한 오픈 소스 Postgres 확장 프로그램입니다.
  • 기존의 cron 작업이나 단순 begin-commit 블록이 해결하지 못했던 데이터베이스 충돌 및 재시작 대응 능력을 제공합니다.
  • 인간 개입이 필요한 승인 워크플로우를 외부 서비스 없이 데이터베이스 내부에서 직접 관리할 수 있습니다.

데이터베이스의 내구성을 확보하기 위해 매 단계마다 상태를 디스크에 저장하는 방식을 채택했습니다. 이 덕분에 긴 대기 시간을 요구하는 작업이나 오류 발생 시에도 안정적으로 프로세스를 처리할 수 있습니다.

작업 자동화 및 스케줄링 예제

  • df_start 함수를 호출하여 장기 실행 프로세스를 그래프 형태로 제출하고 실행합니다.
  • 순차(sequence), 병렬, 반복(loop) 연산 기능을 사용하여 매분 실행되는 작업을 간단히 설정할 수 있습니다.
  • df_status를 통해 작업 상태를 확인하고, df_results로 최종 결과를 얻는 구조를 갖추고 있습니다.

구체적인 데모를 통해 1분마다 특정 프로시저를 반복 실행하여 로그 테이블에 데이터를 삽입하는 루프 설정을 보여줍니다. 외부 시스템 연결 없이 SQL만으로 복잡한 스케줄링 로직을 구현하는 방법을 명확히 제시합니다.

워크플로우 관리와 코드 효율성

  • df_signal 함수를 사용하여 대기 중인 워크플로우에 외부 승인 신호를 전달할 수 있습니다.
  • 최대 24시간까지 승인을 기다리며 조건에 따라 주문 상태를 자동으로 업데이트하는 로직 구현이 가능합니다.
  • 기존의 300줄짜리 큐 및 워커 관리 코드를 7줄의 간결한 SQL로 대체할 수 있습니다.

주문 승인 프로세스를 통해 실질적인 워크플로우 활용 예시를 보여줍니다. Docker 환경에서 pg_durable 확장 기능을 활성화하는 방법과 함께, 복잡한 보일러플레이트 코드가 자동화된 연산 기능으로 인해 얼마나 극적으로 간소화되는지 비교합니다.

커뮤니티 글

모든 글 보기