開源的輕量級JSON存儲Kinto介紹
Kinto 是個提供了同步與分片功能的輕量級JSON存儲服務,并且易于使用。它在Mozilla內部得到了廣泛的應用,基于Apache v2許可。
基本上,Kinto是個服務,客戶端應用可以通過它存儲和獲取JSON數據。為了對這些數據提供同步與共享特性,Kinto引入了一些基本概念。
- Bucket:可以將bucket看作是命名空間:如果存儲在不同的bucket中,那么集合名之間是不會出現沖突的。
- Collection:記錄的集合。
- Record:實際存儲的數據。
- Group:定義權限的具名principal列表。
Record是數據的最小單元。默認情況下是無模式的,JSON可以包含任何數據。Collection是一組Record。我們以列表的形式操 縱Record,可以對其進行過濾和排序。Bucket是個抽象的概念,用于組織集合及其權限。Kinto提供了一個名為default的Bucket, 其集合與記錄只可由當前用戶訪問。
Kinto所操縱的每一種對象都共享一些公用的屬性:
- 一個唯一標識符
- 一個版本號,有修改時會自增
- 一組權限
這些概念非常類似于磁盤,其中的Bucket就是分區、Collection是目錄,而Record則是文件!
Kinto擁有一個用戶組的概念。一個組會有一個成員列表,他們屬于一個Bucket。權限引用的是組而非單個用戶,這使得我們可以輕松定義“角 色”,特別是在將同一組權限應用到幾個對象的時候。為了控制記錄的查看、創建、修改與刪除操作,Kinto可以在Bucket、Group、 Collection與單個Record上定義權限。既然在Bucket、Collection與Record之間存在著繼承的概念,因此Kinto考慮 到了從父對象繼承權限的問題。比如說,如果一個Bucket定義了一個權限,允許匿名用戶讀取,那么該Bucket中的每個Collection的每一條 Record就都可以讀取,這都是繼承的結果。創建新對象的權限定義在父對象中。比如說,創建Record的權限定義在Collection中,創建 Collection或是Group的權限定義在Bucket中。不過,創建新Bucket的權限則是通過服務器配置來控制的。
Kinto的主要應用場景如下所示:
- 為前端應用提供了通用的Web數據庫
- 構建帶有細粒度權限控制的協作式應用
- 可存儲加密數據
- 在不同設備間同步應用數據
值得一提的是,Kinto目前在Firefox與Firefox OS上得到了廣泛的應用,主要用于對設置與各種信息進行全局同步;此外,它還是瀏覽器擴展與Web應用中個人數據存儲的首選解決方案。
Kinto的主要特性如下所示:
- 數據同步
- 細粒度權限控制
- JSON Schema驗證
- 通用且多客戶端支持
- 開源、自托管
- 良好的設計
Kinto的亮點有:
- 充分利用了HTTP最佳實踐
- 可插拔的認證機制
- 可插拔的存儲、緩存與權限支持
- 可通過INI文件或是環境變量進行配置
- 內建的監控支持
- 緩存控制
雙向的記錄同步是個非常困難的事情。Kinto走了一些捷徑,它只對并發控制與變更輪詢提供了一些基本保障手段,而且不會自動解決沖突問題。基本 上,每個對象都有一個版本號,每次修改后該版本號都會增加。Kinto并不會保存對象老的版本號。客戶端可以獲取到自某個特定的版本號以來記錄集合所發生 的變更列表,Kinto還可以通過它防止對象的意外更新。Kinto同步功能是由Mozilla Firefox Sync團隊進行設計并開發的。
在開始構建自己的數據存儲服務前,我們先來看看市場上已經存在的產品。Kinto團隊一開始的想法是使用并擴展已有的社區項目,并沒有打算重新發 明輪子。不過,經過了一些嘗試后,團隊發現既有的這些解決方案都無法很好地解決團隊所面臨的問題,比如說細粒度權限控制等。因此,團隊基于開發 Firefox Sync所積累的經驗開始構建自己的數據存儲服務。
下表展示了Kinto與市場上同類產品的功能比較,這有助于讀者了解Kinto相對于其他競品來說有哪些優勢。
[1] 目前,Hoodie的用戶插件會自動讓用戶認證通過,不過他們正在解決這個問題。
[2] CouchDB將Map/Reduce作為查詢機制,這對于新人來說不太好理解。
[3] Remote Storage可以對目錄使用“ls”,不過內容項并不是排好序的,也沒有分頁。
[4] 對于沖突處理來說,Kinto使用了與Remote storage相同的機制。
[5] Remote Storage支持OAuth2.0 Implicit Grant Flow。
[6] 對去中心化的發現支持在計劃當中,不過尚未實現。
[7] Remote Storage并未定義任何默認實現(因為它是個協議),不過可以通過JavaScript與Node.js輕松上手。
感興趣的讀者還可以通過 這里 了解到創建Kinto背后的種種抉擇與動機。
下面是關于Kinto的一些FAQ,可以幫助讀者更好地了解這款輕量級JSON存儲的設計原理與具體使用場景。
Kinto可以對數據進行加密么?
Kinto服務器會將傳遞過來的任何數據存儲起來,無論數據是否加密都如此。我們認為加密應該是客戶端做的事情,你可以通過我們提供的Kinto.js客戶端輕松實現對數據的加密處理。
對于我所使用的操作系統來說,Kinto是否提供了包下載工具?
沒有,不過這個想法很不錯。為幾個平臺維護包是一件非常耗時間的事情,況且我們現在還是個小團隊。目前,你可以通過我們提供的Makefile或 是Dockerfile輕松運行服務器。可以通過pip輕松安裝Kinto,在Docker hub也有鏡像。不過,如果你愿意幫助我們在你所喜歡的操作系統上維護Kinto包,那么我們將萬分感激!
為何會選擇使用Python而不是其他語言?
我們喜歡Python,因為它是門簡潔且富于表現力的語言,同時又提供了強大的數據結構,而且易于學習。因此,開發團隊選擇了使用Python。
此外,Mozilla的運維團隊也對在生產環境下部署和管理Python應用駕輕就熟。不過,Python本身只是個實現細節而已。Kinto是由HTTP協議定義的,可以使用任何語言實現。
可否在Kinto中存儲文件?
現在還不行,不過我們已經設計了一個文件存儲特性,現在正在實現中,預計將于明年發布。與此同時,如果想要嘗試最新版,我們很期待你的反饋。
何為Cliquet?Cliquet與Kinto存在哪些差別?
Cliquet是個用于設計微服務的工具集;Kinto則是通過該工具集構建的服務器。
我遇到了Exception錯誤,哪里出錯了呢?
可以通過Troubleshooting了解關于錯誤的詳細信息。