无冲突复制数据类型简介

2020-07-07 07:24:49

亲爱的读者!如果您正在阅读这篇文章,很可能是因为您的浏览器指向了我的网站和/或点击了此页面的链接。也许您甚至正在从移动设备上阅读这篇文章!1激发这一切的最佳条件。

没错,当您构建Web应用程序时,您必须绝对、肯定地关注Web的分布式方面(除非您的应用程序是无状态的,比如我的网站)。

这意味着什么?您可能有一群用户。这些用户可能正在从各种设备操作他们的数据。某些设备的Internet连接速度可能很慢。设备可能随时脱机。

有时,应用程序开发人员会在这个问题上打赌:移动应用程序显示“您已离线”,不让您查看数据(最好的情况),或者静默丢弃信息(最坏的情况)。

构建分布式应用程序的难题之一是确定存储空间,理想情况下,该存储空间对于可能变得不可用、并发编辑等的用户应该具有弹性。

进入无冲突复制数据类型。™是计算机科学命名的一个有实际意义的光辉示例,它试图为存储问题提供灵活的解决方案。基本思想是这样的:您有数据。这些数据存储在多个副本上。CRDT描述如何协调这些副本以始终达到一致的状态。

请注意,CRDT有两种不同的类别:基于状态的CRDT和基于OP的CRDT。这两种CRDT的目的相同,但工作方式不同,有各自的设计权衡。在本系列中,我将主要关注基于状态的CRDT。

当然,这只是故事的一半。深入理解CRDT至少有两个方面。

了解所有种类(计数器、地图、套装、…)。以及如何将它们嵌入到应用软件中。

在本系列中,我想重点介绍第二个方面,并使用大量程序员熟悉的交互式笔记本、图和代码符号自下而上地解释所需的一切:JavaScriptI将使用几个库来测试代码和可视化数据,但除此之外,没有更多的依赖性。描述它们的研究论文通常假设有大量抽象代数的背景知识。我将试着温和地介绍一些必要的知识。

但是,如果您想更多地了解它们的用法,本系列不适合您。但不必担心:有大量资源可供查看,例如crdt.tech。此页面上没有跟踪信息,因此我甚至不会注意到您是否去了🤷。

但在我们开始讨论CRDT之前,我们首先需要做一些文书工作。

此处的所有代码片段都是实时的:此页面的功能类似于Jupyter笔记本。主要区别在于,所有代码都在浏览器中执行;没有到后端服务的往返。加载页面时会对代码片段进行评估,并可通过单击运行按钮重新评估这些代码片段。您可以根据自己的喜好随意更改任何代码片段,但请注意,后续代码片段不会自动重新运行。如果要重置会话(例如,因为删除了某些代码),只需重新加载页面即可。是。

这个页面有一个内置的测试运行器,它接受应该检查的命名属性。Term属性在编程中是重载的,所以让我澄清一下:我不是在谈论对象中的属性;相反,我谈论的是可以接受参数并返回真值的函数。换句话说,属性是一个谓词,在理想情况下应该对所有输入求值,以查看它是否始终成立。

在下面的示例中,我们有两个属性,一个是有效的,另一个是无效的,它们是使用快速检查库定义的,该库在FC对象下可用。

checkAll({";SUCCESS";:fc.property(fc.string(),x=>;x==x),";FAIL";:fc.property(fc.string(),x=>;x!=x)});

在幕后,Fast-Check会自动生成100个不同的输入。当然,100个不同的输入并不完全是所有的输入,但是由于有无限多的字符串,我们不能这样做,对吗?Fast-Check将根据指定的输入调用函数(例如x=>;x==x)(fc.string()生成仅包含可打印字符的ASCII字符串)。如果该函数返回False或引发异常,该属性将被标记为失败。否则,它将被标记为。

幸运的是,我们还可以在属性中使用CHAI断言来获取丰富的错误消息:

快速检查的伟大之处在于,它会自动向您显示它能找到的最小(希望也是最简单)的输入。这称为反例。可能有很多反例,但在这里,我们只显示一个。

您将在结果中看到一个失败,其中反例的长度为6,并且不只由空格组成。

请注意,一个属性可能是无效的,但我们仍然不会注意到它,因为Fast-Check没有为我们生成该输入,这是我们必须承受的风险。

有趣吗?为什么不和试跑者玩一会儿呢。当然,你可以修改上面的代码箱,但也许你害怕这样做。所以,我专门为你准备了一个特别的操场。狂野吧!

运行器还可以打印不同类型的输出,例如数组。请注意,只打印代码段中的最后一个表达式。

如果您定义的变量不带var(或const或let),则可以在后续的代码片段中访问它们。我将在整个系列中使用它。

我们可以使用interactiveRender符号为特定对象定义不同的打印。它可以声明为方法,并将由运行器自动调用:

class Test{structor(Value){this.value=value;}[interactiveRender](){return`Hi${this.value}!`;}}new Test(";Reader";)。

现在您就可以开始实际的介绍了。去这里学习所有关于合同的知识。

很棒的东西我发现这是非常容易理解的,因为我充其量对这类数学的掌握很肤浅。我只是在最近几周学习了格子理论(同时搜索偏序),发现你关于格子的文章很容易理解。1/(2 V 3)。

--David Kaye(--The";K&34;代表质量)(@dfkaye)2020年7月3日。

此页面是在桌面浏览器上开发的。我也尽了最大努力让它在手机浏览器上也可以访问,但我没有太多的经验,所以任何错误报告都很感激!-↩。

感谢那些读过本系列草稿并提供宝贵反馈的人:安德里亚、克莱门特·德拉法格、海科·西伯格、希莱尔·韦恩、约翰尼斯·林克、马修·魏德纳、公主。