目录
[应用(Application)/ 系统(System)](#应用(Application)/ 系统(System))
[模块(Module)/ 组件(Component)](#模块(Module)/ 组件(Component))
[分布式vs 集群。](#分布式vs 集群。)
[主(Master)/ 从(Slave)](#主(Master)/ 从(Slave))
[响应时长(Response Time RT)](#响应时长(Response Time RT))
[吞吐(Throughput)vs 并发(Concurrent)](#吞吐(Throughput)vs 并发(Concurrent))
[读写分离/ 主从分离架构](#读写分离/ 主从分离架构)
[引入缓存------ 冷热分离架构](#引入缓存—— 冷热分离架构)
[业务拆分------ 微服务](#业务拆分—— 微服务)
概述
在进行技术学习过程中,由于大部分读者没有经历过一些中大型系统的实际经验,导致无法从全局理解一些概念,所以本文以一个"电子商务" 应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,方便大家对后续知识做深入学习时有一定的整体视野。
常见概念
在正式引入架构演进之前,为避免读者对架构中的概念完全不了解导致低效沟通,优先对其中一些比较重要的概念做前置介绍:
基本概念
应用(Application)/ 系统(System)
为了完成一整套服务的一个程序或者一组相互配合的程序群。
生活例子类比:为了完成一项任务,而搭建的由一个人或者一群相互配的人组成的团队。
模块(Module)/ 组件(Component)
当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理解。
生活例子类比:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通信小组等。
分布式(Distributed)
系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如Web 服务器与数据库分别工作在不同的服务器上,或者多台Web 服务器被分别部署在不同服务器上。
生活例子类比:为了更好的满足现实需要,一个在同一个办公场地的工作小组被分散到多个城市的不同工作场地中进行远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成。
集群(Cluster)
被部署于多台服务器上的、为了实现特定目标的一个/组特定的组件,整个整体被称为集群。比如多个MySQL 工作在不同服务器上,共同提供数据库服务目标,可以被称为一组数据库集群。
生活例子类比:为了解决军队攻克防守坚固的大城市的作战目标,指挥部将大批炮兵部队集中起来形成一个炮兵打击集群。
分布式vs 集群。
通常不用太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即工作在不同服务器上并且通过网络通信配合完成任务;而集群更在意逻辑形态,即是否为了完成特定服务目标。
主(Master)/ 从(Slave)
集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。
比如MySQL 集群中,只有其中一台服务器上数据库允许进行数据的写入(增/删/改),其他数据库的数据修改全部要从这台数据库同步而来,则把那台数据库称为主库,其他数据库称为从库。
中间件(Middleware)
一类提供不同应用程序用于相互通信的软件,即处于不同技术、工具和数据库之间的桥梁。
生活例子类比:一家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变大,成立一个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁。
容器(Docker)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。
可以理解为一个集装箱,集装箱里面是每个用户的货物,整体打包。
容器编排(K8S)
kubernetes,简称K8s,是用8代替名字中间的8个字符"ubernete"而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效。
可以理解为一个货船,安装集装箱的大小,货物情况合理的来组织集装箱完成整体货物的搬运。
评价指标(Metric)
可用性(Availability)
考察单位时间段内,系统可以正常提供服务的概率/期望。
例如: 年化系统可用性= 系统正常提供服务时长/ 一年总时长。 这里暗含着一个指标,即如何评价系统提供无法是否正常,我们就不深入了。平时我们常说的4 个9 即系统可以提供99.99% 的可用性,5 个9 是99.999% 的可用性,以此类推。我们平时只是用高可用(High Availability HA)这个非量化目标简要表达我们系统的追求。
响应时长(Response Time RT)
指用户完成输入到系统给出用户反应的时长。
例如点外卖业务的响应时长= 拿到外卖的时刻- 完成点单的时刻。通常我们需要衡量的是最长响应时长、平均响应时长和中位数响应时长。这个指标原则上是越小越好,但很多情况下由于实现的限制,需要根据实际情况具体判断
吞吐(Throughput)vs 并发(Concurrent)
吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同一时刻支持的请求最高量。
例如一条2车道高速公路,一分钟可以通过20 辆车,则并发是2,一分钟的吞吐量是20。实践中,并发量往往无法直接获取,很多时候都是用极短的时间段(比如1 秒)的吞吐量做代替。我们平时用高并发(Hight Concurrnet)这个非量化目标简要表达系统的追求。
架构演进
单机架构
出现原因
出现在互联网早期,访问量比较小,单机足以满足需求
初期,我们需要利用我们精干的技术团队,快速将业务系统投入市场进行检验,并且可以迅速响应变化要求。但好在前期用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简单,无需专业的运维团队,所以选择单机架构是合适的。
简介
应用服务和数据库服务共用一台服务器,这台服务器完成所有的工作

技术案例

用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 对应的应用服务(我们通过编程语言完成的程序),应用服务再根据请求通过MySQL查询数据。
架构优缺点
优点:部署简单、成本低
缺点:存在严重的性能瓶颈、数据库和应用互相竞争资源
相关软件
Web 服务器软件:Tomcat、Netty、Nginx、Apache 等
数据库软件:MySQL、Oracle、PostgreSQL、SQL Server 等
早期的公司因为公司业务并不大,所以这种单机架构其实非常普遍。一台主机的硬件资源是存在上线的,包括但不限与CPU、内存、硬盘、网络等,服务器每次请求都会消耗对应的资源,随着公司业务的增长,同一时间处理的请求变多,就会导致某个原不够用了,无论某个资源不够用,都会导致处理请求的时间变长,以至于处理请求出错。
所以如果遇到上述的情况,我们往往只有两个办法,第一个是在软件设计上优化,不过这个对程序员要求较高,并且上线始终受到硬件限制;第二种办法,就是引入更多的硬件资源,而一台主机硬件拓展能力有限,所以这就意味着要引入更多的主机,这也就是我们所提到的"分布式",下文我们的架构设计也基本上是基于这个思路进行演化。
注:其实分布式本身也可以视作一种无奈之举,因为分布式的引入会导致我们程序的复杂度大大提升,出现bug的概率大大增加。
应用数据分离架构
出现原因
单机存在严重的资源竞争,导致站点变慢。
随着系统的上线,我们不出意外地获得了成功。市场上出现了一批忠实于我们的用户,使得系统的访问量逐步上升,逐渐逼近了硬件资源的极限,同时团队也在此期间积累了对业务流程的一批经验。面对当前的性能压力,我们需要未雨绸缪去进行系统重构、架构挑战,以提升系统的承载能力。但由于预算仍然很紧张,我们选择了将应用和数据分离的做法,可以最小代价的提升系统的承载能力。
简介
应用服务和数据库服务使用不同服务器

技术案例

用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 对应的应用服务(我们通过编程语言完成的程序),应用服务再根据请求通过网络访问数据库服务器查询数据。
和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上,。
对于应用服务器来说,往往需要处理更多的业务逻辑,因此更需要CPU、内存资源;而存储服务器往往是访问对应的数据,因此需要更大的存储容量、更快的数据访问速度,需要可以配合更大硬盘的服务器,甚至还可以上SSD。
这个应用数据分离架构本身不光提升了本身的硬件资源,根据不同的服务特点,我们也可以搭配更加合适的服务器,更具性价比。
架构优缺点
优点:
成本相对可控。
性能相比单机有提升。
数据库单独隔离,不会因为应用把数据库搞坏,有一定的容灾能力
缺点:硬件成本变高、性能有瓶颈,无法应对海量并发
应用服务集群架构
出现原因
单个应用不足以支持海量的并发请求,高并发的时候站点响应变慢
我们的系统受到了用户的欢迎,并且出现了爆款,单台应用服务器已经无法满足需求了。我们的单机应用服务器首先遇到了瓶颈,摆在我们技术团队面前的有两种方案,大家针对方案的优劣展示了热烈的讨论:
• 垂直扩展 / 纵向扩展Scale Up。通过购买性能更优、价格更高的应用服务器来应对更多的流量。
这种方案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,意味着选择性能2 倍的硬件可能需要花费超过4 倍的价格,其次硬件性能提升是有明显上限的。
• 水平扩展 / 横向扩展Scale Out。通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。
这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。
经过团队的学习、调研和讨论,最终选择了水平扩展的方案,来解决该问题,但是这又带来了新的问题,多台应用服务器同时存在,我们如何保证应用服务器可以同时均衡的工作呢?
不至于出现忙的忙死,闲的闲死,导致资源的浪费?这需要引入一个新的组件------ 负载均衡 :为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流量分发。(实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。)
同时流量调度算法也有很多种,这里简单介绍几种较为常见的:
• Round-Robin 轮询算法。即非常公平地将请求依次分给不同的应用服务器。
• Weight-Round-Robin 轮询算法。为不同的服务器(比如性能不同)赋予不同的权重(weight),能者多劳。
• 一致哈希散列算法。通过计算用户的特征值(比如IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务。
简介
引入了负载均衡,应用以集群方式运作


技术案例:
用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 发送请求,请求被负载均衡组件接受,并通过算法,合理派发到台应用服务器上(比如采用轮询的方式,将每次的请求挨个派发给应用服务器),应用服务器在根据网络访问数据服务器。
注:这里的负载均衡也是部署在独立的服务器上的,有的人到这可能会疑问:负载均衡不是需要接收所有的请求再进行派发吗?那负载均衡的服务器可以承受住压力吗?
其实负载均衡本身只是进行派发,不进行详细的业务处理,实际单个请求承受的压力会小很多。如果压力过大,我们也可以在每一层上多加一些负载均衡器,如果再大,我们可以考虑在当前负载均衡层上抽象出一层负载均衡软件层,请求会想通过某一个新负载均衡器,如上图的LVS/F5,再由其通过算法派发给下一层上的某一个负载均衡器Nginx。比起在一层上堆积负载均衡器,这种多级层状设计是指数的提升,往往再大的请求量,一般最多三层负载均衡层就够了。
架构优缺点
优点:
应用服务高可用:应用满足高可用,不会一个服务出问题整个站点挂掉。
应用服务具备一定高性能:如果不访问数据库,应用相关处理通过扩展可以支持海量请求快速响应。
应用服务有一定扩展能力:支持横向扩展
缺点:
数据库成为性能瓶颈,无法应对数据库的海量查询。
数据库是单点,没有高可用。
运维工作增多,扩展后部署运维工作增多,需要开发对应的工具应对快速部署。
硬件成本较高
相关软件
负载均衡软件:Nginx、HAProxy、LVS、F5 等
读写分离/ 主从分离架构
出现原因
数据库成为瓶颈,而互联网应用一般读多写少,数据库承载压力大,主要是由这些读的请求造成的,那么我们可以把读操作和写操作分开
上文提到,我们把用户的请求通过负载均衡分发到不同的应用服务器之后,可以并行处理了,并且可以随着业务的增长,可以动态扩张服务器的数量来缓解压力。但是现在的架构里,无论扩展多少台服务器,这些请求最终都会从同一个数据库读写数据,到一定程度之后,数据的压力会超过系统承载能力的瓶颈点。
那我们可以像扩展应用服务器一样扩展数据库服务器么?答案是否定的,因为数据库服务有其特殊性:如果将数据分散到各台服务器之后,数据的一致性将无法得到保障。所谓数据的一致性,此处是指:针对同一个系统,无论何时何地,我们都应该看到一个始终维持统一的数据。想象一下,银行管理的账户金额,如果收到一笔转账之后,一份数据库的数据修改了,但另外的数据库没有修改,则用户得到的存款金额将是错误的。
我们采用的解决办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据库 。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着与主库一致的数据。然后为了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。由于大部分的系统中,读写请求都是不成比例的,例如100 次读往往只会有1 次写,所以只要将读请求由各个从库分担之后,数据库的压力就没有那么大了。当然这个过程不是无代价的,主库到从库的数据同步是通过网络进行的,其实是有时间以及其他成本的,但这个问题我们暂时不做进一步探讨。
简介
将数据库读写操作分散到不同的节点上,数据库服务器搭建主从集群,一主一从、一主多从都可以,数据库主机负责写操作,从机只负责读操作

技术案例

用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 发送请求,请求被负载均衡组件接受,并通过算法,合理派发到每台应用服务器上,应用中需要对读写请求做分离处理,所以可以利用一些数据库中间件,将请求分离的职责托管出去,请求通过数据库中间件,写请求会被派发到主数据库,读请求会被派发到从数据库,因为读数据需要较大,我们可以设置多个从数据库服务器,如果这个过程中主数据发生修改,会进行数据同步。
架构优缺点
优点:
数据库的读取性能提升、读取被其他服务器分担,写的性能间接提升。
数据库有从库,数据库的可用性提高了
缺点:热点数据的频繁读取导致数据库负载很高、当同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致、服务器成本需要进一步增加
相关软件
MyCat、TDDL、Amoeba、Cobar 等类似数据库中间件等
引入缓存------ 冷热分离架构
出现原因
海量的请求导致数据库负载过高,站点响应再度变慢
随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数据称为热点数据,与之相对应的是冷数据。计算机中这部分存在一个二八定律:20%的数据能支撑80%的访问率,有的甚至能达到一比九。所以这些热数据的请求往往是大量重复的,而访问数据往往是贯穿整个架构的,尤其是存储服务器层的IO是非常耗时的,所以重复请求造成巨大的浪费以及压力
所以针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。
其中涉及的技术包括:使用memcached作为本地缓存,使用Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。
简介
引入缓存,实行冷热分离,将热点数据放到缓存中快速响应

技术案例

用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 发送请求,请求被负载均衡组件接收,并通过算法,合理派发到每台应用服务器上
如果当前的数据能够在缓存中获取到,则直接将数据返回给上层,不在访问数据库,如果是冷数据,则请求通过数据库中间件,写请求会被派发到主数据库,读请求会被派发到从数据库。
注:这里的缓存也是单独部署在一台服务器上的,可以有多个缓存,这里的缓存之所以效率可以比数据库查询的效率高,是因为缓存是内存存储,请求直接在内存中查找数据,不需要IO,效率大大提高,但是内存本身价格较高且存储空间小据,所以适合储存热数。
架构优缺点:
优点:
大幅降低对数据库的访问请求,性能提升非常明显
缺点:
带来了缓存一致性,缓存击穿,缓存失效,缓存雪崩等问题。
服务器成本需要进一步增加。
业务体量支持变大后,数据不断增加,数据库单库太大,单个表体量也太大,数据查询会很慢,导致数据库再度成为系统瓶颈
相关软件:
Memcached、Redis 等缓存软件
垂直分库
出现原因
单机的写库会逐渐会达到性能瓶颈,需要拆分数据库,数据表的数据量太大,处理压力太大,需要进行分表,为降低运维难度,业界逐渐研发了分布式数据库,库表天然支持分布式
随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。
比如针对评论数据,可按照商品ID进行hash,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能。
其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。这种做法显著的增加了数据库运维的难度,对DBA的要求较高。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的 ,如分库分表的管理和请求分发,由Mycat实现,SQL的解析由单机的数据库实现,读写分离可能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是MPP(大规模并行处理)架构的一类实现。
简介
数据库的数据被拆分,数据库数据分布式存储,分布式处理,分布式查询,也可以理解为分布式数据库架构

技术案例


用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 发送请求,请求被负载均衡组件接收,并通过算法,合理派发到每台应用服务器上
如果当前的数据能够在缓存中获取到,则直接将数据返回给上层,不在访问数据库,如果是冷数据,则请求通过数据库中间件,根据业务将原本数据库进一步拆分,比如"用户-商品-交易表"拆封成三几个集群,集群内部有拆分成主从库模式,写请求会被派发到主数据库,读请求会被派发到从数据库,但是这里不同点是由于拆分成三个库,请求会先访问一个集群中的数据,在访问其他集群的数据,以此拿到完整的数据(此外还有的设计是在上层,直接派发多个请求,同时访问多个集群,拿到一个完整的请求)
架构优缺点
优点:
数据库吞吐量大幅提升,不再是瓶颈
缺点:
跨库join、分布式事务等问题,这些需要对应的去进行解决,目前的mpp都有对应的解决方案、数据库和缓存结合目前能够抗住海量的请求,但是应用的代码整体耦合在一起,修改一行代码需要整体重新发布
相关软件
Greenplum、TiDB、Postgresql XC、HAWQ等,商用的如南大通用的GBase、睿帆科技的雪球DB、华为的LibrA 等
业务拆分------ 微服务
出现原因
上文架构
扩展性差:应用程序无法轻松扩展,因为每次需要更新应用程序时,都必须重新构建整个系统;
持续开发困难:一个很小的代码改动,也需要重新部署整个应用,无法频繁并轻松的发布版本;不可靠:即使系统的一个功能不起作用,可能导致整个系统无法工作;
不灵活:无法使用不同的技术构建单体应用程序、代码维护难:所有功能耦合在一起,新人不知道何从下手
随着人员增加,业务发展,系统本身体量的增加带来的维护成本的大大增强,我们将业务的每个模块抽象化并进行拆分,交给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离,可以利用Gateway、消息总线等技术,实现相互之间的调用关联。甚至可以把一些类似用户管理等业务提成公共服务。这样每个部门或小组就可以独立负责自己的微服务,实现各个微服务的解耦。并且抽象出来的微服务后续如果有其他业务需要类似功能也可以直接复用。从公司部门管理上,各服务功能拆分出对应小组也降低整体的管理成本。
简介
微服务是一种架构风格,按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代。

技术案例

技术案例
以电子商城为例,一个商城应用拆分成了多个微服务,如用户服务、交易服务和商品服务,相互之间协作支持整个商城的应用。
用户在浏览器中输入www.bit.com,首先经过DNS 服务将域名解析成IP 地址10.102.41.1,随后浏览器访问该IP 发送请求,请求被负载均衡组件接收,并通过算法,合理派发到每台应用服务器上
如果当前的数据能够在缓存中获取到,则直接将数据返回给上层,不在访问数据库,如果是冷数据,则请求通过数据库中间件,写请求会被派发到主数据库,读请求会被派发到从数据库。
架构优缺点
优点:
灵活性高:服务独立测试、部署、升级、发布;
独立扩展:每个服务可以各自进行扩展;提高容错性:一个服务问题并不会让整个系统瘫痪;
新技术的应用容易:支持多种编程语言
缺点:
运维复杂度高:业务不断发展,应用和服务都会不断变多,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题。
此外,对于如大促这类需要动态扩缩容的场景,需要水平扩展服务的性能,就需要在新增的服务上准备运行环境,部署服务等,运维将变得十分困难;
资源使用变多:所有这些独立运行的微服务都需要需要占用内存和 CPU;处理故障困难:一个请求跨多个服务调用,需要查看不同服务的日志完成问题定位
相关软件
Spring Cloud、Dubbo
容器化引入------容器编排架构
出现原因
微服务拆分细,服务多部署工作量大,而且配置复杂,容易出错;
微服务数量多扩缩容麻烦,而且容易出错,每次缩容后再扩容又需要重新配置服务对应的环境参数信息;
微服务之间运行环境可能冲突,需要更多的资源来进行部署或者通过修改配置来解决冲突
随着业务增长,然后运维发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量会变的非常大。
容器化技术的出现给这些问题的解决带来了新的思路。
目前最流行的容器化技术是Docker,最流行的容器管理服务是Kubernetes(K8S) ,应用/服务可以打包为Docker镜像,通过K8S来动态分发和部署镜像。Docker镜像可理解为一个能运行你的应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个"操作系统"打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动Docker镜像就可以把服务起起来,使服务的部署和运维变得简单。
服务通常会有生产和研发k8s集群,一般不会公用,而研发集群通过命名空间来完成应用隔离,有的公司按照研发目的划分为研发和测试集群,有的公司通过组织架构完成部门间的资源复用。
简介
借助容器化技术(如docker)将应用/服务可以打包为镜像,通过容器编排工具(如k8s)来动态分发和部署镜像,服务以容器化方式运行;

技术案例

架构工作原理
以电子商城为例,一个商城应用拆分成了多个微服务,如用户服务、交易服务和商品服务,每一个微服务打包到容器之中,相互协作来完成系统功能,通过容器编排工具完成部署运维,业务请求的整体流程与前文架构一致。不同的是容器化技术与容器编排技术使得部署与运维大大简化,运维人员的工作量大大降低。

以上图为例,java/c++应用需要语言开发的程序文件,依赖的库、以及特定系统环境,而docker技术可以将所需要的配置一键打包成镜像整体,并通过k8s管家将镜像直接部署到对应服务器上。
这时候这个镜像本身就是一个整体,可以独立运行,不会受服务器环境的影响,也不会影响服务器环境,同一台服务器上,我们也就可以部署多个环境不同的应用了。
架构优缺点
优点:
部署、运维简单快速:一条命令就可以完成几百个服务的部署或者扩缩容;
隔离性好:容器与容器之间文件系统、网络等互相隔离,不会产生环境冲突;
轻松支持滚动更新:版本间切换都可以通过一个命令完成升级或者回滚;
缺点:技术栈变多,对研发团队要求高机器还是需要公司自身来管理,在非大促的时候,还是需要闲置着大量的机器资源来应对大促,机器自身成本和运维成本都极高,资源利用率低,可以通过购买云厂商服务器解决。
相关软件
Docker、K8S
尾声


至此,一个还算合理的高可用、高并发系统的基本雏形已显。
注意,以上所说的架构演变顺序只是针对某个侧面进行单独的改进,在实际场景中,可能同一时间会有几个问题需要解决,或者可能先达到瓶颈的是另外的方面,这时候就应该按照实际问题实际解决。如在政府类的并发量可能不大,但业务可能很丰富的场景,高并发就不是重点解决的问题,此时优先需要的可能会是丰富需求的解决方案。
对于单次实施并且性能指标明确的系统,架构设计到能够支持系统的性能指标要求就足够了,但要留有扩展架构的接口以便不备之需。对于不断发展的系统,如电商平台,应设计到能满足下一阶段用户量和性能指标要求的程度,并根据业务的增长不断的迭代升级架构,以支持更高的并发和更丰富的业务。
所谓的**"大数据"其实是海量数据采集清洗转换、数据存储、数据分析、数据服务等场景解决方案的一个统称,在每一个场景都包含了多种可选的技术,如数据采集有Flume、Sqoop、Kettle等,数据存储有分布式文件系统HDFS、FastDFS,NoSQL数据库HBase、MongoDB等,数据分析有Spark技术栈、机器学习算法等。**总的来说大数据架构就是根据业务的需求,整合各种大数据组件组合而成的架构,一般会提供分布式存储、分布式计算、多维分析、数据仓库、机器学习算法等能力。而服务端架构更多指的是应用组织层面的架构,底层能力往往是由大数据架构来提供。