架构师不可不知的十大可扩展架构

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

可扩展性正是如今软件设计领域最值得优先考虑的要素。然而,计算机科学家们还无法了解一套单独的架构如何才能扩展至各类应用环境当中。相反,我们在数量繁多的方案中所设计出的可扩展性架构,往往以业界较为通用的已知可扩展模式及个人偏好为标准。本文列出了十大大家耳熟能详的可扩展性架构,以供借鉴。

AD: 2013云计算架构师峰会课程资料下载

【51CTO精选译文】对于大多数架构师而言,“可扩展性”在软件架构方面是最虚无缥缈的说法。这毫不奇怪,因为可扩展性正是如今软件设计领域最值得优先考虑的要素。然而,计算机科学家们还无法了解一套单独的架构如何才能扩展至各类应用环境当中。相反,我们在数量繁多的方案中所设计出的可扩展性架构,往往以业界较为通用的已知可扩展模式及个人偏好为标准。简单来讲,打造一套具备可扩展性的系统已经变得更像是一门艺术而不单单是技术。

我们常常会通过观摩杰作体会并学习艺术的精髓,而可扩展性也应该遵循同样的路线!

在这篇文章中,我将列出数款为大家所耳熟能详的可扩展性架构。通常情况下,架构师们完全可以借鉴已知的可扩展架构模式,进而创造出新的可扩展架构。

  1. LB (负载平衡器) + 无共享单位 - 该模型中包含一系列单元,各单元彼此间不共享任何内容,且一致指向一个将输入文讯按一定条件发往单元处的负载平衡器(这构成一个循环,以负载等情况为基础)。每个单元可以是一个单独的节点或是紧密耦合的节点所构成的集群。用户可以使用DNS循环、硬件负载平衡器或者软件负载平衡器达成负载平衡效果。创建一套负载均衡的层次结构,并在其中结合前面提到的各种负载平衡器也是可行的。在由Michael Stonebraker撰写的《 无共享体系架构实例 》一文中,专门讨论了此类架构。
     
  2. LB + 无状态节点 + 可扩展存储 - 传统的 三层式Web架构 使用的就是这种模型。该模型包括数个与可扩展存储交互的无状态节点以及一个分布于节点间负载中的负载平衡器。在这一模型中,存储通常作为限制因素存在,但NoSQL存储则可以利用这套模型创建出具备相当可扩展性的系统。
     
  3. 点对点架构 (分布式Hash列表 (简称DHT)以及内容寻址网络(简称CAN)) -这套模型提供了一些传统的可扩展算法,这些算法的各个方面几乎全部按对数进行了等比例增加。举例来说,像Chord、Pastry(特指免费版)以及CAN都属于此类。而以Cassandra为代表的、基于P2P架构的几款NoSQL系统也是其中的成员。《 展望P2P系统中的数据 》一文就深入探讨了这类模型的各种细节。
     
  4. 分布式队列 – 这种模型以将队列实施(即先进先出交付机制)作为网络服务处理为基础。该模型通过JMS队列而广泛得到采用。一般会遵循这种做法的有任务队列以及通过保持队列分级体系实现扩展性的任务队列版本,后者在负载无法及时处理时,任务会由低级层面向高级层面传递。
     
  5. 发布/订阅模式 - 一般用于通过网络向彼此发布订阅讯息。《 发布与订阅的多面性 》这一经典论文中详细的介绍这一模型,该模型方面最典型的例子即 NaradaBroker与 EventJava 。
     
  6. 小道消息与自然灵感式模型 - 这种模型源自日常生活中小道消息的传播途径,也就是每个节点将随机选择后续节点以交换信息。正如现实生活中的实际反馈,这种八卦型算法在信息传播方面出奇地迅速。该模型的另一大分支则是受到生物学影响的启发式算法。自然世界中存在着大量协调及扩展方面极为卓越的固有算法。举例来说,蚂蚁、人类以及蜜蜂等等,都能够以最简洁的交流方式协调好扩展性方面的需要。模型中的算法正是借鉴了这些实际存在的现象。在论文《 从流行病的蔓延到分布式计算 》中对这种模型有着详尽的叙述。
     
  7. 地图缩小/数据流 - 这一概念首先由谷歌公司提出,地图缩小为工作的描述及执行提供了一套可扩展的模式。虽然内容简单,但它仍然成为联机分析处理方面的首要处理模式。数据流则是一种更先进的方式,用来表达执行信息;而像Dryad及Pig这样的项目为数据流的执行提供了可扩展的框架。论文《 地图缩小:大型集群上的简化数据处理 》中设置了专门的主题,详细讨论这一内容。Apache的Hadoop就是这种模型的代表性产品。
     
  8. 责任树形图 - 这种模型打破了递归问题的束缚,将整个流程以树状形式加以处理;每个父节点将工作下放至子节点。这种模型扩展性强,并已经被应用于数款可扩展性架构当中。
     
  9. 流处理 - 这种模型被用于处理源源不断的数据流及数据。这种处理方式通过网络中的处理节点获得支持(例如Aurora、Twitter Strom以及Apache S4等)。
     
  10. 可扩展存储 – 该模型的应用范围从数据库、NoSQL存储、服务注册到文件系统都有体现。 链接中的这篇文章 以可扩展性为切入点对其进行了深入讨论。

综上所述,可扩展性的实现只有三种方式,即:分布、缓存及异步处理。前文所提到的各种架构事实上都是把这三种方式进行不同组合并加以实施。而另一方面,不利于可扩展性的因素,除了糟糕的编码本身,全局性协调也起到了重要的影响。简单来说,任何一种全局性协调都会限制系统的可扩展性。本文中所提到的各种架构也只是在做好了本地性协调,而非全局性协调。

然而,将它们有机地结合起来以创建一套极具可扩展性的架构可不像说起来那么容易,除非我们能找到一种全新的扩展模式。不过经验告诉我们,比起搞一套全新的架构,采用为我们所熟知且更易驾驭的可扩展性解决方案永远是更好的选择。

转载于:https://my.oschina.net/zhanghaiyang/blog/593334

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Winform开发框架中工作流模块的业务表单开发

在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦&…

RabbitMQ学习总结(2)——安装、配置与监控

2019独角兽企业重金招聘Python工程师标准>>> 一、安装 1、安装Erlang 1)系统编译环境(这里采用linux/unix 环境) ① 安装环境 虚拟机:VMware Workstation 10.0.1 build Linux系统:CentOS6.5 rabbitMQ官网下…

CODE[VS] 3411 洪水

题目描述 Description小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质: ①露营地可以被看做是一个N*M的矩形方阵,其中左上角坐标为…

Solr管理页面 上

DashBoard(仪表盘)Logging(日志)Core Admin(Core管理)在Solr中,每一个Core,代表一个索引库,里面包含索引数据及其配置信息。Solr中可以拥有多个Core,也就同时…

GRPC协议的相关原理

GRPC的Client与Server,均通过Netty Channel作为数据通信,序列化、反序列化则使用Protobuf,每个请求都将被封装成HTTP2的Stream,在整个生命周期中,客户端Channel应该保持长连接,而不是每次调用重新创建Chann…

Echarts --- 各个省份的坐标

纯手打…效果如下 1.新疆: [86.61 , 40.79] 2.西藏:[89.13 , 30.66] 3.黑龙江:[128.34 , 47.05] 4.吉林:[126.32 , 43.38] 5.辽宁:[123.42 , 41.29] 6.内蒙古:[112.17 , 42.81] 7.北京:[116.40 , 40.40 ] 8.宁夏:[106.27 , 36.76] 9.山西:[111.95,37.65] 10.河北:[115.21 , 38.…

C++标准输入流、输出流以及文件流

1、流的控制 iomanip 在使用格式化I/O时应包含此头文件。 stdiostream 用于混合使用C和C 的I/O机制时,例如想将C程序转变为C程序 2、类继承关系 ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作&…

Hadoop学习笔记—8.Combiner与自定义Combiner

一、Combiner的出现背景 1.1 回顾Map阶段五大步骤 在第四篇博文《初识MapReduce》中,我们认识了MapReduce的八大步凑,其中在Map阶段总共五个步骤,如下图所示: 其中,step1.5是一个可选步骤,它就是我们今天需…

css --- 行内框和内容区

css规定font-size的大小实际上是字体的高度 可以将内容区理解为font-size的大小. 行内高可以理解为 ( (line-height) - (font-size) ) /2 然后再font-size 的上下加上前面的值 看下面的例子 <p style"font-size:12px;line-height:12px;">this is text, <em&…

DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.7Beta) 增加多语言!

英文名&#xff1a;DotNetTextBox V3.0 WYSWYG Web Control For Asp.Net2.0 中文名&#xff1a;DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0 类型: 免费控件(保留版权) 作者: 小宝.NET 2.0(Terry Deng) 主页&#xff1a;http://www.aspxcn.com.cn 控件演示页面: h…

css --- 浮动元素与 块框/行内框重叠时的细节

块框,可以认为是块级元素(如div、h1)的内容区 内边距 行内框可以认为是行内元素(如span)的内容区 内边距 当 块级框/行内框 和一个浮动元素重叠时&#xff0c;行内框的边框、背景和内容都在幅度元素之上&#xff0c;块级框的边框和背景都在浮动元素的下面&#xff0c;但内容在…

npm --- 包的发布与导入

安装好NODE后,下面演示如何编写一个包,并将其发布到NPM仓库中,最后通过NPM安装回本地. 以下例子是在windows*64环境下运行的. 1.编写模块 exports.sayHello function(){return Hello World; }将上述代码保存在hello.js中 2.初始化包描述文件: 使用npm init指令,快速生成包…

XPath 的使用

XPath 的使用 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言&#xff0c;最初用于搜寻XML文档&#xff0c;但是也同样适用于HTML文档的搜索。前面我们在解析或抽取网页信息时&#xff0c;使用的是正则表达式…

WinCC归档数据报表控件

1、背景 WinCC实现报表历来是老大难&#xff0c;自带的报表功能不好使&#xff0c;又没有好用的第三方控件。虽然网上也有很多实现报表的方法&#xff0c;但是毫无例外的要求使用者具有脚本编程功底&#xff0c;HwDataReport的出现将终结这一现象。您无需一行脚本即可完成…

第三次实验报告

项目一 项目分析 本项目目的就是考察我们调用searching类和sorting类中的方法&#xff0c;通过提交测试用例设计情况&#xff08;正常&#xff0c;异常&#xff0c;边界&#xff0c;正序&#xff0c;逆序&#xff09;确保类的可行性 代码截图 排序截图 运行截图 项目二 代码截…

Node --- 构建一个HTTP服务

代码如下: var http require(http); http.createServer(function (req, res){res.writeHead(200,{Content-Type: text/plain});res.end(Hello World\n); }).listen(1337, 127.0.0.1); console.log(Server running at http://127.0.0.1:1337);运行如下&#xff1a; 详情见《深…

DDR3和eMMC区别

DDR3内存条和eMMC存储器区别&#xff1a; 1. 存储性质不同&#xff1b;2. 存储容量不同&#xff1b;3. 运行速度不同&#xff1b;4. 用途不同。 具体区别如下&#xff1a; 1、存储性质不同&#xff1a;eMMC是非易失性存储器&#xff0c;不论在通电或断电状态下&#xff0c;数据…

17秋 软件工程 团队第五次作业 Alpha Scrum3

17秋 软件工程 团队第五次作业 Alpha Scrum3 今日完成的任务 杰麟&#xff1a;java后端学习&#xff1b;世强&#xff1a;Android的部门基础信息模块的信息显示和对接后台&#xff1b;港晨&#xff1a;后台管理登陆界面ui设计&#xff1b;树民&#xff1a;超级管理员Web后端数据…

event.target【转载】

[转载] 1.this和event.target的区别&#xff1a; js中事件是会冒泡的&#xff0c;所以this是可以变化的&#xff0c;但event.target不会变化&#xff0c;它永远是直接接受事件的目标DOM元素&#xff1b; 2.this和event.target都是dom对象&#xff0c;如果要使用jquey中的方法可…

使用DataTable作为存储过程的参数

最近工作中写了几个存储过程&#xff0c;需要向存 储过程中传递字符串&#xff0c;因为SQL Server 2000中没有内置类似于 split 的函数&#xff0c;只好自己处理&#xff0c;将前台数据集中的一列用逗号拆分存到一个List中&#xff0c;再转化为字符串传给存储过程&#xff0c;很…