1986年,美国伯克利大学开始了由 DARPA 、 NSF 等赞助的 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读者交流群 )。