pg_durable: Durable Functions приходят в PostgreSQL
В современной разработке программного обеспечения управление сложными, долгоживущими процессами обычно требует выноса логики за пределы базы данных. Разработчики вынуждены интегрировать внешние очереди сообщений, брокеры задач и тяжеловесные системы оркестрации уровня Temporal. Компания Microsoft представила альтернативное решение этой проблемы, выпустив новое open-source расширение pg_durable, которое привносит концепцию Durable Execution прямо в ядро СУБД PostgreSQL.
Эта технология позволяет описывать отказоустойчивые асинхронные цепочки шагов на языке SQL. Если во время выполнения процесса сервер перезагрузится или произойдет сетевой сбой, pg_durable восстановит состояние выполнения с последнего успешного шага без дублирования уже выполненных операций.
Архитектура и встроенный DSL
Расширение разработано с помощью фреймворка pgrx на языке Rust и запускается как фоновый воркер внутри процесса PostgreSQL. Задачи выполняются в рамках рантайма duroxide, который управляет очередями выполнения, повторными попытками при сбоях и сохранением состояния.
Когда клиент инициирует процесс, база данных мгновенно возвращает идентификатор запущенной задачи, а сама логика исполняется в фоновом режиме. Каждый шаг процесса выполняется в отдельной изолированной транзакции, результаты которой записываются в системные таблицы.
Для описания логики процессов в pg_durable реализован специализированный SQL DSL. Он поддерживает следующие операторы:
~>— последовательное выполнение шагов.&— параллельный запуск нескольких задач.|— выбор первой выполнившейся задачи.@>— организация циклов.- Операторы ветвления и механизмы ожидания внешних сигналов.
Пример сложного процесса, использующего синтаксис операторов:
SELECT df.start('
(fetch_data ~> process_chunk_1)
&
(fetch_data ~> process_chunk_2)
~>
refresh_materialized_view
');
Встроенные функции расширения позволяют выполнять HTTP-запросы наружу, настраивать расписание выполнения и организовывать объединение параллельных потоков данных.
Практические сценарии применения
Технология pg_durable незаменима в случаях, когда логика бизнес-процесса тесно связана с состоянием таблиц базы данных:
- Регламентные задачи и ETL: Агрегация таблиц, очистка устаревших логов и обновление материализованных представлений в строго заданной последовательности.
- ИИ-пайплайны: В облачной платформе HorizonDB от Microsoft расширение используется совместно с модулем
azure_aiдля создания надежных графов обработки данных. Например, при изменении строк таблицы запускается воркфлоу, который нарезает текст на части, запрашивает эмбеддинги у языковой модели и сохраняет их обратно в базу. - Ожидание внешних событий: Воркфлоу может приостановить работу на этапе ожидания ручного подтверждения (например, оплаты или действия администратора), освободив при этом активное сетевое соединение с СУБД.
Инструкция по установке и использованию
Для запуска и проверки работы pg_durable на сервере СУБД выполните следующие шаги:
Требования к окружению
- Установленная совместимая версия PostgreSQL.
- Права суперпользователя на установку расширений.
- Установленный Rust и инструментарий
pgrx(если вы собираете расширение из исходных кодов).
Шаг 1. Сборка и установка расширения на сервер
Скомпилируйте расширение и скопируйте бинарные файлы в каталог библиотек вашей версии PostgreSQL.
Шаг 2. Активация в базе данных
Подключитесь к нужной базе данных через консоль СУБД или клиент администрирования и выполните команду:
CREATE EXTENSION pg_durable;
Шаг 3. Запуск фонового процесса
Инициируйте выполнение воркфлоу с помощью функции запуска:
SELECT df.start('сценарий_выполнения');
Эта команда мгновенно вернет текстовый уникальный идентификатор запущенного процесса.
Шаг 4. Контроль выполнения
Для проверки текущего состояния и получения итогового результата воспользуйтесь функциями мониторинга:
SELECT * FROM df.status('ваш_идентификатор_процесса');
SELECT * FROM df.result('ваш_идентификатор_процесса');
Настройка системных лимитов PostgreSQL
Для стабильной работы расширения необходимо правильно сконфигурировать лимиты фоновых воркеров СУБД. В файле конфигурации postgresql.conf проверьте и при необходимости увеличьте параметры max_worker_processes и max_parallel_workers, чтобы СУБД имела достаточный запас свободных ресурсов для одновременного обслуживания фоновых задач pg_durable и клиентских параллельных запросов.
Пример настройки в файле конфигурации postgresql.conf:
# Рекомендуемые параметры для работы с фоновыми воркерами
max_worker_processes = 16
max_parallel_workers = 8
После редактирования конфигурационного файла не забудьте перезапустить службу СУБД для применения изменений, выполнив команду в терминале операционной системы.
Caveats и меры безопасности
При использовании pg_durable учитывайте системные ограничения:
- Ресурсы СУБД: Фоновые воркеры потребляют процессорное время и оперативную память сервера базы данных. Ограничивайте количество одновременно выполняющихся процессов.
- Детерминизм кода: Шаги воркфлоу должны быть детерминированными, чтобы повторное проигрывание сценария при сбое приводило к тем же результатам.
- Безопасность сетевых вызовов: Для исходящих HTTP-запросов настраивайте строгие правила разрешенных адресов.
- Секреты: Никогда не передавайте пароли и API-ключи в открытом виде в параметрах функций воркфлоу.
- Идемпотентность: Действия внешних систем, вызываемых из шагов воркфлоу (например, отправка писем или списание средств), должны быть идемпотентными, чтобы избежать повторного срабатывания при перезапуске шага.
Развитие таких инструментов, как pg_durable, показывает общий тренд на сближение вычислений и данных. Для разработчиков это означает возможность значительно упростить архитектуру распределенных приложений, отказавшись от избыточных сервисов синхронизации состояний. Перенос логики управления рабочими процессами на уровень базы данных с сохранением ACID-гарантий открывает новые подходы к проектированию отказоустойчивых бэкенд-систем.

