Backend centré sur SQL Alpha

Des API PostgreSQL rapides.
Peu de mémoire.

Un module Rust pour Nginx qui expose des fonctions PostgreSQL via HTTP et transmet des notifications de changement par WebSockets.

GitHub

Comment pgxio réduit les surcoûts

Boucle événementielle Nginx

HTTP, WebSockets et les E/S non bloquantes de la base partagent la boucle événementielle de Nginx.

Connexions à la base réutilisées

Les instructions préparées et le pipelining réduisent le travail répété et les allers-retours vers la base.

Aucune nouvelle sérialisation JSON

Le texte JSONB renvoyé par PostgreSQL est transmis tel quel. Désactiver la validation de sortie évite aussi l'analyse du JSON de réponse.

Transmission des requêtes sans copie Expérimental

La compilation avec libpq modifié supprime les copies du corps vers Rust et libpq pour les requêtes admissibles. L'emprunt automatique s'applique aux grandes requêtes admissibles sur des connexions non chiffrées à la base. Les compilations standard conservent les copies.

Les mesures ci-dessus utilisent des tampons copiés. Les réponses et TLS impliquent toujours des copies.

Fonctionnement

pgxio.confExtrait de configuration
# 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

    Écrire des fonctions SQL

    Les fonctions SQL reçoivent et renvoient du JSON. Elles gèrent les requêtes, les règles métier et les autorisations.

  2. 02

    Publier des points d'accès explicites

    Déclarez les fonctions exposées par votre API. pgxio vérifie les JWT et appelle chaque fonction dans une transaction.

  3. 03

    S'abonner aux changements

    Les abonnements WebSocket autorisés signalent les changements. Le client récupère ensuite l'instantané actuel via HTTP.

Navigateur / clientHTTP + WebSocket
pgxio dans NginxRust + libpq non bloquant
PostgreSQLFonctions + notifications

Les abonnements transmettent des signaux de changement, pas un journal persistant. Après reconnexion, les clients se réabonnent et récupèrent un nouvel instantané.

Exécuter en local

Exécutez ces commandes depuis une copie locale de pgxio. Docker Compose et Python 3.9 ou ultérieur sont nécessaires.

L'environnement de développement fourni écoute sur localhost. pgxio est en version alpha ; cette configuration sert à l'exploration locale.

Terminal · depuis votre copie locale de 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 '{}'