透明度:单一系统的错觉(第一部分)
即使我们可能对分布式系统还不太熟悉,但现在我们应该明白,根据定义,它们包含许多活动部件。这些活动部件使事情变得无比复杂,因为现在,我们不再是处理一个单独的系统,而是要处理一大堆角色(即节点)!
在之前的文章中,我们开始探讨在单一系统中我们可能习以为常的最简单的事情,在分布式系统中会变得多么复杂。我们知道节点可以自主运行和执行任务。在某种程度上,这反而是理解分布式系统比较容易的部分。
那么,节点之间如何协作呢?仔细想想,如果各个独立节点之间互不协作,那就违背了分布式的初衷!分布式系统中的节点必然需要相互通信,而我们都知道,这正是棘手之处。
但我们究竟为什么要让节点相互协作呢?有效实施后,分布式系统能为我们提供哪些优势?是时候一探究竟了。
系统的透明度
由于分布式系统仍处于研究和探索阶段,因此对该主题进行初步了解就会得出各种不同的结果。例如,您可能会发现,最著名的分布式系统定义之一就出自图灵奖得主、计算机科学家莱斯利·兰波特之手。
分布式系统是指,即使你不知道某台计算机的存在,它的故障也可能导致你自己的计算机无法使用。
——莱斯利·兰波特
我觉得这个定义最有趣的地方在于,它指出在使用分布式系统时,很多事情可能在你完全不知情的情况下发生。在兰波特的定义中,这意味着系统可能会出现故障(部分系统可能失效),但你(作为用户)可能根本察觉不到。
但我认为这个想法的核心在于,分布式系统会向你隐藏一些东西。
我们知道,分布式系统顾名思义,包含多台机器/进程/资源(称为节点),它们可能位于完全不同的位置。然而,在使用分布式系统时,一切看起来都像是一个整体。换句话说,即使我们(用户)可能同时与多个节点交互,但我们却感觉不到这一点。相反,我们很可能感觉自己是在处理一个单一的系统,或者一台机器/进程。
例如,当我们在基于网络的电商平台上订购商品时,我们实际上可能正在从一个节点获取数据,将数据发送到另一个节点,并等待来自另一个节点的响应,而这个节点本身可能又依赖于其他三个节点来完成某些操作!对我们这些最终用户来说,一切似乎都无缝衔接,就好像我们只是在与一个网站或平台交互一样。但实际上,正是许多节点协同工作,才使得这些流程看起来像是一个整体。
这是分布式系统中的一个常见概念,被称为分布式透明性。由自治节点组成但表现得像一个单一系统的分布式系统,被称为透明系统。
在设计分布式系统时,系统的透明性是一个关键因素。归根结底,透明性决定了系统中各个节点如何协同工作。换句话说,分布式系统如何处理透明性,就体现了系统如何向最终用户隐藏其“分布式”特性,使其呈现为一个统一的整体(而非分布式系统)。
但是,隐藏分布式系统的“分布”意味着什么?
如果我们把分布式系统想象成许多分散在各处但协同工作的节点,那么我们就可以推断出,这里可能存在一些需要“隐藏”的东西。例如,透明性可以隐藏系统在多个节点上处理数据的事实,也可以隐藏数据可能存在于多个协同工作的节点上的事实。
无论系统实际采用何种方式实现这一点,分布式透明性的最终目标都是营造一种错觉,即系统并非由一系列分散的部件(各种节点)组成,而是一个整体(单一系统)。值得注意的是,这种错觉——系统的透明性——不仅面向系统的最终用户,也面向使用系统的程序员,以及任何可能偶尔访问系统并调用它的应用程序。
我们隐藏的方式
既然我们已经了解了设计透明系统的目标,那么让我们深入探讨一下它在实践中究竟是什么样子。
在设计或观察分布式系统时,解决透明性问题的方法有很多种。这主要取决于我们想要“隐藏”系统的哪些行为。根据系统架构的不同,系统的某些“部分”可能比其他部分更容易伪装成“整体”。随着我们深入研究分布式系统中不同形式的透明性,这一点会变得越来越明显。那么,让我们开始吧!
获取透明度
在许多系统中,资源(可以是对象、数据、进程,甚至是机器)的访问方式可能与资源的实际形态和表示方式大相径庭。例如,分布式系统中的不同节点可能运行着不同的操作系统,这意味着同一资源在一个节点上的表示方式可能略有不同。
然而,尽管资源的真实呈现方式可能大相径庭,但如果我们希望最终用户感觉他们是在同一个系统中工作,就需要对他们隐藏这种差异。访问透明性使我们能够隐藏资源数据呈现方式及其访问方式上的任何差异。
访问透明性的绝佳应用案例之一就是你可能每天都在使用的API!API提供了一种可靠的资源访问方式,它使用相同且可重复的操作,可以在任何机器上复制这些操作,并产生相同的结果。即使数据形式发生变化,这些细节对最终用户也是隐藏的(或者对于API而言,这些细节也应该对程序员或任何使用API作为服务的外部应用程序隐藏)。访问透明性抽象化了这些细节,从而确保即使资源在某些时间或某些位置以不同的形式呈现,也能可靠地检索到它。
我们越深入思考,就越会意识到访问透明度其实掩盖了我们周围的一切!例如,你能在某个设备上阅读这篇文章,也是访问透明度的结果!网络正是依靠访问透明度来掩盖这样一个事实:无论你使用笔记本电脑、移动设备,还是在旧操作系统或新操作系统上浏览,网页的访问方式都相同(通过URL)。这又是一个假象!
然而,我们或许也能从中体会到,访问透明度的处理也可能充满挑战。如果我们的系统以某种方式呈现资源,而过时的操作系统无法处理(或无法正确处理),会发生什么情况?很可能导致我们访问资源的方式失效!在这种情况下,最终用户会发现他们实际上并非在与同一个系统交互,这破坏了我们努力追求的“透明性”假象。
位置透明度
正如分布式系统中不同节点上的资源可能以不同的方式呈现一样,不同的资源也可能位于不同的位置!位置透明性正是隐藏资源具体位置的关键所在。这种透明性使得系统内的对象能够始终如一地被访问,而无需考虑其位置(更不用说知道其位置了)。
互联网本身就是这种透明性的又一个绝佳例证;例如,一个网站位于一个可预测且显而易见的URL上。然而,该网站在互联网上的实际物理位置却被抽象化了,因为就最终用户而言,他们可以在一个逻辑命名的位置找到资源(网页)。URL实际上是“统一资源定位符”(uniform resource locator)的缩写,它完美地诠释了资源名称如何与资源的实际位置(例如,在特定服务器上)无关。
而网络并非唯一的例子。一个系统可以将对象存储在数据库中,也可以内联生成,或者实际存在于静态文件中;无论哪种情况,位置透明的系统都会对最终用户隐藏这一事实,并仅仅确保用户始终可以访问该对象,无论它位于何处(也不会透露其具体位置!)。
搬迁透明度
既然我们知道一个资源可以位于与另一个资源不同的位置,我们也可以得出结论:资源可以移动——也就是说,一个资源可以存在于一个位置,并在某个时刻需要移动到另一个节点。重定位透明性允许资源在被其他程序(或用户)使用或访问的同时,从一个节点移动到另一个节点。
迁移透明性需要两个重要组成部分协同工作。首先,被迁移的资源必须能够被“迁移”。这可能意味着将其复制到另一个位置,也可能意味着复制资源,将其移动到其他位置,然后再从原位置移除。其次,如果资源迁移透明,则需要“隐藏”其正在迁移的事实,因为很可能有人(最终用户、程序员,甚至是分布式系统中的另一个节点!)正在访问它。
由于这两个方面都需要加以考虑(无论如何!),因此在分布式系统中实现资源迁移透明性有时会非常复杂且棘手。如果资源“迁移”并不常见,那么有时甚至可能没有必要考虑资源迁移透明性。在这种情况下,与其创建资源迁移透明系统,不如直接将资源离线以进行迁移,这样可能更容易。
但是,如果有很多用户访问您的系统,或者需要经常移动资源,那么不考虑这种透明性就意味着分布式网络不再像一个单一的、统一的单元那样运行,因此对最终用户来说就不是完全透明的,这可能会也可能不会违背人们试图分发的系统的目的。
现在,我们或许已经领悟到其中的一个主题:有些形式的透明度比其他形式更难实现,但每种形式都倾向于向最终用户“隐藏”我们系统的复杂性,而且似乎都需要深思熟虑!
在本系列文章的第二部分,我们将探讨一些更复杂、更全面的分销透明度形式,以及它们带来的不同权衡和障碍。敬请期待第二部分!
资源
关于分销透明度及其诸多权衡取舍,有很多东西需要学习!以下是我最喜欢的一些资源,希望能帮助你开启学习之旅。
- 分布式系统原理,沃尔夫冈·埃默里希教授
- 透明胶片,乔恩·克罗克罗夫特教授
- 分布式软件开发,第一讲,弗朗西斯·马尔凯塞教授
- 分布式系统的目标,卢阮教授
- 分布透明度, Juhani Toivonen 教授
文章来源:https://dev.to/vaidehijoshi/transparency-illusions-of-a-single-system-part-1-17ao