PostgREST:来自 GitHub 的 PostgreSQL API

  • 张天雷

2015 年 7 月 27 日

话题:GitHub语言 & 开发架构

1986 年,美国伯克利大学开始了由DARPANSF等赞助的POSTGRES数据库项目的研究。该项目后来成功应用到财务数据分析系统、小行星跟踪数据库等多个领域。1994 年,Postgres95 继承了 POSTGREST 代码,并成为开源项目,供全世界用户免费使用。1996,该项目正式更名为PostgreSQL。目前,PostgreSQL 已经成为最先进的开源数据库系统,提供多版本并行控制,支持子查询 / 事物 / 用户自定义函数和类型等几乎所有 SQL 构件,并且可以获得 C/C++/Java/phthon 等很多语言的绑定。作为开源项目,PostgreSQL 的开发团队主要为志愿者。为了更好的促进 PostgreSQL 的发展和应用,GitHub近期公开了为现有的 PostgreSQL 数据库提供 RESTful API 服务的PostgREST API。接下来,本文就对 PostgREST API 进行简要介绍。

首先,表征状态传输(REpresentational State Transfer,REST)描述了一个架构样式的网络系统,包含了一组架构约束条件和原则。作为 RESTful API,PostgREST 则是满足了 REST 要求的约束条件和原则。相比于一个新的 API,它提供了一个更加简洁、更加与相关标准兼容和更快速的 API。

目前,PostgREST 项目的源代码二进制文件都已经托管在 GitHub 中。用户可以直接通过 postgrest 命令,并配合 db-port 等参数进行执行。在实际的使用中,参数列表还可以包含 secure 选项,用于把所有的请求重定向到 HTTPS 中。此外,herokuapp 网站还提供了演示案例。这些案例模拟postman等 HTTP 客户端向 demo 服务器发送请求。其中,演示数据库的结构由begriffs/postgrest-example定义。

在性能方面,PostgREST 表现优越。在 Heroku 中每秒至多 2000 个请求的情况下进行测试,PostgREST 保证了亚秒级的反应时间。这主要得益于三个方面:服务器由使用Warp HTTP 服务器的Haskell所编写;把在 SQL 中进行串行化 JSON 反应、数据验证、身份忍者、数行和收回进行结合、在单个命令行中进行 Data post 等计算尽可能的放到数据库中;通过重新使用准备的声明、保持 db 连接池、使用 Postgres 二进制协议以及保持无状态以允许水平扩展等利用Hasql库实现数据库的高效使用。

在安全方面,PostgREST 处理身份认证,并把认证放置到数据库中定义的人员信息中,以保证只有一个单独的信任源。当与数据库进行交互时,服务器会使用当前认证的用户身份,并把连接持续期间能做的事情局限为当前用户的权限内。未来,PostgreSQL 9.5 将会支持行级别安全(row-level security)。同时,还没有被实现的安全机制也能够利用 trigger 和 security-barrier view 进行仿真。由于数据库的访问都因为使用leakproof函数而局限在一定的模板内,触发器并不会损害行级别的安全。

在版本(versioning)方面,PostgREST 通过 HTTP 内容协商支持多版本共存。来自某个版本的请求会被翻译成为数据库中表格内容的交换。而 PostgreSQL 策略搜索路径允许来自之前版本的表格在后续版本中进行完全重用。文档方面,PostgREST 并没有采用传统的用户自行编写和维护文档的方式。它采用 HTTP 让 API 解释自己的可供性(affordance)。所有的 PostgREST 路径都会对 OPTIONS 进行反应,解释他们所支持的内容以及 JSON 负载的数据格式。

最后,在数据完整性方面,postgrest 并不依靠 Object Relational Mapper 和自定义的命令代码。该系统需要用户把声明式约束直接放到数据库中。这样,没有任何应用可以对数据造成破坏。此外,PostgREST 还在 HTTP 接口设置了安全守卫(safeguard),从而避免强制 idempotent PUT 请求等情况的出现。

未来,PostgREST 会继续进行更新。其未来的特性包括:利用 socket 和 Postgres pubsub 来观察路径的变化、制定每个 view 的 HTTP 缓冲、从 Postgres 状态收集器中推断出好的默认抓取策略、产生测试客户端的 mock 数据、每个用户维护单独的连接池以避免‘set/reset role’导致的性能下降、利用链路头描述更多的关系等。


感谢徐川对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

GitHub语言 & 开发架构