pg_graphql:PostgreSQL的GraphQL扩展

pg_graphql:PostgreSQL的GraphQL扩展

💡 原文英文,约900词,阅读约需4分钟。
📝

内容提要

pg_graphql是一个开源的PostgreSQL扩展,提供GraphQL支持。它在数据库内处理模式生成、查询解析和解析器,确保高性能和实时更新。该扩展通过单个SQL语句解析GraphQL请求,避免了N+1查询问题,并兼容现有的安全策略。pg_graphql的API通过PostgREST暴露,性能优越,支持每秒2205个请求。

🔎

延伸解读

为何选择数据库内GraphQL

pg_graphql 将 GraphQL 服务器直接嵌入 PostgreSQL,避免了额外进程的内存开销。文章提到,在 1GB 内存的虚拟机上,运行 PostgreSQL、PostgREST 等服务后,内存预算已所剩无几,因此无法采用需要独立进程的 GraphQL 方案。这种设计不仅节省资源,还利用数据库的 ACID 特性和现有安全策略,确保数据一致性和权限控制。

性能优势与实现机制

pg_graphql 通过单条 SQL 语句解析 GraphQL 请求,将结果聚合为 JSON 返回,避免了 N+1 查询问题,并达到理论最低网络 IO 开销。在 4 核 16GB 内存的机器上,Apache Bench 测试显示每秒可处理 2205 个请求,且无失败请求。这种高性能得益于数据库内解析和 PostgreSQL 的预处理语句、错误处理等内置机制。

与现有方案的对比

文章比较了 Graphile 和 Hasura,两者均满足开源、反射模式、实时更新和性能要求,但都需要独立进程,不适合内存受限的环境。pg_graphql 作为原生扩展,无需额外进程,通过 PostgREST 的 RPC 功能暴露 HTTP 接口,显著降低平台内存需求,估计每月减少 525 TB/小时的内存占用,兼具成本与环保优势。

使用方式与事务支持

pg_graphql 的公共 API 是一个返回 JSON 的 SQL 函数 gql.resolve,可直接在数据库内调用,也可通过 PostgREST 以 HTTP 方式访问。每个 GraphQL 请求在单个事务中执行,因此多操作请求天然具备原子性,利用 PostgreSQL 的 ACID 保证。此外,它兼容现有的行级安全策略,无需特殊权限,便于集成到现有系统中。

❓

Q&A

pg_graphql是什么?

pg_graphql是一个开源的PostgreSQL扩展,提供GraphQL支持。

pg_graphql如何处理GraphQL请求?

pg_graphql通过单个SQL语句解析GraphQL请求,确保高性能并避免N+1查询问题。

pg_graphql的性能如何?

pg_graphql在4核16GB内存的机器上可以支持每秒2205个请求,性能优越。

pg_graphql如何与现有的安全策略兼容?

pg_graphql不需要特殊权限,完全兼容现有的行级安全策略。

pg_graphql的API是如何暴露的?

pg_graphql的API通过PostgREST暴露,允许通过HTTP访问。

pg_graphql支持哪些编程语言?

pg_graphql的公共API是一个返回JSON的单一SQL函数,支持多种编程语言的调用。

🏷️

标签

➡️

继续阅读