写点什么

适合于云端部署的应用架构

  • 2014-03-24
  • 本文字数:2231 字

    阅读完需:约 7 分钟

基于云的应用与运行在私有数据中心的应用之间最大的差别就是可扩展性。云提供了按需扩展的能力,能够根据负载的波动对应用进行扩展和收缩。但是传统应用要充分发挥云的优势,并不是简单地将应用部署到云上就万事大吉,而是需要根据云的特点围绕可扩展性重新进行架构设计,近日 AppDynamics 的开发布道者 Dustin.Whittle撰文阐述了适合云端部署的应用架构,对我们传统应用往云端部署有很大的启发和借鉴意义。

应用的架构

Dustin.Whittle 给出了云应用的示例架构,它具有高度的可扩展性,如下图所示:

在这个图中,应用按照分层的理念进行了拆分,分别介绍如下:

**客户端层:** 客户端层包含了针对目标平台的用户界面,可能会包括基于 Web 的、移动端的甚至是胖客户端的用户界面。一般来讲,这可能会是 Web 应用,包含诸如用户管理、会话管理、页面构建等功能,但是其他客户端所发起的交互都需要以 RESTful 服务的形式调用服务器。

**服务:** 服务器包含了缓存服务以及聚合(aggregate)服务,其中缓存服务中持有记录系统(system of record)中最新的已知状态,而聚集服务会直接与记录系统交互,并且会执行一些破坏性的操作(会改变记录系统中的状态)。

**记录系统:** 记录系统是领域特定的服务端,它会驱动业务功能,可能会包括客户管理系统、采购系统、预定系统等等,这些很可能是遗留系统,你的应用需要与其进行交互。聚集服务要负责将你的应用从这些特有的记录系统中抽象出来,并为你的应用提供一致的前端接口。

ESB_:_ 当记录系统发生数据变化的时候,它需要触发到指定主题(topic)的事件,这就是事件驱动架构(event-driven architecture,EDA)能够影响应用的地方了:当记录系统进行了一项其他系统可能感兴趣的变更时,它会触发一个事件,任何关注记录系统的其他系统会监听到这个事件,并作出对应的响应。这也是使用使用主题(topic)而不是队列(queue)的原因:队列支持点对点(point-to-point)的消息,而主题支持发布 - 订阅(publish-subscribe)的消息或事件。当与遗留系统进行集成时,我们很期望这些遗留的系统能够免遭负载的影响。因此,我们实现了一个缓存系统,这个缓存系统维持了记录系统中所有最新的已知状态。缓存系统会使用 EDA 的规则监听记录系统的变化,它会更新自己所保存数据的版本,从而保证与记录系统中的数据相匹配。这是一个很强大的策略,不过会将一致性模型变为最终一致性,也就是说如果你在社交媒体上发布一条状态的话,你的朋友可能在几秒钟甚至几分钟之后才能看到,数据最终是一致的,但有时你所看到的与你的朋友所看到的并不一致。如果能接受这种一致性的话,就能在很大程度上实现可扩展性的收益。

**NoSQL****** 在数据存储方面,有很多的可选方案,但如果要存储大量数据的话,使用 NoSQL 存储能够更容易地扩展。有多种 NoSQL 存储可供选择,不过这要匹配所存储数据的特点,如 MongoDB 适合存储可搜索的数据,Neo4j 适合存储高度互相关联的数据,而 Cassandra 适合存储键 / 值对,像 Solr 这样的搜索索引有利于加速对经常访问数据的查询。

将应用拆分为多个层的时候,最好的模式就是使用面向服务架构(service-oriented architecture,SOA)。要实现这一点,可以使用 SOAP,也可以使用 REST,但是 REST 更为合适,因为它可扩展性更强。作者接下来对 REST 的理念进行了深入的阐述,InfoQ 上关于 REST 已有很多相关的文章,如这里这里,甚至包括 Roy Fielding 经典博士论文中译本,所以这里不再赘述。不过,作者在这里特别强调了RESTful Web 服务能够保持无状态性(stateless)。无状态是实现可扩展性的关键需求,因为无状态,所以请求可以由任何一个服务器响应。如果你在服务层上需要更多的容量时,只需要为该层添加虚拟机即可,而不需关注客户端状态保持的问题,负载可以很容易地重新分配。

部署到云端

前面介绍了基于云的应用架构,接下来作者阐述了这样的应用该如何部署到云端。

RESTful Web 服务要部署到 Web 容器中,并且要位于数据存储之前。这些 Web 服务是没有状态的,只会反映其暴露的底层数据的状态,因此可以根据需要部署任意数量的服务器。在基于云的部署中,开始时可以开启足够的实例以应对日常的需求,然后配置弹性策略,从而根据负载增加或减少服务器的数量。衡量饱和度的最好指标就是服务的响应时间。另外还需要考虑这些服务所使用的底层数据存储的性能。示例的部署图如下所示:

如果在云部署时有 EDA 的需求,那么就需要部署 ESB,作者给出的建议是根据功能对 ESB 进行分区(partitioning),这样一个 segment 的过大负载不会影响到其他的 segment。如下图所示:

这种分离使 System 1 的负载与 System 2 的负载实现了隔离。如果 System 1 产生的负载拖慢了 ESB,它只会影响到自己的 segment,并不会影响到 System 2 的 segment,因为它部署在其他硬件上。如果 ESB 产品支持的话,我们还可以给指定的 segment 添加服务器来实现扩展。

基于云的应用与传统应用有着很大的差别,因为它有着不同的扩展性需求。基于云的应用必须有足够的弹性以应对服务器的添加与移除,必须松耦合,必须尽可能的无状态,必须预先规划失败的情况,并且必须能够从几台服务器扩展到成千上万台服务器。

针对云应用并没有唯一正确的架构,但是本文所阐述的 RESTful 服务以及事件驱动架构却是经过实践检验有效的架构。作者认为 REST 和 EDA 是实现云端可扩展应用的基本工具。

目前,国内许多传统的软件厂商正在逐渐往云端迁移,希望本文所阐述的架构理念能够为读者提供一些借鉴。

2014-03-24 03:044062

评论

发布
暂无评论
发现更多内容

看漫画MHGmhgui,Python爬虫之神奇的eval,附赠一个压缩模块

梦想橡皮擦

Python 爬虫 8月月更

使用 ABAP 编程语言的 System CALL 接口,直接执行 ABAP 服务器所在操作系统的 shell 命令

汪子熙

Linux unix SAP abap 8月月更

java培训中心有哪些

小谷哥

你知道 Vue scoped 原理吗?这波你在第几层?

掘金安东尼

面试 前端 8月月更

对话跨国消费品牌DPO:数据安全合规从何做起?8.11直播见!

奇点云

数据治理 数据安全 数据合规

MySQL传统方案和通过SSH连接哪个好?

了不起的程序猿

MySQL 数据库 java程序员 :MySQL 数据库

美的数字化平台 iBUILDING 背后的技术选型

TDengine

数据库 tdengine database

收到人生第一笔五位数工资

Amazing_eve

#开源

StratoVirt 中的虚拟网卡是如何实现的?

openEuler

开源 openEuler Open Source 内核态 虚拟网卡

OpenSSF的开源软件风险评估工具:Scorecards

SEAL安全

开源 开源安全 软件供应链安全 开源合规 开源工具包

自从我使用HiFlow场景连接器后,在也不用担心成为“落汤鸡”了

叶秋学长

Hiflow

electron 应用开发优秀实践

vivo互联网技术

前端 Web Electron 桌面开发

集群部署spark、Hadoop环境

峥岳

hadoop spark hive

富媒体在客服IM消息通信中的秒发实践

得物技术

前端 即时通讯 客服 富媒体 大文件传输

国际计费系统基于Sharding-Proxy大数据迁移方案实践

京东科技开发者

数据库 系统 数据迁移

程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果

HarmonyOS SDK

大数据培训课程如何选?

小谷哥

java软件培训费用怎么算

小谷哥

一文看懂大数据生态圈完整知识体系

博文视点Broadview

研发需求的验收标准应该怎么写? | 敏捷实践

LigaAI

程序员 产品经理 敏捷开发 研发管理 开发流程

七日算法先导(六)——堆排序,桶排序

工程师日月

8月月更

在北京参加UI设计培训到底怎么样?

小谷哥

《数字经济全景白皮书》银行业智能营销应用专题分析 发布

易观分析

金融 银行 白皮书 智能营销

MySQL索引的B+树到底有多高?

转转技术团队

MySQL 索引

开源一夏 |最好用的脚本语言--JavaScript

叶秋学长

开源 前端 js 8月月更

七日算法先导(七)——字符串

工程师日月

8月月更

web前端培训课程怎么选择

小谷哥

浅谈一线互联网大厂中算法岗的分类

码农鬼仔

数据挖掘 AI 算法工程师 校招 机器学习/深度学习

人物 | 从程序员到架构师,我是如何快速成长的?

安势信息

程序员 职场 架构师 程序员进阶 人物访谈

前端该如何优雅地 Mock 数据

CRMEB

API接口是什么?API接口常见的安全问题与安全措施有哪些?

郑州埃文科技

API接口管理 非对称加密 md5 令牌桶算法

适合于云端部署的应用架构_SOA_张卫滨_InfoQ精选文章