目录

序言

本书专注于云原生应用的开发。云原生应用的架构旨在利用一些已被证明在世界顶级大型网站中行之有效的特定工程实践。这些实践大多非同寻常,但对前所未有的可扩展性和效率的需求激发了它们的开发,并推动了真正需要它们的少数公司采用这些实践。当一种方法被成功应用足够多次后,它就成为了一种“模式”。在本书中,“模式”指的是一种可以复制以产生预期结果的方法。使用本书中包含的任何模式都会对应用程序的架构产生影响,有些影响较小,有些影响较大。

过去,许多此类模式的实施风险高、成本高,因此大多数公司都选择避免使用它们。但这种情况已经改变。云计算平台现在提供的服务通过屏蔽应用程序的大部分复杂性,显著降低了风险和成本。使用这些模式的预期收益不变,但实现这些收益的成本和复杂性却降低了。现在大多数现代应用程序都可以实际利用这些以前很少使用的模式。

本书中描述的架构模式之所以被选中,是因为它们对构建云原生应用程序非常有用。这些模式并非云平台特有,而是都与云平台密切相关。

简而言之,云原生应用程序利用云平台服务,以经济高效的方式自动横向分配资源,以满足当前需求,在不造成停机的情况下处理瞬态故障和硬件故障,并最大限度地降低网络延迟。本书将对这些术语进行详细解释。

应用程序无需支持数百万用户即可从云原生模式中获益。除了可扩展性之外,云原生模式还具有其他优势,这些优势适用于许多 Web 和移动应用程序。本书也将探讨这些优势。

这些模式假定使用云平台,但并非指任何特定的云平台。一般预期在可扩展性入门(第 1 章)中进行了概述。

读者对象

本书面向所有参与或希望参与软件架构(尤其是云架构)相关讨论的人士。读者对象不仅限于职位名称中包含“架构师”的人员。本书内容也适用于开发人员、首席技术官 (CTO) 和首席信息官 (CIO);以及技术测试人员、设计师、分析师、产品经理和其他希望了解基本概念的人员。

如果想要深入学习本书内容之外的知识,读者可以选择不同的学习路径。有些读者可能不需要本书以外的信息。而对于那些希望深入学习的读者来说,本书只是一个起点。附录 A 提供了许多延伸阅读的参考资料。

本书缘起

自 2008 年微软专业开发者大会 (PDC) 发布以来,我一直在研究云计算和 Windows Azure 平台。为了加速学习,我于 2009 年创立了波士顿 Azure 云用户组,并开始撰写和发表有关云计算主题的文章和演讲,之后又开始从事咨询工作。我意识到,许多技术人员并不了解他们多年来使用的应用程序构建技术与云原生应用程序构建技术之间的显著差异。

这本书正是我当初开始学习云计算和Azure,甚至是十年前学习扩展时梦寐以求的。可惜这样一本书并没有自然而然地出现,所以我自己写了一本。本书中的原则、概念和模式如今愈发重要,使其比以往任何时候都更具现实意义。

本书的假设

本书假设读者了解云计算的概念,并熟悉如何使用云服务在 Windows Azure、Amazon Web Services、Google App Engine 或类似的公有云或私有云平台上构建应用程序。本书不要求读者熟悉云原生应用程序的概念以及如何使用云平台服务构建云原生应用程序。

本书旨在普及知识和提供信息。虽然本书将帮助读者理解云架构,但并不推荐使用任何特定的模式。本书的目标是为读者提供足够的信息,以便他们做出明智的决策。

本书侧重于概念和模式,并非总是直接讨论成本。读者应考虑使用云平台服务的成本以及开发工作量方面的权衡。请了解您所选云平台的定价计算器。

本书包含一些对构建云原生应用程序有用的模式。本书并非着重于 如何做(除了理解所需内容之外),而是着重于 何时 和 为何 应用某些模式,以及您可能会发现 Windows Azure 中的哪些功能很有用。本书有意避免深入探讨详细的实现层面,因为有很多其他资源可以满足这些需求,而且这样做会分散读者对真正重点——架构——的注意力。

本书并未全面阐述如何构建云应用程序。模式章节的重点在于理解每种模式在构建云原生应用程序时的价值。因此,本书并未涵盖所有方面;重点在于整体框架。例如,在数据库分片模式(第 7 章)中,诸如优化查询和检查查询计划之类的技术并未讨论,因为这些技术在云端并无不同。此外,本书并非旨在指导开发,而是提供一些架构选项;书中提供了一些参考资料,指向更多实现许多模式的资源,但这并非本书的重点内容。

本书内容

本书包含两种类型的章节:入门指南和模式。

各章节内容如下:

可扩展性入门(第 1 章)
本指南着重解释可扩展性,强调垂直扩展和水平扩展之间的关键区别。

水平扩展计算模式(第 2 章)
这一基础模式专注于水平扩展计算节点。

以队列为中心的工作流程模式(第 3 章)
这一基本的松耦合模式着重于异步传递从用户界面发送到处理服务的命令请求。此模式是 CQRS 模式的一个子集。

自动缩放模式(第 4 章)
这一自动化操作的基本模式使水平扩展更加实用且成本高效。

最终一致性入门(第 5 章)
本指南介绍最终一致性并解释了一些使用方式。

MapReduce 模式(第 6 章)
此模式着重于应用 MapReduce 数据处理模式。

数据库分片模式(第 7 章)
此高级模式着重于通过分片实现数据的水平扩展。

多租户和通用硬件入门(第 8 章)
本指南介绍多租户和通用硬件,并解释了云平台为什么使用它们。

忙音模式(第 9 章)
此模式着重于应用程序在云服务返回忙音而非成功响应时应如何处理编程请求。

节点故障模式(第 10 章)
此模式着重于应用程序在运行所在的计算节点关闭或发生故障时应如何响应。

网络延迟入门(第 11 章)
本基础指南解释了网络延迟以及网络延迟造成延迟的原因。

共定位模式(第 12 章)
此基础模式着重于避免不必要的网络延迟。

代客密钥模式(第 13 章)
此模式着重于高效地与不受信任的客户端一起使用云存储服务。

CDN 模式(第 14 章)
此模式着重于通过全球分布式边缘缓存来降低常用文件的网络延迟。

多站点部署模式(第 15 章)
此高级模式着重于将单个应用程序部署到多个数据中心。

附录 A
附录包含对希望获取与本书介绍的入门指南和模式相关的其他材料的读者的参考资源列表。

入门指南的存在是为了确保读者具有必要的背景知识来欣赏该模式;入门指南前置于需要该背景知识的模式章节。模式是本书的核心,描述了如何应对您在云中可能遇到的特定挑战。

由于各个模式往往会影响多个架构关注点,这些模式难以归纳到清晰的层次结构或分类法中;相反,每个模式章节都包含影响部分(列出架构影响范围)。其他章节包括背景(这个模式可能在云中何时有用);机制(模式如何工作);示例(使用 Page of Photos 示例应用程序和 Windows Azure);以及最后的简要总结。此外,还包含许多跨章节参考,以突显模式重叠或可以配合使用的地方。

虽然示例部分使用 Windows Azure 平台,但应将其视为章节的核心部分,因为其中讨论了应用模式的具体示例。

本书旨在供应商中立,但示例部分在模式章节中必然使用 Windows Azure 特定的术语和功能。尽可能使用现有的众所周知的概念和模式名称。某些模式和概念没有标准的供应商中立名称,因此本书对其进行了定义。

在 Windows Azure 上构建 Page of Photos

每个模式章节都会对一种云架构模式进行总体介绍。在介绍完该模式之后,会深入描述一个应用该模式的具体用例。这旨在提供一个具体的示例,展示如何应用该模式来改进云原生应用程序。本书通篇使用一个名为Page of Photos的演示应用程序。

Page of Photos应用程序,简称 PoP,是一个简单的 Web 应用程序,允许任何人创建帐户并向该帐户添加照片。

每个 PoP 帐户都有自己的网址,网址由主网址加上文件夹名称组成。例如,http://www.pageofphotos.com/widaketi 显示名为 widaketi 的文件夹下的照片。

之所以选择 PoP 应用程序,是因为它非常容易理解,同时又具备足够的复杂性来阐释各种模式,而不会被示例应用程序的细节所干扰。

对 PoP 的这个基本介绍应该能帮助您入门。在每个模式章节的示例部分,PoP 都会添加新功能,这些功能始终使用 Windows Azure 的功能,并且始终与该章节重点介绍的通用云模式相关。本书结束时,PoP 将成为一个更完整、架构更完善的云原生应用程序。

虽然 PoP 示例中使用的是 Windows Azure,但其中的概念同样适用于 Amazon Web Services 和其他云服务平台。我选择 Windows Azure 是因为我拥有深厚的专业知识,并且深知它是一个功能强大且特性丰富的云原生应用开发平台。这是一个务实的选择。

术语

本书对应用程序和Web应用程序这两个术语的使用较为宽泛,尽管在某些情况下,服务、系统等术语也可能同样适用。如有需要,会使用更具体的术语。

本书使用的约定

本书使用以下排版约定:

斜体 用于表示新术语、URL、电子邮件地址、文件名和文件扩展名。

固定宽度 用于程序列表,以及段落中引用程序元素,例如变量名或函数名、数据库、数据类型、环境变量、语句和关键字。

固定宽度粗体 用于显示用户应按字面输入的命令或其他文本。

固定宽度斜体 用于显示应替换为用户提供的值或根据上下文确定的值的文本。

使用代码示例

本书旨在帮助您完成工作。通常情况下,您可以在程序和文档中使用本书中的代码。除非您复制了大量代码,否则无需联系我们获得许可。例如,编写一个使用本书中几段代码的程序无需获得许可。销售或分发包含 O’Reilly 书籍示例的 CD-ROM 则需要获得许可。通过引用本书并引用示例代码来回答问题无需获得许可。将本书中的大量示例代码整合到您的产品文档中则需要获得许可。

我们感谢您注明出处,但并非强制要求。注明出处通常包括书名、作者、出版社和 ISBN。例如:“《云架构模式》,作者:Bill Wilder(O’Reilly)。版权所有 2012 Bill Wilder,ISBN:978-1-449-31977-9。”

如果您认为您对代码示例的使用超出了合理使用范围或上述许可范围,请随时通过 permissions@oreilly.com 与我们联系。

在 GitHub 上查看本页或提交勘误 ↗