Бекенд на основі 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 '{}'