可扩展架构设计的三个维度

业界对于可扩展的系统架构设计有一个朴素的理念,就是:

通过加机器就可以解决容量和可用性问题

这一理念在“云计算”概念疯狂流行的今天,得到了广泛的认可!对于一个规模迅速增长的系统而言,容量和性能问题当然是首当其冲的。但是随着时间的向前,系统规模的增长,除了面对性能与容量的问题外,还需要面对功能与模块数量上的增长带来的系统复杂性问题以及业务的变化带来的提供差异化服务问题。而许多系统,在架构设计时并未充分考虑到这些问题,导致系统的重构成为常态,从而影响业务交付能力,还浪费人力财力!

对此,《可扩展的艺术》一书提出了一个更加系统的可扩展模型—— AKF可扩展立方 (Scalability Cube)。这个立方体中沿着三个坐标轴设置分别为:X、Y、Z。

X轴扩展 —— 关注水平的数据和服务克隆,也就是前文提到的“加机器解决问题”
Y轴扩展 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划分 
Z轴扩展 —— 关注服务和数据的优先级划分,如分地域划分

整个扩展模型,用下图来表示,其中原点代表完全无扩展的状态。

640?wx_fmt=jpeg

一.X轴扩展

X轴扩展与我们前面朴素理念是一致的,通过绝对平等地复制服务与数据,以解决容量和可用性的问题。我们以生产汽车的工厂来举例:假设一个车间能完整的生产一辆汽车,为了短时间内生产更多的汽车,我们可以建设更多的车间,任何新增车间除了工作的效率可能不同之外,都是一个新的复制品,也能提供与原来车间相同的工作,生产出完整的汽车。给复制品分配工作就是一个X轴扩展的一个完美示例,说明了X轴扩展的思路,即把工作无偏向的分配给复制品,每个复制品在不考虑生产效率的情况下,谁来做这项工作是无偏向的, 各个复制品之间不共享任何内容 。

而在工程技术上来讲,X轴扩展主要有以下两种技术方案:

1.负载均衡

故名思议,负载均衡就是将用户的访问请求通过负载均衡器,均衡分配到由各个“复制品”组成的集群中去。当某个复制品出现故障,也能轻易地将相应“工作”转移给其它的复制品来“代为完成”。这中间涉及到的工程技术点包括了反向代理,DNS轮询,哈希负载均衡算法(一致性哈希),动态节点负载均衡(如按CPU,I/O)等。它的难点在于要求集群中的“复制品”是不共享任何内容,也就是我们常说的 无状态 。

2.数据复制

数据复制是指在数据存储层进行绝对平等地数据迁移,用于解决存储层I/O瓶颈以及可用性上的问题。由于存在多个复制品存储,为了使得每个复制品提供无差异的数据服务,我们需要在复制品之间同步或异步地复制数据。数据复制的方式包括了主从同步(常见的读/写分离),双主同步等。因为数据存储天生就是有状态的,数据复制的难点在于 一致性 的保证上,为了一致性的保证,从而也衍生了很多复杂的技术,比如Paxos选举算法等。

二.Y轴扩展

Y轴扩展表示的是根据数据的类型或者交易执行的类型(或者两者都有)来划分工作职责。一般称为面向服务或面向资源的扩展。我们再以生产汽车的工厂来举例:如亨利.福特所做的一样,将汽车制造的工序按专业性分成不同车间和流水线,不再是一个车间负责完成100%的任务,制造一辆完整的汽车,而是让这每个车间都执行一些子任务,如安装发动机,喷漆,安装玻璃等等。这样的分工,益处是明显的,每个车间负责的 任务更简单 ,从而能更专业更高效的完成生产。

与汽车工厂的分工类似,为了降低系统复杂度,Y轴扩展会将庞大的整体应用拆分为一组服务。每个服务实现一组相关的功能,如订单管理、客户管理等。在工程上常见的方案是 服务化架构(SOA) 。比如对于一个电子商务平台,我们可以拆分成不同的服务,组成下面这样的架构:

640?wx_fmt=jpeg

但通过观察上图容易发现,当服务数量增多时,服务调用关系变得复杂。为系统添加一个新功能,要调用的服务数也变得不可控,由此引发了服务管理上的混乱。所以,一般情况下,需要采用服务注册的机制形成服务网关来进行服务治理。系统的架构将变成下图所示:

640?wx_fmt=jpeg

同时,为了提升单个服务的可用性和容量, 对每一个服务进行X轴扩展划分 。

640?wx_fmt=jpeg

三.Z轴扩展

Z轴扩展通常是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统是相互隔离但又是完整的。继续以生产汽车的工厂来举例:福特公司为了发展在中国的业务,或者利用中国的廉价劳动力,在中国建立一个完整的子工厂,与美国工厂一样,负责完整的汽车生产。这就是一种Z轴扩展。

对于系统而言,Z轴扩展一般是为了满足差异性的需求或者是为了安全隔离而采取的扩展措施。比如为了提供VIP用户服务,可以将系统完整地复制一份出来,与普通用户所使用的系统完全隔离开来;再如,针对不同的地域用户,系统自动切换到对应地域的子系统,为用户提供服务,都可以认为是Z轴扩展。同时,在系统的灰度部署上,我们也通常使用Z轴扩展来完成。

工程领域常见的Z轴扩展有以下两种方案:

1.单元化架构

在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含闭环。如上面我们说到的Y轴扩展的SOA架构,客户端对服务端节点的选择一般是随机的,但是,如果在此加上Z轴扩展,那服务节点的选择将不再是随机的了,而是每个单元自成一体。如下图:

640?wx_fmt=jpeg

2.数据分区

为了性能数据安全上的考虑,我们将一个完整的数据集按一定的维度划分出不同的子集。 一个分区(Shard),就是是整体数据集的一个子集。比如用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。数据分区为一般包括以下几种数据划分的方式:

数据类型(如:业务类型)
数据范围(如:时间段,用户ID)
数据热度(如:用户活跃度,商品热度)
按读写分(如:商品描述,商品库存)

当然,数据分区也是有代价的,它将增加数据运维的难度,关联搜索的复杂度增加等。

总结:

一个在可扩展性上设计良好的系统,会充分考虑三个维度上的可扩展性。X轴上扩展处理的是平台或系统执行的交易量或工作量增长,虽然X轴扩展能够很好处理交易量的增长,但当系统复杂度的大幅度增加,或用户数量增加以及差异化服务需求出现,X轴扩展就难以应付了,如是我们可以通过Y轴扩展来处理系统复杂度增长的问题以及Z轴扩展来处理差异性化需求的问题。而当采用的扩展坐标轴不止一条时,那么 X轴扩展总是其它扩展方法的次级划分 。同时,这三个维度扩展性,使得系统性能上改善有了更多的方向,对于系统性能优化,也是至关重要。

原文地址:http://www.cnblogs.com/549294286/p/5089569.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

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

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

相关文章

.NET Core开发日志——简述路由

有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序。回忆下在Web Forms应用程序中使用路由的方式:然后是MVC应用程序&…

博客开通

开通博客第一天,纪念一下——

.NetCore Cap 结合 RabbitMQ 实现消息订阅

开源分布式消息框架 Cap 可以在GitHub上拉也可以通过nuget添加上一篇博文写了 Windows RabbitMQ的安装使用 Cap支持事务,通过捕获数据库上下文连接对象实现 消息事务,消息持久化怎么来实现消息订阅 消费?使用起来非常简单,主要通过…

小H和游戏

文章目录题目描述题解:传送时间限制:C/C 2秒,其他语言4秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format:%lld 题目描述 小H正在玩一个战略类游戏,她可以操纵己方的飞机对敌国的N座城市(编号为1~N…

asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

在 asp.net core 发布时,本人先后产生了3个疑问。1、发布的程序为什么不能在docker容器中运行当时在window开发环境中发布后,dotnet xxx.dll可以正常运行;但放入docker容器后就报 *.*.deps.json not found 的错误。后根据下面的文章解决了问题…

水题(water)(非详细解答)

传送 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 其中,f(1)1;f(2)1;Z皇后的方案数:即在ZZ的棋盘上放置Z个皇后,使其互不攻击的方案数。…

网络流小结

最大流&#xff1a; EK算法&#xff1a; #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int inf0x7fffffff; const int maxn10010; struct node{int u,v,f,next; }edge[300050]; int s,t,cnt,…

.NET MVC CSRF/XSRF 漏洞

最近我跟一个漏洞还有一群阿三干起来了……背景&#xff1a;我的客户是一个世界知名的药企&#xff0c;最近这个客户上台了一位阿三管理者&#xff0c;这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍。由于我们的客户关系维护的非常好&#xff0c;直接对口人提前透…

jzoj5057-[GDSOI2017模拟4.13]炮塔【网络流,最大权闭合图】

正题 题面链接:https://gmoj.net/senior/#main/show/5057 题目大意 n∗mn*mn∗m的网格上有一些炮和敌军&#xff0c;每个炮可以攻击在它方向上一个敌军&#xff0c;但是要求炮弹的轨迹不能交叉。求最多打死多少敌军。 解题思路 我们先把炮分成两类&#xff0c;一类是横着打&a…

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

正文ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性&#xff0c;今天主角就是 ApiControllerAttribute。0. ApiControllerAttribute 继承自 ControllerAttributeASP.NET Core MVC 已经有了ControllerAttribute&#xff0c;这个用来标注一个类型是否是Controller。…

新的UWP和Win32应用程序分发模型

自2005年引入ClickOnce技术以来&#xff0c;.NET就支持应用程序自动升级。在ClickOnce模型中&#xff0c;WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本。但是&#xff0c;由于微软试图模仿iOS应用商店模型&#xff0c;所以&#xff0c;该模型未能延续到UWP。微…

.net core grpc 实现通信(一)

现在系统都服务化&#xff0c;.net core 实现服务化的方式有很多&#xff0c;我们通过grpc实现客户端、服务端通信。grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff0c;使用HTTP/2协议&#xff0c;…

子序列

牛客网题目 题目描述 给出一个长度为n的序列&#xff0c;你需要计算出所有长度为k的子序列中&#xff0c;除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行两个整数N&#xff0c;k&#xff0c;含义…

横向扩展你的ASP.NET Core SignalR 应用

前言最近项目要用signalr来做实时通信&#xff0c;在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客&#xff0c;和大家分享一下原文连接地址负载均衡当你把你的应用部署到生产环境时&#xff0c;你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服…

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…

牛客网【每日一题】4月16日题目精讲 逆序对

文章目录题目描述题解&#xff1a;代码传送时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数&#xff1a; 设第i位和第j位分别…

[BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

首先&#xff0c;我们求出树的重链&#xff0c;然后对于每一条链&#xff0c;建一颗线段树 树大概长这样&#xff1a; &#xff08;其中用红边连起来的是一条条重链&#xff09; 在线段树上&#xff0c;我们维护&#xff1a; Opt(u)&#xff1a;经过 u节点代表的链的其中一段 …

ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了:ASP.NET Core 2.1 做APIIdentity Server 4Angular 6Angular Material这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…

[USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)

思路&#xff1a; 由题目易得&#xff1a;网格内种植的两种植物形成了一条 左上—右下 的分界线&#xff0c;考虑将问题转化成 DP求出有多少条合法的分界线 我们注意到&#xff1a; 分界线上的点都必须放洒水器&#xff0c;且所放洒水器有唯一选择&#xff1b; 其他的可以放洒…

.net core grpc consul 实现服务注册 服务发现 负载均衡(二)

在上一篇 .net core grpc 实现通信(一) 中&#xff0c;我们实现的grpc通信在.net core中的可行性&#xff0c;但要在微服务中真正使用&#xff0c;还缺少 服务注册&#xff0c;服务发现及负载均衡等&#xff0c;本篇我们将在 .net core grpc 通信 的基础上加上 服务注册&#x…