PostgREST:來自GitHub的PostgreSQL API
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’導致的性能下降、利用鏈路頭描述更多的關系等。
原文 http://www.infoq.com/cn/news/2015/07/postgrest