评估GunJS作为本地优先数据库

2020-05-02 18:02:48

Gun.js是一个我已经关注了好几年的开源项目,每隔一段时间我都会回顾一下它的进展情况,以及我当时正在开发的项目是否适合它。

作为少数几个真正提供大规模工作的点对点/去中心化系统的玩家之一,Gun脱颖而出。

看起来他们有一个CRDT设置,在那里他们反规范化任何嵌套的数据结构,因此您可以修改一个客户端上的一个属性和另一个客户端上的另一个属性,然后这些更改将被合并。对于给定的原子属性,它使用";last-write-wins";(对于基于混合逻辑时钟的";last";的尽力而为定义)。

是否内置一致性验证,以检测您是否处于损坏状态?(例如,Merkle尝试或类似的散列方法以确保对等数据不会以某种方式损坏)。

我在文档中看不到任何关于这方面的内容,也无法从源代码中找出任何东西。我在社区聊天中询问了这一点,显然有一些散列用于确定何时停止两个对等点之间的同步。

从他们的CRDT文档看,他们似乎使用了混合逻辑时钟,所以意图应该被很好地保存下来。

客户端存储其使用的数据的副本(可以是整个图的子集),并且还跟踪";未同步的更改";。

o(数据大小)-这意味着服务器不保留更改的历史记录,因此能够减小大小。

似乎有相当多的通信来回进行,协商哪些节点需要复制,以及将对等点相互连接--将一个对等点需要的数据与另一个对等点拥有的数据进行中继。

这段代码是以一种非常独特的风格编写的,所以我在解密它时遇到了很大的困难(😅)。它不使用一致的格式,并广泛使用变异、单字符变量名、自定义异步执行流等。此外,代码的一些核心部分依赖于访问变异(猴子修补)全局对象。现在,美学当然不是万能的,但代码的可读性、可评价性等都可以提升到可以投入生产的水平。

一位社区成员使用异步/等待、更现代的格式等等创建了一个Gun.js的打字脚本重写,我不知道是否有计划赋予它官方地位,或者它有多完整。

它对架构更改没有任何限制。然而,这也意味着没有适当的模式验证。

是的,没有阵列。GRON具有内置集合的概念,可以作为一种无序数组使用,但您需要单独添加每一件物品,并且要求物品是唯一的,当然,您还必须自己解决如何对它们进行排序的问题。(这句话的意思是:“枪”的概念是内置的,它可以作为一种无序数组来使用,但你需要单独添加每件物品,当然,你还得自己想办法对它们进行排序)。(进一步的调查发现了这个实验项目,它似乎正在为枪中的排序数组支持工作,但它目前肯定不处于可重用/生产状态)。

此外,GRON强制执行反规范化,因此当您检索其中包含";个嵌套对象的对象时,需要进行另一个异步调用来获取嵌套对象。您可以选择包含一个脚本来提供一个.open()函数,该函数会为您执行额外的调用,但是文档会引导您远离它(如果您的图嵌套得很深,那么递归加载所有内容可能会非常昂贵)。

开箱即用支持的";存储后端是平面文件(用于NodeJS)和浏览器中的localStorage或IndexedDB。看起来您将能够为sqlite/postgres/等编写存储适配器,但是您将开辟自己的道路。

它可以与Google Drive、Dropbox等同步吗?(以便用户自带存储后端。)。

客户端实现是否要求所有数据都驻留在内存中,或者它是否可以处理大部分持久化的数据?

使用默认的(本地存储)持久性,所有数据都驻留在内存中,但显然(同样,没有文档记录,但我在社区聊天中询问过)对于其他持久性后端,它不需要所有数据都驻留在内存中。

是!。默认情况下,添加到用户子图下的数据经过加密签名,但可公开读取。您也可以选择使用用户的密钥对对数据进行加密和解密。根据您的加密方式,它可能会阻止合并您的对象(例如,如果您像本例中那样加密整个对象,则系统无法合并加密的对象)。

在某些用户只能访问数据子集的情况下,是否可以进行多用户协作?

是的,但是您将自己实现许多自定义加密/密钥管理逻辑。开箱即用,GUN为您提供用户身份验证,其中每个用户都有一个可用于加密的公钥和私钥。