如果我们有本地优先软件,情况会怎样?

2020-10-16 01:02:00

对于周四的第一次出版,我想和你们大家一起做一个“如果”的练习。他们说,这种“如果”技术就是Spotify等公司使用的技术(“如果你不必拥有自己的音乐库呢?”)。优步(Uber)(“如果每辆车都有可能变成出租车会怎么样”)达到他们目前的模式。

所以让我们试一试同样的东西。让我们问问自己:“如果互联网先离线会怎么样?如果我们有本地优先的软件,为进入离线SaaS模式铺平道路,会怎么样?实际上,这篇论文(“本地优先软件:您拥有您的数据,尽管有云”)的作者在他们的工作中提出了完全相同的问题,这将是我们今天要讨论的问题。离线优先的互联网会是什么样子?

“令人惊讶的是,如今我们在网上进行协作是多么容易。我们使用Google Docs进行文档、电子表格和演示文稿的协作;在Figma中,我们一起进行用户界面设计;我们使用Slake与同事交流;我们使用Trello跟踪任务;等等。我们依赖这些和其他许多在线服务,例如做笔记、计划项目或活动、记住联系人以及大量的商业用途。“。

我们都同意云应用程序让我们的生活变得更容易。如果没有我们今天拥有的所有这些实时协作云应用,高效的远程工作是不可能的。尽管如此,所有这些应用仍然带来了一些不便和威胁。举几个例子:您不是在这些服务中生成的数据的所有者,如果这些服务背后的公司破产并关闭它们的服务器会发生什么?更重要的是,它们都依赖于集中式基础设施,这很容易受到攻击、安全漏洞和停机。

想象一下,当服务器出现故障时,您感觉很有创意,并且您的“原创歌剧”即将完成,并且您意识到您所有的工作都丢失了。或者更糟(更有可能的情况),如果你失去了家庭连接,你甚至不能将丢失的工作归咎于云服务,那该怎么办?更不用说在飞机上或没有稳定的互联网连接的地方尝试使用这些工具的用户体验了。因此,实时协作极大地改善了我们的生活,但它可能会更好。

总而言之:云给了我们协作,但老式的应用程序给了我们所有权。难道我们不能两全其美吗?我们既希望通过云应用提供方便的跨设备访问和实时协作,也希望拥有您自己数据的个人所有权,这些数据体现在“老式”软件中。“。

这就是“本地优先软件”背后的原理,它优先使用本地存储(在您的设备内)和本地网络(如您的家庭WiFi),而不是远程数据中心的服务器。构建这一愿景并非易事,而且服务器(或分散存储加上中继-您知道我的目的是什么,对吗?;)-)几乎肯定仍然需要用于备份和互连目的。

因此,为了评估拥有“本地优先软件”的意义,作者在文章中定义了努力实现的七个理想:

没有旋转器,你的工作就在指尖:我想我们都会同意,尽管我们拥有了比几年前更强大的设备,但软件感觉越来越慢,越来越容易出错。“本地优先软件”应该受益于对互联网的较低依赖,以及对本地存储的使用比当前软件更快。

您的工作不是局限在一台设备上:这是一台很难的设备。正如当前的云应用程序允许您在每台设备上无缝工作一样,“本地优先软件”也应该能够实现这一点。更重要的是,它应该允许你与其他人(和他们的设备)进行协作,这样数据就不应该只留在你的设备上。要实现这一点,需要一个可靠的设备间同步系统。

显然,网络是可选的:由于本地优先应用程序将其数据的主要副本存储在每个设备的本地文件系统中,因此用户可以随时读写此数据,即使是在脱机状态下也是如此。稍后,当网络连接可用时,它将与其他设备同步。数据同步不一定要通过互联网:本地优先应用程序也可以使用蓝牙或本地WiFi将数据同步到附近的设备。此外,为了获得良好的脱机支持,软件最好在设备上作为本地安装的可执行文件运行,而不是作为Web浏览器中的选项卡运行。尽管可以使Web应用程序离线工作。用户可能很难知道应用程序的所有必要代码和数据是否都已下载。对于移动应用程序,在使用之前下载并安装整个应用程序已经是标准做法。

无缝协作:让我们用本文中一些引人注目的图片来说明这一原则:简而言之,冲突、冲突和更多冲突。谁以前没有经历过这种情况呢?

我个人最喜欢的协作方法(也是我觉得可以嵌入到“本地优先应用程序”中的)就是git使用的方法。您使用自己的本地代码版本,并定期将更改推送到存储库,以使每个人都可以使用它们。这目前是由开发人员手动完成的,但可以在应用程序基础代码中自动完成,这样只要有网络可用,设备就会推送新的更改。当然,这并不能阻止冲突的出现,但是我们会想办法解决它的,对吧?

现在:您的数据应该是持久的。事实上,它存储在你的本地设备中(并可能与其他设备同步),这真的可以让本地优先应用程序完美地做到这一点。

默认的安全和隐私:即您设备中的数据(以及与您交互的数据),以及加密的通道。

您保留最终所有权和控制权:在许多情况下,这是用户不想承担的责任。这就是为什么应该存在集中备份服务器、分散存储等后备系统的原因,这样,不习惯对自己的数字生活负责的用户可以将他们的监护权委托给其他人。

话虽如此,我们当前的云应用程序在多大程度上实现了这些令人向往的原则?

“尽管做了很多努力使Web浏览器更加离线友好(清单、本地存储、服务工作者和渐进式Web应用程序等),但Web应用程序的架构从根本上仍然是以服务器为中心的。在大多数Web应用程序中,离线支持是事后才想到的,因此结果是脆弱的。在许多网络浏览器中,如果用户清除cookie,本地存储中的所有数据也会被删除;虽然这对缓存来说不是问题,但这会使浏览器的本地存储不适合存储任何长期重要的数据。“。

你还记得我的出版物“如何让你的网络应用离线工作吗?”不幸的是,我在出版物中分享的“离线”设计仍然过于“以服务器为中心”,无法构建本地优先的应用程序。它可以让事情变得更好,但它们不足以达到我们的目标(并完全满足七项原则)。

然后,我们有一些技术在哲学上已经在帮助实现不同设备之间的离线同步存储,例如CouchDB/PouchDB:

“CouchDB是一个值得注意的数据库,它开创了一种多主机复制方法:几台机器每台都有一个完整的数据库副本,每个副本可以独立地对数据进行更改,任何一对副本都可以彼此同步以交换最新的更改。CouchDB是为在服务器上使用而设计的;Cloudant提供托管版本;PouchDB和Hoodie是使用相同同步协议但设计为在最终用户设备上运行的兄弟项目。“。

这也不足以实现我们所有的原则。在CouchDB中,您需要通过应用程序的代码显式地解决冲突(在某些场景中不是一项简单的任务)。

那么,目前是否有任何技术能够提供我们的系统所需的协作和冲突解决特性呢?幸运的是,让我向您介绍无冲突复制数据类型(也称为CRDT)。

CRDT是通用的数据结构,就像散列映射和列表一样,但是它们的特殊功能是从头开始就是多用户的。

让我们用上图来说明CRDT。我们有两个设备,它们的数据存储处于相同的初始状态。它们中的每一个都对数据执行独立的更新。CRDT结构将这些改变注册为更新操作,以便当在两个设备之间存在可用的网络通信时,它们可以交换其相应的更新并合并它们以达到其数据结构的共同状态。CRDT无法自动解决的唯一更改类型是当多个用户同时更新同一对象的相同属性时;在这种情况下,CRDT跟踪冲突值,并将其留给应用程序或用户解决。因此,最终避免冲突的方法是巧妙地设计CRDT数据结构,以尽可能多地防止这些多用户修改。

“CRDT与Git等版本控制系统有一些相似之处,不同之处在于它们操作的数据类型比文本文件更丰富。CRDT可以通过任何通信通道同步它们的状态(例如,通过服务器、通过对等连接、通过本地设备之间的蓝牙,甚至在U盘上)。CRDT跟踪的变化可以小到一次击键,从而实现Google Docs式的实时协作。但是您也可以收集一组更大的更改,并将它们作为批处理发送给合作者,这更像是Git中的拉取请求。因为数据结构是通用的,我们可以开发通用工具来存储、通信和管理CRDT,从而使我们不必在每个单独的应用程序中重新实现这些东西。“。

CRDT是一个真正让我兴奋的领域,已经有一些应用程序探索它们的用途,比如Atom的Teleype(用于P2P代码协作)。我强烈推荐观看这篇论文作者之一的视频,以了解CRDT。预计短期内会有一份关于CRDT的时事通讯出版物。

本文分享了一些“本地优先应用”实现的POC,例如协作看板或协作绘图应用。

对等系统永远不会完全“在线”或“离线”,因此很难推断数据是如何在其中移动的。

CRDT不需要对等网络层;使用服务器进行通信对CRDT来说很好。但是,为了完全实现本地优先软件的寿命目标,我们希望应用程序的寿命超过其供应商管理的任何后端服务,因此分散解决方案是合乎逻辑的最终目标。

在我们的原型中使用P2P技术产生了好坏参半的结果。一方面,这些技术还远远不能投入生产:NAT穿越(另一个有趣的研究和探索领域)尤其不可靠,这取决于用户当前连接的特定路由器或网络拓扑。但是P2P协议和分散的Web社区所提出的承诺是实质性的。在一个依赖于集中式API的世界里,没有互联网接入的计算机之间的实时协作感觉就像魔术一样。

所以现在是我把这个“如果”练习发挥到极致的时候,并建立在几周前我对新互联网的愿景之上。“本地优先的应用程序”似乎是我们在用户体验、安全和隐私方面向互联网迈进的飞跃。根据论文作者的说法,网络通信仍然是一个未解决的问题,是吗?在Web3领域内,针对“本地优先应用程序”提出的问题的许多解决方案正在解决(其中许多可能已经得到解决)。

如果我不想负责存储我的数据怎么办?使用分散存储(Filecoin)。

如果我的设备没有足够的计算能力来运行某些任务怎么办?将负载转移到分散计算服务(GOEM)。

我们如何与NAT后面的设备通信?Libp2p、NAT穿越、激励中继等。据我所知,这实际上可能是最不活跃的“进行中的工作”之一。

在没有互联网连接的情况下,我们如何通过家庭连接进行通信?WiFi卸载、网状网络等。

所以引用我最近看到的一条推文:“那么多去中心化的网络东西完全没有意义,而其中的一小部分是如此珍贵和美妙。”让我们用我们正在开发的这些珍贵而精彩的软件为新的互联网铺平道路。