QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

开源的轻量级 JSON 存储 Kinto 介绍

  • 2015-12-22
  • 本文字数:2437 字

    阅读完需:约 8 分钟

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 了解关于错误的详细信息。

感兴趣的读者可以尝试 Kinto,这里是 Kinto 的文档说明。

2015-12-22 02:303076
用户头像

发布了 88 篇内容, 共 266.0 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

腾讯发布第二季度财报,腾讯云数据库收入同比增长超过30%

科技热闻

寻找海量数据集用于大数据开发实战(维基百科网站统计数据)

程序员欣宸

大数据 数据集 8月月更

圣庭医疗联合创始人谷红仓:高通量基因测序在药物研发和靶向治疗中的应用

阿里云弹性计算

HPC 高性能计算 生命科学 基因测序

预约直播 | 基于预训练模型的自然语言处理及EasyNLP算法框架

阿里云大数据AI技术

深度学习 阿里云 算法框架

组件解析:基础组件button的实现

独来独往

大前端 低代码 可视化 组件化 低代码平台

借我 1 小时,与 1000 人一起参与开源

腾源会

开源 腾源会

计算机网络(二、物理层)

计算机网络 8月月更

悟了,应该都了解分布式架构下负载均衡器吧

知识浅谈

负载均衡 8月月更

CSS

武师叔

8月月更

AntDB基于WAL日志的DML数据闪回实现

亚信AntDB数据库

AntDB 国产数据库 AISWare AIDB

迄今为止最完整的DDD实践

阿里技术

DDD 经验分享

Promise.allSettled 的 Polyfill 处理

汪子熙

JavaScript Promise Async 8月月更 web编程

设备管理|风机的日常运行与维护

PreMaint

企业设备管理 预测性维护 设备健康管理 风机的日常运维

GitHub标星139K的:“嵌入式Linux系统开发教程”

收到请回复

Java Linux 程序员 嵌入式 #运维

我做了个《联机桌游合集: UNO+斗地主+五子棋》无需下载,点开即玩!叫上朋友,即刻开局!不看广告,不做任务,享受「纯粹」的游戏!

HullQin

CSS JavaScript html 前端 8月月更

直播商城系统——直播和电商的合理有效结合

开源直播系统源码

软件开发 直播系统源码 直播带货系统 直播商城系统 直播app系统

3 分钟温故知新 RxJS 【创建实例操作符】

掘金安东尼

前端 函数式编程 8月月更

【React源码系列】React Context原理,为什么我建议尽可能少的使用React Redux管理状态 审核中

爱切图的木子老师

react源码 react context react redux

Web登录很简单?开玩笑!

TimeFriends

8月月更

阿里云鲍文乐:基于事件的自动化运维最佳实践

阿里云弹性计算

事件 自动化运维 CloudOps

少儿编程是智商税吗?不花钱让孩子赢在起跑线!

博文视点Broadview

付费会员之我见(43/100)

hackstoic

商业模式

基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP

DS小龙哥

8月月更

Go-Excelize API源码阅读(十三)—— GetSheetVisible、SetSheetFormatPr

Regan Yue

Go 开源 源码解析 8月日更 8月月更

低代码实现探索(四十八)后端服务

零道云-混合式低代码平台

应用缺少POI数据,如何开发地点深度信息?

HarmonyOS SDK

开源一夏 | 使用 JavaScript 将文本转换为文件

海拥(haiyong.site)

JavaScript GitHub 开源 前端 8月月更

什么是文件存储?与对象存储有什么区别?

wljslmz

文件存储 8月月更

云原生(二十) | 深入了解Kubernetes(k8s)Service

Lansonli

云原生 k8s 8月月更

【LeetCode】课程表Java题解

Albert

LeetCode 8月月更

五分钟给你的 gRPC 服务加上 HTTP 接口

万俊峰Kevin

Go 微服务 gRPC web开发 go-zero

开源的轻量级JSON存储Kinto介绍_语言 & 开发_张龙_InfoQ精选文章