스크립트
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이었고, 시청해 주셔서 감사합니다. 다음 시간에 뵙겠습니다.