Бэкенд на основе SQL Альфа

Быстрые API для PostgreSQL.
Мало памяти.

Модуль на Rust для Nginx, который открывает доступ к функциям PostgreSQL по HTTP и отправляет уведомления об изменениях через WebSocket.

GitHub

Как pgxio сокращает накладные расходы

Цикл событий Nginx

HTTP, WebSocket и неблокирующий ввод-вывод базы данных используют общий цикл событий Nginx.

Повторное использование соединений

Подготовленные запросы и конвейерная обработка сокращают повторную работу и число обменов с базой данных.

Без повторной сериализации JSON

Текст ответа JSONB от PostgreSQL передаётся без изменений. Отключение проверки выходных данных также позволяет не разбирать JSON ответа.

Передача запросов без копирования Экспериментально

Сборка с изменённой libpq устраняет копирование тела подходящих запросов в Rust и libpq. Автоматическое заимствование буферов применяется к подходящим большим запросам при незашифрованном соединении с базой. Стандартные сборки сохраняют копирование.

В тесте выше использовались копируемые буферы. Ответы и TLS по-прежнему требуют копирования.

Как это работает

pgxio.confФрагмент конфигурации
# HTTP endpoints
pgxio_endpoint list_tasks
  web.list_tasks read_only;

pgxio_endpoint create_task
  web.create_task;

# WebSocket subscription authorization
pgxio_stream tasks
  web.authorize_tasks;
  1. 01

    Напишите SQL-функции

    SQL-функции принимают и возвращают JSON. Они выполняют запросы, бизнес-правила и проверки доступа.

  2. 02

    Явно опубликуйте эндпоинты

    Объявите функции, доступные через API. pgxio проверяет JWT и вызывает каждую функцию внутри транзакции.

  3. 03

    Подпишитесь на изменения

    Авторизованные подписки WebSocket сообщают об изменениях. Клиент повторно получает текущий снимок данных по HTTP.

Браузер / клиентHTTP + WebSocket
pgxio внутри NginxRust + неблокирующая libpq
PostgreSQLФункции + уведомления

Подписки передают сигналы об изменениях, а не постоянный журнал событий. После переподключения клиенты подписываются заново и получают свежий снимок данных.

Запуск локально

Выполните эти команды из имеющейся локальной копии pgxio. Нужны Docker Compose и Python 3.9 или новее.

Включённое окружение для разработки слушает localhost. pgxio находится на стадии альфа; эта конфигурация предназначена для локального знакомства.

Терминал · из локальной копии pgxio
bin/pgxio init
bin/pgxio up
TOKEN=$(bin/pgxio token alice)

curl http://localhost:8080/v1/create_task \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Hello from pgxio"}'

curl http://localhost:8080/v1/list_tasks \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}'