以 SQL 为核心的后端 Alpha

快速的 PostgreSQL API。
低内存占用。

一个用于 Nginx 的 Rust 模块,通过 HTTP 提供 PostgreSQL 函数,并通过 WebSocket 发送变更通知。

GitHub

pgxio 如何减少开销

Nginx 事件循环

HTTP、WebSocket 和非阻塞数据库 I/O 共用 Nginx 的事件循环。

复用数据库连接

预备语句和流水线处理减少重复工作及数据库往返次数。

无需重新序列化 JSON

PostgreSQL 的 JSONB 响应文本原样转发。关闭输出验证还可避免解析响应 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
Nginx 内的 pgxioRust + 非阻塞 libpq
PostgreSQL函数 + 通知

订阅提供的是变更信号,而非持久事件日志。重连后,客户端重新订阅并获取最新快照。

本地运行

在已有的 pgxio 源码目录中执行这些命令。需要 Docker Compose 和 Python 3.9 或更新版本。

附带的开发环境绑定到 localhost。pgxio 处于 Alpha 阶段;此配置用于本地探索。

终端 · 在 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 '{}'