开源的轻量级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了解关于错误的具体信息。
开源的轻量级JSON存储Kinto介绍的更多相关文章
- HTML5开发——轻量级JSON存储解决方案Lawnchair.js
Lawnchair是一个轻量级的移动应用程序数据持久化存储方案,同时也是客户端JSON文档存储方法,优点是短小,语法简洁,扩展性比较好. 现在做HTML5移动应用除了LocalStorage的兼容性比 ...
- JSON-RPC轻量级远程调用协议介绍及使用
这个项目能够帮助开发人员利用Java编程语言轻松实现JSON-RPC远程调用.jsonrpc4j使用Jackson类库实现Java对象与JSON对象之间的相互转换.jsonrpc4j包含一个JSON- ...
- GGTalk——C#开源即时通讯系统源码介绍系列(一)
坦白讲,我们公司其实没啥技术实力,之所以还能不断接到各种项目,全凭我们老板神通广大!要知道他每次的饭局上可都是些什么人物! 但是项目接下一大把,就凭咱哥儿几个的水平,想要独立自主.保质保量保期地一个个 ...
- 腾讯云数据库团队:MySQL5.7 JSON实现简单介绍
作者介绍:吴双桥 腾讯云project师 阅读原文.很多其它技术干货.请訪问fromSource=gwzcw.57435.57435.57435">腾云阁. 本文主要介绍在MySQL ...
- [Swift通天遁地]七、数据与安全-(3)Cocopods的安装和开源类库对JSON的解析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- iOS5系统API和5个开源库的JSON解析速度测试
iOS5系统API和5个开源库的JSON解析速度测试 iOS5新增了JSON解析的API,我们将其和其他五个开源的JSON解析库进行了解析速度的测试,下面是测试的结果和工程代码附件. 我们选择的测试对 ...
- eval、json.parse()的介绍和使用注意点
原文:eval.json.parse()的介绍和使用注意点 eval和json.parse的使用 eval:来源于官网 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScri ...
- EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)
源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
随机推荐
- [转]URL最大长度问题
本文转自:http://www.cnblogs.com/henryhappier/archive/2010/10/09/1846554.html 今天在测试Email Ticket的时候发现在进行Ma ...
- java IO流 之 字节输入流 InputString()
学习java的重点之一:InputStream 字节输入流的使用 (1)FileInputstream: 子类,读取数据的通道 使用步骤: 1.获取目标文件:new File() 2.建立通道:ne ...
- 纵横填字map版(初始数据结构)
新数据结构设计: 定义一个map: key是横纵坐标字符串,比如“0,4” value是一个json,包含以下属性:字,横向的词(若 有的话,无的话,空串),纵向的词(若有的话,无的话,空串). 另有 ...
- 揭开WebService的神秘面纱
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- [ Luogu 4626 ] 一道水题 II
\(\\\) \(Description\) 求一个能被\([1,n]\) 内所有数整除的最小数字,并对 \(100000007\) 取模 \(N\in [1,10^8]\) \(\\\) \(Sol ...
- leetcode523 Continuous Subarray Sum
思路: 令sum[p]表示p位置的前缀和.如果sum[i] % k == sum[j] % k (j - i > 1),则存在子段(i, j]的和能够整除k. 实现: class Solutio ...
- rabbitmq 简单示例(Hello World)
一:消息中间件: AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 RabbitMQ是实现AMQP( ...
- selenium学习第三天,新建一个测试用例(运行失败)。
今天的意外收获,在找SELENIUM实例的时候,发现一个JS实例,功能各类非常全演示及代码都有,谢谢大神的分享:http://www.miniui.com/demo/#src=datagrid/pag ...
- AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)
接上一篇:AI:IPPR的数学表示-CNN基础结构进化(Alex.ZF.Inception.Res.InceptionRes). 抄自于各个博客,有大量修改,如有疑问,请移步各个原文..... 前言 ...
- JPA @MappedSuperclass注解
该注解只能引用于类上,使用该注解的类将不是一个完整的类,不会映射到数据库的表中,但是该类的属性会映射到其子类的数据库字段中 @MappedSuperclass注解使用在父类上面,是用来标识父类的作用 ...