開源的輕量級JSON存儲Kinto介紹
本文來源於我在InfoQ中文站翻譯的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/introducing-kinto
Kinto是個提供了同步與分片功能的輕量級JSON存儲服務,並且易於使用。
它在Mozilla內部得到了廣泛的應用,基於Apache v2許可。
基本上,Kinto是個服務,client應用能夠通過它存儲和獲取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的權限則是通過server配置來控制的。
Kinto的主要應用場景例如以下所看到的:
- 為前端應用提供了通用的Web數據庫
- 構建帶有細粒度權限控制的協作式應用
- 可存儲加密數據
- 在不同設備間同步應用數據
值得一提的是,Kinto眼下在Firefox與Firefox OS上得到了廣泛的應用。主要用於對設置與各種信息進行全局同步;此外,它還是瀏覽器擴展與Web應用中個人數據存儲的首選解決方式。
Kinto的主要特性例如以下所看到的:
- 數據同步
- 細粒度權限控制
- JSON Schema驗證
- 通用且多client支持
- 開源、自托管
- 良好的設計
Kinto的亮點有:
- 充分利用了HTTP最佳實踐
- 可插拔的認證機制
- 可插拔的存儲、緩存與權限支持
- 可通過INI文件或是環境變量進行配置
- 內建的監控支持
- 緩存控制
雙向的記錄同步是個非常困難的事情。
Kinto走了一些捷徑,它僅僅對並發控制與變更輪詢提供了一些基本保障手段。並且不會自己主動解決沖突問題。基本上,每一個對象都有一個版本,每次改動後該版本都會添加。Kinto並不會保存對象老的版本。
client能夠獲取到自某個特定的版本以來記錄集合所發生的變更列表,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能夠對數據進行加密麽?
Kintoserver會將傳遞過來的不論什麽數據存儲起來,不管數據是否加密都如此。我們覺得加密應該是client做的事情。你能夠通過我們提供的Kinto.jsclient輕松實現對數據的加密處理。
對於我所使用的操作系統來說,Kinto是否提供了包下載工具?
沒有,只是這個想法非常不錯。為幾個平臺維護包是一件非常耗時間的事情。況且我們如今還是個小團隊。眼下,你能夠通過我們提供的Makefile或是Dockerfile輕松執行server。能夠通過pip輕松安裝Kinto。在Docker hub也有鏡像。只是,假設你願意幫助我們在你所喜歡的操作系統上維護Kinto包。那麽我們將萬分感激!
為何會選擇使用Python而不是其它語言?
我們喜歡Python。由於它是門簡潔且富於表現力的語言,同一時候又提供了強大的數據結構,並且易於學習。因此,開發團隊選擇了使用Python。
此外。Mozilla的運維團隊也對在生產環境下部署和管理Python應用駕輕就熟。
只是,Python本身僅僅是個實現細節而已。Kinto是由HTTP協議定義的。能夠使用不論什麽語言實現。
可否在Kinto中存儲文件?
如今還不行。只是我們已經設計了一個文件存儲特性,如今正在實現中,估計將於明年公布。與此同一時候,假設想要嘗試最新版。我們非常期待你的反饋。
何為Cliquet?Cliquet與Kinto存在哪些區別?
Cliquet是個用於設計微服務的工具集。Kinto則是通過該工具集構建的server。
我遇到了Exception錯誤。哪裏出錯了呢?
能夠通過Troubleshooting了解關於錯誤的具體信息。
感興趣的讀者能夠嘗試Kinto,這裏是Kinto的文檔說明。
開源的輕量級JSON存儲Kinto介紹