合众为一,分布式系统的原则

时间:2023-11-20 12:19:01

乔恩·克莱因伯格(Jon Kleinberg):康奈尔大学计算机科学系教授,与大卫·伊斯利(David Esley)合著《网络、群体与市场》。

合众为一,分布式系统的原则

如果你在25年前使用计算机,你只需关注面前那个硕大的盒子在发生什么。而现在,你在一个小时内使用的应用程序就可能遍布全球。在大多数情况下,我们已经无法判断数据来自哪里,我们甚至为这种方向感的丧失发明了一个专用名词——“云”,我们的信息、照片和网络文件都存放在“云”中某处。

“云”不是一个独立的事物。当你创建电子邮件账号或社交网络个人主页时,这一看似简单的过程实际上是在大量物理元素的共同作用下完成的,用计算机科学的术语来说就是“分布式系统”。我们不能将其想象成一个独立而简单的东西,这涉及更广泛的问题:当微小事物能相对独立又相互合作地达成某种成果时,我们总是倾向于分布式系统的观点,即将此认为是单个统一的经验。这样的情况不仅发生在互联网领域,也发生在很多其他领域。例如,当一个大公司就新产品进行发布会时,就好像该公司是一个单独的主体。但如果从细节上看,这个公司是由成千上万名员工组成的。这样的例子还包括一个相互协作的巨大蚁群,以及创造我们当下体验的神经元。

分布式系统要面对的挑战之一,就是在千头万绪的复杂性中创造出单个统一经验的印象。更准确地说,这一挑战是由许多相互关联的小困难组成的。

一个基本的难题是一致性。分布式系统中的每一个元素都截然不同,而且它们和其他元素的关联也有限,因此,系统中的不同部分可能会产生无法调和的世界观。事实证明,这样的不一致会导致技术及其他方面的麻烦。比如,由于你的随身设备因为没有和邮箱同步,所以你不知道已经收到了回信;可能有两个人同时预订了同一航班的同一座位;某企业高管因为忘做备注而偏离了正轨;某一个排的士兵由于进攻太快而导致敌人警觉防卫。

为了解决这些问题,我们可能会希望强化某一种全局观并强制系统内部一致执行,这样的想法很正常。但是这会削弱我们使用分布式系统的可能性,使那些本可以组成整体的元素都成为巨大的障碍,甚至成为导致失败的潜在危险因素。如果一个CEO必须对公司大大小小的所有决策签字,那么这个公司一定运行不畅。

为了对潜在的设计理念有更清晰的理解,我们将引入一个比较详尽的例子。生活中有一种基本情境,我们需要集合很多人的信息和行为来达成目标,比如安全地共享信息。想象一下,我们为了保护数据而在多个电脑上备份,也就是说,我们只要将大多数备份电脑中的数据集合起来就能恢复机密数据库。但是因为数据共享的安全性问题,最终涉及的问题既不是电脑也不是互联网。或许海盗和宝藏的故事更能说明问题。

假如有一位年老的海盗王,他知道秘密宝藏的位置。退休之前,他打算将这一秘密告诉他那五个不争气的儿子。他认为,只要三个及以上的儿子能通力合作,就能发现宝藏,但是他又不希望某一个儿子独自找到宝藏。因此,他就计划将这个秘密分成五股,给每个儿子一股,这样他就能确保自己担心的事情不会发生。在他死后,只要其中三个儿子合股,就可以发现宝藏了,如果只有一两个,就没法找到。

如何做到这一点呢?其实将信息的线索分成五份并不难,但是这需要五个儿子在宝藏被发掘前通力合作。如何保证三个人合力就可以找到宝藏而两个就不行呢?

海盗王自己偷偷在地球仪上定位了一个圆圈,然后告诉每一个儿子,他将宝藏埋在了圆圈的最南端,然后告诉每个儿子一个圆圈上的点。三个点就足够确定一个圆圈,所以只要任意三个儿子将自己的信息合并起来,就能确定海盗王画的圆圈,并确定宝藏的地点,而两个人的信息联合是无法确定圆圈的。这是一种很好的策略,并被广泛应用。密码学专家阿迪·沙米尔(AdiShamir)发现,这种秘密共享的图式就是现代数据安全的基本原则,任何数据都能通过在圆上确定点来解码,也可以通过同一个圆上的点来还原信息。

很多关于分布式系统的论著也在探讨这一问题。一般来说,分布式系统的原则让我们能够理解不同相互作用而形成的复杂系统。如果我们足够幸运,可以纵观某一个全局网络、某一个全球银行系统或者某一种整体感受和体验,就会对保持经验整体性的艰难深有体会。