推出今天的应用程序,可以说是分布式系统开发的一个奇迹。基于不同的系统架构,构成应用程序的每个功能或服务可能会在位于不同地理位置的不同系统上执行,并以不同的计算机语言编写。应用程序的组件可能托管在用户自己携带的强大系统上,可以与世界各地的应用程序组件或服务进行通信(它们都是数据中心的复制品)。令人惊讶的是,这些应用程序的用户通常不会响应复杂的环境请求。此类请求包括当地时间、当地天气或前往酒店的路线等信息。让我们慢慢开始,看看使这成为可能的工业魔法,并考虑开发人员在处理这种复杂性时应牢记哪些想法和规则。系统设计的演变图1:系统设计的历史演变来源:交互设计基础,技术系统的社会设计:为社区构建技术从程序员编写应用程序,手工将它们编译成他们正在使用的机器的语言,从使用拨动开关将单独的机器指令和数据直接输入计算机内存开始,应用程序开发已经取得了长足的进步。随着处理器变得越来越强大,系统内存和在线存储容量增加,计算机网络功能急剧增加,开发方法也发生了变化。现在数据可以从地球的一侧传递到另一侧,这比早期计算机将数据从系统内存移动到处理器本身的速度还要快!让我们来看看这一惊人转变的一些亮点。单体设计早期的计算机程序基于单体设计,其中所有应用程序组件都设计为在一台机器上执行。这意味着程序中包含用户界面(如果用户实际上可以与程序交互)、应用程序处理规则、数据管理、存储管理和网络管理(如果计算机连接到计算机网络)等功能。这些写起来很简单,但是这些程序会变得越来越复杂,更难记录,也更难更新和更改。此时,机器本身成为企业的一项重大开支,因此应用程序旨在尽可能多地使用机器。客户端/服务器架构随着处理器变得更强大、系统和在线存储容量增加以及数据通信变得更快和更经济,应用程序的设计也在不断发展以跟上发展的步伐。应用程序逻辑被重构或分解,允许每个应用程序在不同的机器上执行,并且在组件之间插入一个不断改进的网络。这使得一些功能能够迁移到当前可用的成本最低的计算环境。这种演变经历了几个阶段:终端和终端仿真早期的分布式计算依赖于专用的用户访问设备——终端。应用程序必须了解它们使用的通信协议并直接向设备发出命令。当廉价的个人计算机(PC)出现时,终端被运行终端仿真程序的PC所取代。此时,应用程序的所有组件仍然驻留在单个大型机或小型计算机上。随着PC变得越来越强大,支持更大的内部和在线存储,以及网络性能的进一步提高,企业越来越依赖它们。应用程序被细分或分解,以便在本地PC上提取和执行用户界面。应用程序的其余部分继续在数据中心的系统上执行。这些PC通常比它们所取代的终端更便宜,而且它们还有其他优势。这些PC是多功能设备,可以运行在它们所取代的终端上无法运行的提高生产力的应用程序。这种结合促使企业在更新或刷新应用程序时更青睐客户端/服务器应用程序架构。中端客户端PC的发展仍在快速进行。一旦具有更大存储容量的更强大的系统可用,企业就会使用它们将更多的处理操作从数据中心的昂贵系统转移到廉价的用户办公桌。此时,用户界面和部分计算任务迁移到本地PC。这使得大型机和小型机(现在是服务器)的使用寿命更长,从而降低了企业的整体计算成本。重型客户端随着PC变得越来越强大,可以从后端服务器迁移更多应用程序。在这里,除了数据和存储管理功能之外的所有功能都已迁移。进入互联网和万维网公共互联网和万维网出现了。客户端/服务器计算仍在使用。为了降低总体成本,一些企业已经开始重新构建他们的分布式应用程序,以使用标准互联网协议进行通信,并使用Web浏览器代替以前定制的用户界面功能。后来,一些应用程序功能被用Javascript语言重写,以便它们可以在客户端计算机上本地执行。服务器端的改进行业的创新不仅仅集中在客户端的通信环节,对服务器端也有很大的改进。企业开始利用许多更小、更便宜的行业标准服务器,这些服务器能够支持部分或全部基于大型机的原始功能。通过这种方式,他们可以减少需要部署的昂贵主机系统的数量。然后,远程PC可以与许多服务器通信,每个服务器都支持自己的应用程序组件。此环境中使用专用数据库和文件服务器。之后,其他应用程序功能将迁移到应用程序服务器。网络是业界高度关注的另一个领域。企业开始使用提供防火墙和其他安全功能的专用Web服务器、文件缓存功能以加速应用程序数据访问、电子邮件服务器、Web服务器、Web应用程序服务器、跟踪和控制用户凭据的分布式名称服务器,以及用于访问数据和应用。打包在设备服务器中的网络服务列表一直在增长。基于对象的开发PC和服务器的快速变化的能力,加上处理能力、内存和网络价格的急剧下降,对应用程序开发产生了重大影响。IT中最大的成本不再是硬件和软件,而是通信、IT服务(员工)、电力和冷却。软件开发、软件维护和IT运营出现了新的重要性,开发过程也发生了变化,以满足系统便宜而人员、通信和电力日益昂贵的新现实。图2:全球IT支出预测来源:Gartner全球IT支出预测,2018年第一季度企业希望通过改进数据和应用架构来实现员工价值最大化。结果是面向对象的应用程序和开发方法。许多编程语言,例如以下语言,都支持这种方法:C++、C#、COBOL、Java、PHP、Python、Ruby应用程序开发人员在定义和记录数据结构时更系统地编写以适应变化。这种方法还使维护和改进应用程序变得更加容易。开源软件Opensource.com为开源软件提供了以下定义:“开源软件是任何人都可以检查、修改和增强源代码的软件。”“而且有些软件的源代码只对个人、团队或专有软件的原作者开放,才能合法复制、检查和修改。要使用专有软件,计算机用户必须同意(通常是接受首次运行软件时显示的许可证),未经软件作者明确许可,他们不会对软件进行任何更改。MicrosoftOffice和Adob??ePhotoshop都是专有软件的例子。虽然开源软件自计算早期就已存在,但直到1990年代才脱颖而出,当时出现了完整的开源操作系统、虚拟化技术、开发工具、数据库引擎和其他重要功能。开源技术通常是基于Web和分布式计算的关键组件。其中,以下几类开源软件比较受欢迎:开发工具应用支持数据库(平面文件、SQL、No-SQL、内存)分布式文件系统消息传输/队列操作系统集群分布式计算强大的系统、快速的组合网络和复杂软件的可用性已将主要应用程序开发从单一形式转变为更加分布式的形式。然而,企业已经意识到,有时从头开始比尝试重构或分解旧应用程序更好。当企业开始创建分布式应用程序时,他们经常会发现一些有趣的副产品。一个设计得当的应用程序,已经被分解成单独的功能或服务,可以由不同的团队并行开发。快速应用程序开发和部署,也称为DevOps,是利用新环境的一种方式。面向服务的体系结构随着行业从客户端/服务器计算模型发展到更加分布式的方法,出现了术语“面向服务的体系结构”。这种方法基于分布式系统的概念、消息队列和传递的标准,以及作为共享数据和数据定义的标准方法的XML消息传递。各个应用程序的功能被打包到面向网络的服务中,这些服务接收请求它们执行特定服务的消息,并在它们执行该服务后,将响应发送回请求该服务的功能。这种方法还提供了一个额外的好处,即给定服务可以托管在网络中的多个位置。这提高了整体性能和可靠性。除此之外,现在还有很多工作负载管理工具,用于接收服务请求,检查可用容量,将请求转发给可用容量最大的服务,然后将响应发送回请求者。如果特定服务器没有及时响应,工作负载管理器将简单地转发该服务的另一个实例。它还会将无响应的服务标记为失败,并且不会向它发送额外的请求,直到它收到一条指示该服务仍在运行的消息。设计分布式系统的重要考虑因素既然我们已经走过了50多年的计算历史,让我们来看看分布式系统开发人员的一些经验法则。这需要考虑很多,因为分布式解决方案可能在许多地方、不同类型的系统中运行组件和服务,并且必须来回传递消息以执行工作。要成功创建这些解决方案,需要仔细考虑。此外,还应具备对所用的每个主机系统、开发工具和消息系统的专业知识。确定需要做什么我们需要考虑的第一件事是我们究竟需要完成什么。虽然这听起来很简单,但却非常重要。令人惊讶的是,有多少开发人员在确切了解需要什么之前就开始构建东西。通常,这意味着他们构建了不必要的功能并浪费了时间。引用YogiBerra的话:“如果你不知道你要去哪里,你最终会去别的地方”。首先是了解要做什么、哪些工具和服务已经可用,以及使用最终解决方案的人应该看到什么。交互和批处理快速响应和低延迟往往是我们的要求,所以明智的做法是考虑在用户等待时应该做什么,以及什么可以放入批处理中,以事件驱动或时间驱动的方式执行。驱动规划。在考虑了最初的功能分离之后,好的做法是计划什么时候后台、批处理需要执行,这些功能操作的数据是什么,以及如何确保这些功能可靠,何时可用,以及如何防止数据丢失.功能应该在哪里托管只有在详细规划了“什么”之后,才应该考虑“在哪里”和“如何”。开发人员有他们最喜欢的工具和方法并经常调用它们,即使它可能不是最佳选择。伯纳德巴鲁克说:“如果你只有一把锤子,那么一切看起来都像钉子”。了解企业制定的企业标准也很重要。仅仅因为当前流行而选择一种工具是不明智的。这个工具可以完成这项工作,但要记住的是,它构建的一切都需要维护。如果你构建的东西只有你能理解或维护,那么你可能会在余下的职业生涯中将自己束缚在该功能上。我自己经历过这个,我认为我创建的功能运行良好、轻量级且可靠。但是在我离开那家公司的十年里,我不断接到关于这些功能的电话,因为后来的开发人员无法理解它们是如何实现的,而我写的文档也早就丢失了。在分布式解决方案中,应单独考虑每个功能或服务。该功能应该在企业数据中心吗?还是使用云服务提供商?或两者?还要考虑到,在某些行业中,有监管要求指导我们选择需要维护和存储数据的位置和方式。其他需要考虑的事情包括:功能主机应该是什么类型的系统。有没有更适合这个功能的系统架构?系统应该基于ARM、x86、SPARC、Precision、Power还是大型机?是否有特定的操作系统可以为该功能提供更好的计算环境?Linux、Windows、UNIX、SystemI或SystemZ会是更好的平台吗?是否有特定的开发语言更适合此功能?它是一种特定类型的数据管理工具吗?您应该使用平面文件、SQL数据库还是No-SQL数据库?还是非结构化存储机制更好?功能是否应该托管在虚拟机或容器中以便于迁移、自动化和编排?在2000年代初期,运行Windows或Linux虚拟机通常是首选。虽然它们为方法提供了重要的隔离,并且在必要时很容易重新启动或移动它们,但它们的处理、内存和存储要求非常高。容器是实现虚拟化的另一种方式,它提供类似级别的隔离、重启和迁移方法的能力,并且消耗更少的处理能力、内存或存储。性能性能是另一个重要的考虑因素。在定义构成解决方案的功能或服务时,开发人员应注意它们是否具有重要的处理、内存或存储要求。重要的是要仔细研究这些问题,以了解功能是否可以进一步细分或细分。进一步的分区将允许增加并行处理,这很可能会提供性能改进。当然,这是以增加复杂性为代价的,这些复杂性可能更难管理和保护。可靠性在高风险企业环境中,解决方案的可靠性至关重要。开发人员必须考虑何时可以要求人们重新输入数据、重新运行功能或何时功能不可用。数据库开发人员在1960年代遇到了这个问题并开发了原子函数的概念。也就是说,函数必须完成或部分更新必须回滚,以便数据处于函数启动之前的状态。分布式系统也需要这种思维方式,以确保即使在服务失败和中断的情况下也能保证数据完整性。例如,在关键任务消息系统中,必须存储消息,直到它们被收件人确认为止。如果没有成功接收到消息,则必须重新发送原始消息并将失败报告给系统管理员。可管理性虽然不如核心应用程序功能那么有趣,但可管理性仍然是保持应用程序正常运行的关键因素。所有分布式功能都必须完全检测,以允许管理员了解每个功能的当前状态,并在需要时更改功能的参数。毕竟,与它们所取代的单一系统相比,分布式系统由更多的活动部件组成。开发人员必须始终注意使这种分布式计算环境易于使用和维护。这给我们带来了一个绝对要求,即所有分布式功能都必须得到充分的检测,以使管理员了解它们的当前状态。毕竟,与它们所取代的单一系统相比,分布式系统本质上更复杂并且具有更多的移动部件。安全性确保分布式系统的安全性比单一环境中的安全问题要困难一个数量级。每个功能都必须单独保密,功能之间的通信链接也必须如此。随着网络规模和复杂性的增长,开发人员必须考虑如何控制对功能的访问,如何确保只有授权用户才能访问这些功能,以及如何将服务与其他服务隔离开来。安全性是必须添加到每个功能中的关键元素,而不是事后才想到的。必须避免和报告未经授权的功能和数据访问。隐私关于隐私主题的规范越来越多。欧盟的GDPR以及美国的HIPPA法规是每个面向客户系统的开发人员的重要考虑因素。掌握复杂性开发人员必须花时间思考如何在复杂的计算环境中将所有内容组合在一起。服务应该被封装成一个单一的功能,或者少量紧密相关的功能。维护这样的规则非常困难。如果一个特性在多个地方实现,将很难维护和更新。当一个函数的实例没有更新时会发生什么?这个问题非常具有挑战性。这意味着对于复杂应用程序的开发人员来说,维护每个功能所在位置的可视化模型是很有用的,这样它就可以在规则或业务需求发生变化时进行更新。通常,开发人员只需要花时间记录他们所做的事情、他们进行更改的时间以及这些更改的目的是什么,这样其他人就不必费力去理解某个功能在哪里或它是如何工作的理解成堆的代码。要成为分布式系统的架构师,开发人员必须掌握复杂性。开发人员必须掌握的内容开发人员必须掌握分解和重构应用程序架构,从团队的角度思考,并提高他们在快速应用程序开发和部署(DevOps)方法论方面的技能。毕竟,他们必须能够系统地思考哪些功能是相互独立的,哪些功能依赖于其他功能的输出才能工作。依赖于其他功能的部分功能最好作为单个服务来实现。将它们实现为单独的功能会产生不必要的复杂性,导致应用程序性能不佳,并给网络带来不必要的负担。虚拟化技术涵盖许多基础知识虚拟化是一个比虚拟机软件或容器更大的类别。这两个功能都被认为是虚拟化技术。当今的应用程序中至少使用了七种不同类型的虚拟化技术。虚拟化技术可用于增强用户访问应用程序的方式、应用程序执行的位置和方式、处理执行的位置和方式、网络功能的方式、数据存储的位置和方式、安全性的实现方式以及管理功能的实现方式。下面的虚拟化技术模型可以帮助开发者理解虚拟化的概念。图3:虚拟化系统的架构资料来源:7层虚拟化模型,VirtualizationReview.com从软件定义解决方案的角度思考开发人员从“软件定义”解决方案的角度思考也很重要。也就是说,将控制与实际处理分开,以便可以自动化和协调功能。可用的工具和策略当开发人员踏入这个复杂的世界时,他们不应该感到孤单。供应商和开源社区提供了许多强大的工具。各种形式的虚拟化都可以成为开发人员最好的朋友。虚拟化技术是您最好的朋友容器使开发可以在不相互干扰的情况下执行并且可以根据工作负载需求从一个系统迁移到另一个系统的功能成为可能。编排技术使控制多个功能并确保它们良好可靠地工作成为可能。它还可以在出现故障时重新启动或移动它们。支持增量开发:特性可以并行开发,准备就绪后部署。它们还可以使用新功能进行更新,而无需在其他地方进行更改。支持高度分布式系统:功能可以本地部署在企业数据中心,也可以远程部署在云服务商的数据中心。从服务的角度思考意味着开发人员必须考虑服务以及它们如何相互通信。定义良好的API定义良好的API允许多个团队更好地协同工作,并确保一切按计划进行。通常这意味着更多的前期工作,但最终还是值得的。为什么?因为整体发展可以更快。而且还减少了文档工作的工作量。支持快速应用程序开发这种方法也非常适合快速应用程序开发和快速原型制作(即DevOps)。如果执行得当,DevOps还可能需要非常短的部署时间。从标准的角度考虑分布式系统的开发人员应该充分考虑多供应商国际标准,而不是依赖单一供应商。这种方法避免了供应商锁定,并允许在每个领域找到最好的供应商。总结值得注意的是,快速应用程序开发和分布式系统部署的指导方针是从“慢慢来”开始的。最明智的做法是计划好你要去的地方和你要做什么,否则你很可能最终会错过你的目标,炸毁你的开发预算并且一事无成。
