Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Иллюстрация к статье о pg_durable в PostgreSQL

pg_durable: Durable Functions приходят в PostgreSQL

Новое open-source расширение pg_durable от Microsoft внедряет концепцию надежного выполнения (Durable Execution) прямо в PostgreSQL. Обзор архитектуры на базе рантайма duroxide, встроенного SQL DSL для отказоустойчивых фоновых воркфлоу, интеграции с ИИ-пайплайнами HorizonDB и пошаговая инструкция по настройке.

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 незаменима в случаях, когда логика бизнес-процесса тесно связана с состоянием таблиц базы данных:

  1. Регламентные задачи и ETL: Агрегация таблиц, очистка устаревших логов и обновление материализованных представлений в строго заданной последовательности.
  2. ИИ-пайплайны: В облачной платформе HorizonDB от Microsoft расширение используется совместно с модулем azure_ai для создания надежных графов обработки данных. Например, при изменении строк таблицы запускается воркфлоу, который нарезает текст на части, запрашивает эмбеддинги у языковой модели и сохраняет их обратно в базу.
  3. Ожидание внешних событий: Воркфлоу может приостановить работу на этапе ожидания ручного подтверждения (например, оплаты или действия администратора), освободив при этом активное сетевое соединение с СУБД.

Инструкция по установке и использованию

Для запуска и проверки работы 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-гарантий открывает новые подходы к проектированию отказоустойчивых бэкенд-систем.