2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

开源的轻量级 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:303181
用户头像

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

关注

评论

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

Web2.0的巨头纷纷布局VC,Tiger DAO VC或成抵达Web3捷径

鳄鱼视界

疫情封控65天,我的居家办公心得分享 | 社区征文

程序员海军

远程办公 远程开发 初夏征文

煮饺子与docker、kubernetes之间的关系

字母哥哥

Docker 容器化 #Kubernetes#

ajax

Jason199

ajax 7月月更

疫情当头,作为Leader如何进行团队的管理?| 社区征文

码界西柚

团队管理 远程办公 7月日更 初夏征文

【算法刷题日记之本手篇】组队竞赛与删除公共字符

未见花闻

7月月更

Vuex(一)

小恺

7月月更

leetcode 650. 2 Keys Keyboard 只有两个键的键盘(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

秒杀系统设计

库尔斯

架构实战营

图解网络:什么是虚拟路由器冗余协议 VRRP?

wljslmz

网络技术 路由协议 7月月更 VRRP

DotNet圈里一个优秀的ORM——FreeSql

为自己带盐

7月月更 freesql dotnetcore

线程的启动与优先级

zarmnosaj

7月月更

最全SQL与NoSQL优缺点对比

雨果

sql NoSQL 数据库

性能测试如何创造业务价值

老张

性能测试 技术与业务

L3立法试水,为自动驾驶产业带来什么?

脑极体

电商系统微服务架构

极客土豆

为什么网站打开速度慢?

源字节1号

网站开发

为什么说数据服务化是下一代数据中台的方向?

雨果

数据中台 数字化转型 DaaS数据即服务

你开发数据API最快多长时间?我1分钟就足够了

雨果

API API开发

大话云原生之负载均衡篇-小饭馆客流量变大了

字母哥哥

Docker 负载均衡 云原生

Web侧防御指南

穿过生命散发芬芳

7月月更 Web防护

服务可见可观测性

阿泽🧸

微服务 7月月更

毕业总结

库尔斯

架构实战营

Web2.0的巨头纷纷布局VC,Tiger DAO VC或成抵达Web3捷径

股市老人

疫情当头,作为Leader如何进行代码版本和需求开发管控?| 社区征文

码界西柚

团队管理 远程办公 7月日更 远程开发 初夏征文

linux硬盘挂载教程

乌龟哥哥

7月月更

scrcpy这款软件解决了和同事分享手机屏幕的问题| 社区征文

尼露

Python XML-RPC实现简单的远程调用过程

宇宙之一粟

Python 7月月更

「Docker 那些事儿」容器很难理解?带你从头到尾捋一遍

Albert Edison

7月月更

linux-riscv-5.17 纯净源码

贾献华

7月月更

Spring Boot应用在kubernetes的sidecar设计与实战

程序员欣宸

Java Kubernetes Sidecar 7月月更

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