为您推荐:
精华内容
最热下载
问答
  • 5星
    5.04MB qq_44537408 2021-01-20 15:13:13
  • 5星
    8.04MB howard1983 2021-02-24 10:05:28
  • 5星
    578.92MB goodxianping 2021-07-26 13:35:05
  • 5星
    2.78MB goodxianping 2021-05-10 14:13:15
  • 5星
    215KB licbc 2021-06-08 08:44:24
  • 5星
    10.91MB qq_17695025 2021-03-15 22:23:19
  • 5星
    73.72MB weixin_40228600 2021-05-23 13:40:54
  • 5星
    2.01MB qq_17695025 2021-06-03 05:12:31
  • 5星
    34.38MB weixin_40228600 2021-04-11 22:00:07
  • 5星
    1.51MB weixin_40228600 2021-05-05 11:03:25
  • 微服务架构设计实践 目 次1 序言2 微服务3 软件架构设计思想4 微服务架构设计实践4.1 项目概述4.2 架构准备阶段4.3 概念架构阶段4.4 细化架构阶段4.4.1 业务架构4.4.2 数据架构4.4.3 应用架构4.4.4 技术架构4.4.5 ...

    微服务架构设计实践
     


    目    次

    4.4.2  数据架构

    4.4.2.1  数据架构定义

            数据架构定义了用来支持业务的各种数据,以及他们之间的关系。

            数据架构着重考虑“数据需求”,关注点是持久化数据的组织。

            在数据架构设计过程中,主要涉及三部分内容:数据定义、数据分布与数据管理:

            1.数据定义,是数据架构规划中最重要内容。定义良好的数据模型,包括数据概念模型、数据逻辑模型、数据物理模型,以及更细化的数据标准,可以反映业务模式的本质,确保数据架构为业务需求提供全面、一致、完整的高质量数据,且为划分应用系统边界,明确数据引用关系,定义应用系统间的集成接口,提供分析依据。良好的数据模型与数据标准的制定才是实现数据共享、保证一致性、完整性与准确性的基础。有了这一基础,企事业单位才能通过信息系统应用逐步深入,最终实现基于数据的管理决策。

            2.数据分布,一方面是分析数据的业务,即分析数据在业务各环节的创建、引用、修改或删除的关系;另一方面是分析数据在单一应用系统中的数据结构与应用系统各功能模块间的引用关系,分析数据在多个系统间的引用关系。数据业务分布是数据系统分布的基础。对于一个拥有众多分支机构的大型企事业,数据存储模式也是数据分布中一项重要内容。从地域的角度看,数据分布有数据集中存储和数据分布存储两种模式。数据集中存储是指数据集中存放于企事业总部数据中心,其分支机构不放置和维护数据;数据分布式存储是指数据分布存放于企事业总部和分支机构,分支机构需要维护管理本分支机构的数据。这两种数据分布模式各有其优缺点,企事业应综合考虑自身需求,确定自己的数据分布策略。

            3.数据管理,一方面要制定贯穿企事业数据生命周期的各项管理制度,包括:数据模型与数据标准管理,数据分布管理,数据质量管理,数据安全管理等制度;另一方面应该确定数据管理组织或岗位。

            数据架构规划是进行企事业IT架构规划不能绕开的重要环节,对于完全通过定制化开发进行应用系统实施的企事业单位来说,数据架构设计是完全可以指导应用系统开发的。

            数据架构规划的目的有三个:

            1.分析业务运作模式的本质,为未来核心应用系统的确定以及分析不同应用系统间的集成关系提供依据。

            2.通过分析核心数据与业务之间的应用关系,分析规划应用系统间的集成关系。

            3.数据管理的需要,明确企事业的核心业务数据,这些数据是应用系统实施与运行时IT系统实施人员或管理人员应该重点关注的,要时时考虑保证这些数据在整个企事业层面的一致性、完整性与准确性。

    4.4.2.2  数据架构设计原则

            在数据架构设计过程中,应该考虑如下因素:

             
    4.4.2.3  数据架构实践

    4.4.2.3.1  数据定义

            一、 概念数据模型

            根据业务需求,分析业务过程中涉及到的所有业务实体,抽取出满足用户场景的实体对象,以及它们之间的关联关系。

            在概念建模阶段,主要做三件事:

            1.客户交流。

            2.理解需求。

            3.形成实体。

            这是一个迭代,如果先有需求,尽量去理解需求,明白当前项目需要完成什么,不明白或者不确定的地方和客户及时交流,和客户二次确认过的需求,落实到实体。如果没有,则通过先和客户交流,进而将交流结果落实到需求,之后进一步具体到实体。

            分行特色业务云平台数据概念模型-基本配置管理部分如下:

            

     

            1.系统管理类

            该部分主要包括系统管理类对象。由于采用基于角色的权限管理,所以涉及的对象主要有用户、角色、功能。

            2.基础数据类

            该部分主要是各种参数配置对象和流水的统一基础数据属性信息,包括:服务场景类型,业务领域,业务区域,机构信息等,后续可根据服务类型的扩展增加相应基础数据对象。

            其中,服务场景类型,业务领域和业务区域后续在控制及事后监控中控制风险使用,例如:通过定义不同的服务场景,来形成各服务场景调用内联服务的风险级别,配置不同的风险控制策略,并且在监控时进行区分关注。

            3.特色应用类:

            该部分主要包括特色业务应用组织、特色业务应用,特色业务产品信息、特色业务合作方信息以及使用业务服务的应用服务场景信息。这些对象用来管理各分行实现的特色业务应用,应用上实现的业务产品以及该业务产品归属的合作方信息,并且通过配置这些应用使用服务融合中心上业务服务的场景(服务场景)来差异化的控制调用服务时的数据属性以及业务风险。

            4.业务服务类:

            业务服务:管理服务融合中心对外发布的业务服务信息。

            业务服务原子服务映射规则:对业务服务与平台内部原子服务调用关系进行管理授权。

            5.原子服务类:

            原子服务:管理由服务融合中心封装的原子服务信息,这些原子服务不直接对外调用,供流程服务调用。原子服务可实现本地的原子服务功能以及后台模块的原子服务功能,针对于后台服务的原子服务一对一的进行封装。

            模块信息:管理服务融合中心原子服务的归属模块,对于服务融合中心封装的远程原子服务,在该表中注册远程服务的归属模块(如PE,NPS),对于本地封装的原子服务,在该表中注册本地模块。

            6.通用功能类:

            通用扩展属性:用来存储各个对象(如业务服务,服务场景等)扩展属性,通过对象类型+对象编码+控制规则主键匹配一组规则。

            对象营业时间:用来存储各对象的营业时间属性。如(特色业务应用、特色业务、特色业务合作方、服务场景、业务服务、原子服务)。

        分行特色业务云平台数据概念模型-流水部分如下:

        

     

            流水表主要分成基础类流水表和业务类流水表。

            1.基础类流水表:

                 接入流水表主要负责当外模块调用服务中心业务服务时,统一记录服务流水。

                 接出流水表主要负责当服务中心业务服务调用外部模块时,登记接出流水,记录与外部模块的交互情况。

            2.业务类流水:

                 目前主要先使用账务流水表,登记账务类流水的信息,后续可根据实际业务类型,扩展不同的业务流水表。

            上述概念数据模型定义了特色业务云平台核心部分的实体对象及它们之间的关系。后续随着功能的完善,业务的增加,需要继续完善概念数据模型。 

            二、 逻辑数据模型

            概念数据模型完成以后,需要进一步对实体对象进行细化,细化成具体的表,同时丰富表结构。

            根据需求确定具体需要哪些表,以及每张表的属性。此时会涉及主键的选取,外键的关联,约束的设置等细节。笔者认为只要能把每个实体属性落实下来就是很不错了,因为随着项目的开展,很多表的列都会有相应的改动。

            这个阶段的产物是,可以在数据库中生成的具体表及其他数据库对象,包括主键,外键,属性列,索引,约束甚至是视图以及存储过程。

            以下为服务融合中心部分逻辑数据模型,以供参考。

            1.系统管理部分逻辑数据模型:

            

             2.基本配置部分逻辑数据模型:

                 服务配置部分: 

                

                 业务产品配置部分: 

                

                 其它配置部分:

                

             3.流水部分逻辑数据模型:

     

             三、 物理数据模型

            物理建模可以将在逻辑建模阶段创建的各种数据库对象生成为相应的SQL代码,运行来创建相应具体数据库对象。

            这个阶段我们不仅仅创建数据库对象,针对业务需求,我们也可能做如数据拆分(水平或垂直拆分)、读写分离。

            根据所选数据库管理系统的类型,生成相关的SQL语句,然后创建具体的数据库对象。

            例如:业务区域表在MySQL数据库的创建语句:

            CREATE TABLE `t_busi_area_info` (

              `busi_area` VARCHAR(10) COLLATE utf8_bin NOT NULL COMMENT '区域编码',
              `area_name` VARCHAR(60) COLLATE utf8_bin NOT NULL COMMENT '业务领域名称',
              `area_level` CHAR(1) COLLATE utf8_bin NOT NULL COMMENT '区域层级',
              `parent_area` CHAR(6) COLLATE utf8_bin NOT NULL COMMENT '上级区域编码',
              `branch_no` CHAR(4) COLLATE utf8_bin DEFAULT NULL COMMENT '分行机构号',
              `status` CHAR(1) COLLATE utf8_bin NOT NULL DEFAULT '1' COMMENT '状态',
              `memo` VARCHAR(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
              `dac` CHAR(16) COLLATE utf8_bin DEFAULT NULL COMMENT 'dac校验',
              PRIMARY KEY (`busi_area`),
              KEY `t_busi_area_info_IDX0` (`area_name`)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='业务区域表';

            四、 数据字典

            在数据建模过程中,基于对需求的理解,会抽取出部分业务规则,这些信息将会成为数据字典中非常重要的部分,即元数据。

            以下是数据字典的部分内容,以作参考:

            1.服务功能类型

            以服务的业务功能领域来定义数据规则,目的是为了统一规范服务的业务领域编码规范,后续可通过该编码对相同功能的服务进行统一管理、统计。

            两位编码表示一个类型含义,最多能表示15个层次的类型含义。

            功能类型按照从粗到细的原则进行编排,下级功能领域含义需要与上级功能领域含义一致。

            一级功能领域目前定义如下:

            

            各一级功能领域内的二级功能领域编码定义如下:

            


            2.业务领域

         

        

            

    4.4.2.3.2  数据存储

            一、 数据库管理系统

            在总行,数据库管理系统采用DB2,版本建议为10.5及以上。

            在总行,由于数据库管理系统采用DB2,所以数据库高可用性通过DB2 数据库产品所提供的多种高可用性策略的功能来实现,具体如下:

                1. DB2 高可用性功能部件-HA:支持IBM DB2服务器和集群管理软件相集成。

                2. DB2 数据服务器高可用性灾难恢复功能-HADR:一种数据库复制功能,它提供针对部分站点故障和整个站点故障的高可用性解决方案。HADR 通过将数据更改从源数据库(称为主数据库)复制到目标数据库(称为备用数据库)来防止数据丢失。

                3. DB2日志镜像:支持数据库级别的日志镜像。

                4. DB2故障监视器工具:该工具通过监视 DB2 数据库管理器实例并重新启动任何过早退出的实例来使 DB2 数据库正常运行。

            在分行,根据每个分行各自的需求,从DB2 10.5及以上、Oracle11g及以上、MySQL5.5及以上三种数据库管理系统中任选其一。 

            在分行,根据所选的数据库管理系统,采用相应的产品和工具实现数据库高可用性。

    4.4.2.3.3  数据分布

            根据系统数据产生、使用、管理等方面的不同特点,采用不同的数据分布式存储和处理手段。

            数据分布策略的3条应用原则:

            1.合适原则:合适的才是最好的。把握系统特点,确定分布策略。

            2.综合原则:当系统比较复杂时,其数据产生、使用、管理等方面可能很难表现出压倒性的特点,此时,就需要考虑综合运用不同的数据分布策略。

            3.优化原则:当难以“一步到位”地作出数据分布策略的正确选择,以及还存在质疑时,应从“对吗”、“好吗”两个方面进行对比、评估、优化。

            由于项目时间紧,人员紧缺,总行科技其它相关项目组进度方面的影响,以及其它一些行方政策上约束,所以在项目第一、二阶段,服务融合中心支持两种应用部署方式:

            一、 集中模式+复制模式+子表模式

            在项目第一、二阶段,主要进行服务融合中心基础开发框架、公共技术组件、公共业务组件的开发、测试。此时,总行服务融合中心提供的服务以对总行核心系统提供的服务进行服务封装为主,业务数据存储在总行核心系统中,不在服务融合中心存储。

            另外,总行服务融合中心接入的分行业务有限,业务访问量较低,每天产生的流水类数据量较少。

            基于上述原因,建议服务融合中心作为单一应用部署,采用集群部署实现水平扩展,支持大并发访问,实现高可用性。

            在数据库方面,同样采用单一库部署,通过读写分离、一写多读、内存缓存的方式保证读操作的性能和高可靠。

            单一应用集群模式如下图所示:

            

     

            在上述部署模式下,数据分布模式如下:

            1.服务融合中心中系统管理类、基本配置类数据,此类数据属于配置型数据,读写比大(即读多,写少),强依赖读,弱依赖写,不要求严格的读一致性,读可靠性要求高。对于这类数据,采用集中式管理。另外,通过读写分离、一写多读、分布式缓存、内存缓存的方式保证读操作的性能和高可靠。

            2.服务融合中心中流水类数据,属于流水型数据,此类数据读写比小(即读少、写多),不断产生新的数据,各条数据间是独立的。单条数据的更新需要保证强一致性。流水型数据很方便做水平扩展。对于流水类数据,由于处于刚投产阶段,接入的分行特色业务数量有限,所以暂时采用集中模式和子集模式。

            3.为每张流水类数据的表建立一个副本表(数据结构与主表一致),这样流水类数据的主表只存储热点数据,即指定维度内的数据(如按照时间维度:1个月以内、1个季度以内等,或按其它业务维度),而其它数据保存在副本表内。这样针对主表、副本表分别进行优化(如:支持大量写操作的主表减少索引,以读为主的副本表可以根据查询需求设置多个索引)。

            二、 集中模式+复制模式+子表模式+独立Schema 模式

            如果在项目第一、二阶段需要实现的本地业务服务较多,接入的分行业务较多,建议把服务融合中心中的流程服务按照业务域分组,每组单独集群部署。

            分布式应用集群部署模式如下图所示:

            

     

            在这种部署模式下,数据分布模式调整为:

            1.把单一数据库拆分为一个通用的基本配置管理库和多个应用业务库(一个应用对应于一个业务库)。

            2.通用基本配置管理库主要包括系统管理类、基本配置类、流水类数据,数据分布模式同单一应用集群模式。

           3.应用业务库主要包括该应用所需的业务相关数据,数据分布模式采用独立Schema模式,即每个应用采用单独数据库Schema的方式管理每个应用涉及的业务数据。

            4.每个应用涉及的业务数据,大部分属于状态型数据,读写比相当,必须保证可写才有意义,每一次写操作必须基于前一个正确的状态。针对关键业务的状态型数据,应尽量把维度拆细,一是提高并发处理能力,二是方便隔离故障影响。

            5.状态型数据要求严格的数据一致性。对于这类数据,除了阿里自主研发的基于 Paxos 协议的分布式强一致数据库(对于单节点故障,它提供 RPO=0,RTO<30 秒的容灾能力,致力于从数据库层屏蔽容灾细节,为应用层提供简单的使用方式)),暂时没有很好的完整解决方案。所以,这部分数据暂时采用单一数据库存储。

            三、 集中模式+复制模式+分区模式

            随着接入的分行特色业务数量的增加,预计每天1亿笔交易量,导致流水相关表的数据量急剧增加。

            在这种海量业务场景下,上述针对流水型数据的子表模式的数据库设计会遇到单表的容量瓶颈和单库的性能瓶颈。

            针对这种情况,按照分布式的思想,对数据进行拆分,让集中在单点的读写访问分布到多个数据库服务器上,从而获得容量和性能上的弹性延伸能力。

            常用的数据拆分模式:

                 垂直拆分:按业务域进行拆分;

                 水平拆分:按某个业务维度进行拆分,如用户、区间等;

                 读写拆分:读写分离;

            为了支持灵活的数据分区,并且数据分区对应用层透明,分行特色业务云平台引入分布式数据访问组件ZDAL支持数据库拆分模式。在引入ZDAL组件以后,针对不同类型的数据采用不同的处理方式。

            1.配置型数据:涉及系统管理类表、基本配置类表

            此类数据的特征是读多写少,数据量较小,采用群组模式。

            群组(Group)模式,示意图如下:

            

     

            采用该模式,一个主库,多个从库,主库负责写、从库负责读,在事务内的读也使用主库。

            2.流水型数据:涉及流水类表

            对于流水类相关表,进行分库分表设计,采用切片模式。

            切片(Shard)模式,示意图如下:

             

            流水类表采用该模式,按照表中流水号ID进行拆分,根据逻辑切片与物理数据库、表的路由规则分布到据库中。

            在本项目中,考虑到项目后期数据扩容方面的简易性、可维护性,建议采用如下数据库与表的拆分路由规则:

                     

            对按流水号ID进行切分的相关表水平切分为1024个逻辑分片,物理库为4个,逻辑分片按照分库分表规则分布在不同物理库中。1024个逻辑分片,逻辑分片与物理表一一对应,每个库256张表,每个表的顺序号都不相同,该模式下分库分表示意图如下:

            

     

            如果扩容物理库到8台,则只需修改分库分表路由映射规则,之前四个库的后128张表分别迁移到新增的物理库中,同时调整逻辑数据库序号。该模式数据迁移相对方便,每次扩容时,每个库的表数量都在减少,扩容上限1024。

            扩容后数据拆分示意图如下:

             

            迁移过程需要一定时间,由于涉及到表数据的迁移和路由规则的切换,所以会影响一段时间数据服务的访问,迁移流程大致如下:

                 停止对外提供服务,然后开始进行数据备份导出;

                 进行表数据的迁移工作;

                 修改ZDAL数据源配置文件,通过配置中心推送ZDAL动态加载;

                 迁移验证,主要包括迁移数据完整性、数据路由是否正确,交易服务是否正常;

                 验证无误后,删除原数据库中已迁移表;

                 对外开始提供服务;

            3.状态型数据

            针对本地服务业务库中的数据,如果某些业务表的数据量达到或超出特定数据库的单表限制,或单表数据量已经影响数据库读、写性能,则建议参考上述流水型数据,进行分库分表设计。

    4.4.2.3.4  数据管理

            在数据管理方面,主要包括两个部分:

            1.制定贯穿整个数据生命周期的各项管理制度,包括:数据模型与数据标准管理,数据分布管理,数据质量管理,数据安全管理等制度。

            2.确定数据管理组织或岗位。


      微信扫一扫,关注该公众号

      该系列文章已经在微信公众号发布,如果感兴趣,请关注。

       以后更多知识通过该微信公众号分享。


    展开全文
    beyondself_77 2018-04-07 22:56:21
  • 前言 相信很多前端小伙伴都有过这种困惑:工作了好几年了,每天都做着重复的事情,无聊且繁琐。...架构设计应以满足一定周期内的需求为目标。周期一般考虑一年即可,需求包括功能性与非功能性(.

    前言

    相信很多前端小伙伴都有过这种困惑:工作了好几年了,每天都做着重复的事情,无聊且繁琐。有所改变的只是从页面仔变成了业务仔。任何一家公司都是对我们有局限的,希望大家能够慢慢脱离业务层,往架构走。

    本人比较喜欢钻研架构,目前在某大型互联网公司任职前端架构师。

    谨以此文献给需要接触到前端架构以及想接触这块的小伙伴们,希望能够帮到大家。

    1. 适度设计(第一准则)

    无论是前端还是后台,这一条是通用的。

    架构设计应以满足一定周期内的需求为目标。周期一般考虑一年即可,需求包括功能性与非功能性(优化,扩展等)。在这两方面都满足,并考虑一定的前瞻性的前提下(前瞻性:业务以及技术发展的方向)。架构应尽量简单:降低成本,缩短实现周期,使质量更高。

    • 能少一个组件就少一个组件

    这可能是大家所忽略的:每增加一个组件,包括研发、测试、运维、硬件资源占用的总体成本就可能会上升数万元。

    • 能不用微服务就不用微服务

    微服务是有一些优点,最近也很火。但缺点也很明显:响应时间增加、综合成本上升、管理复杂度高。对于中小型系统、不需要频繁发布的系统,采用微服务架构就像是用高射炮打蚊子。

    2. 避免问题扩大化

    解决一个问题时尽量直接解决,不要间接解决而引入新的问题。  

    举个例子,当我们用A插件的时候,发现它存在一些问题,然后我们又引入了B插件来解决这个A插件存在的问题,依此类推。正确的做法是直接把A插件换掉,避免引发新的问题。

    3. 本质思考

    作为架构师,应当有广博的知识面,能够透过现象看到问题的本质

    脑海中印象很深的一件事是,有一次我们做了一个文件上传的功能,刚开始有用户反馈上传速度太慢了有时候还上传失败,大家一致认为是用户的网络有问题,直到后面又有客户反馈这个问题。我立马就意识到,这肯定不是网络的问题,而是单文件过大,IIS的限制导致问题的发生。 后续的方案是采取了分片上传、修改IIS限制,解决了棘手这个问题。

    4. 技术选型 

     技术选型以需求为主,而不是人员现状

    经常看到这样的情况,在做技术选型决策时,明知某种技术是最优的,但还是选择当前团队掌握的技术。这种决策可以理解,但对产品长远发展不利,极有可能在与竞品的PK中落于下风(性能以及用户体验上)。

    技术行业最经典的一句话:没有解决不了的技术问题,只有解决不了问题的人。始终坚信项目是可以推动团队技术发展的。

    5. 重视成本

    很多架构师可能有这样一种思维:把架构设计得简单了,会显得自己很平庸。弄一个高大上的架构出来,方显本事,在领导面前述职时也有善可陈。

    可是,如果太超前去搞这种复杂的架构,会白白增加成本

    架构师的每一个决定都会影响到成本。包括研发成本、第三方软硬件采购成本和上线后的运营成本。不同的方案,在成本分布和最终的总体成本上会不尽相同。需要我们综合权衡,才能决策出成本最优的方案。

    成本关系着企业利润,最终也会影响到个人奖金。这种因果关系的体现周期虽然较长,也不是很透明直接,但道理不会错。身为架构师,每做一个决策前,先问问自己,这个方案会花费多少成本。

     6. 慎重审视“拿来”的东西

    技术这块,一直都有“借鉴”的习惯,说的不好听一点,就是抄袭。前端这块更是严重,诞生了许多的“CV”工程师。

    有的人做架构设计,完全是拿来主义,不从自己系统的实际情况出发;而另一种人,则完全自己发挥,不去调查类似系统的设计方案。

    这两种情况都不可取,应该从自己系统的实际需求出发,在参考别人成熟案例的基础上,少走弯路,并考虑自己系统的特点,给出符合自身需求的设计

    7. 重视流程 

    现在早已过了FTP上传文件的时代, 那么现在重要的是思考怎么用工具和流程构建一个高效且避免出错的工作流。

    工作流变得越来越复杂, 那些用于它们的工具也同样如此.。这些工具在提高生产力、加快效率和保持代码一致性上带来了惊人的效果。

    大家有过中大型公司工作经验的同学都知道,每一个人的岗位职责都是非常明确的,遵循既定的流程。有人会抱怨流程太过繁琐(PS:我刚进大厂的时候也是这样,哈哈)。不过直到出了一件事情:一个实习生的误操作,导致项目直接崩盘了,离上线只剩几个小时。我原本以为上线计划估计得延后了,没想到领导很淡定,切另外一条线就可以了。

    开发的工作流程需要规范化,这样才能提升工作效率、降低错误成本

    比如开发环境的准备,至少要有三个环境:开发环境,测试环境,生产环境。还可以加一个备用环境,各个板块是互相关联而又不在一起的,出错了也不用慌,有其它版本。

     

     

     

     8. 性能测试

    不满足于业务功能的实现,而是要考虑到性能与响应速度

    网站性能基线与行业平均水准和通用的最佳实践相比较是必不可少的。

    推荐HTTPArchive(http://httparchive.org/),它测试并记录了几十万个网站的性能数据。

    数据分析:

     i.  页面大小:2061KB  

    ii.  总请求数:99

    iii.  可缓存资源所占比例

    如果想让自己的网站比大部分网站都快,可以考虑设定一个目标:一个1648KB的网站,包括79个请求,其中44个请求可以缓存,这将使你的网站领先平均水平20%。

    结语

    本篇文章参考了网上的一些资料,同时加上了个人的经验总结,如有错误,敬请指出,不胜感激。

    如果对大家有帮助,欢迎点赞、评论和转发,感谢大家的支持

    展开全文
    qq_35942348 2020-07-14 21:04:03
  • 无论是行业技术交流,还是面试或被面试,时常有人会问到此类问题:你做架构设计原则是如何的?碰到过哪些相关的技术问题?如何解决的?架构如何演进的?等等一系列高并发高可用的相关问题。以前我在学习阅读总结...

    无论是行业技术交流,还是面试或被面试,时常有人会问到此类问题:你做架构设计的原则是如何的?碰到过哪些相关的技术问题?如何解决的?架构如何演进的?等等一系列高并发高可用的相关问题。以前我在学习阅读总结(系统架构师)文章中推荐过涛哥的《亿级流量-高并发高可用架构实战》这本书,如果缺少这方面的相关知识,你可以去读一读这本书,系统性学习一下,同时,我也相信这篇文章能帮你梳理一下整体的架构认知,以及演进过程,希望对你有用。

    1. 概述

    本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端架构的演进过程,同时,列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。

    2. 基本概念

    在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:

    • 分布式

    系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署在不同的服务器上,或两个相同功能的Tomcat分别部署在不同服务器上

    • 高可用

    系统中部分节点失效时,其他节点能够接替它继续提供服务,则可认为系统具有高可用性

    • 集群

    一个特定领域的软件部署在多台服务器上并作为一个整体提供一类服务,这个整体称为集群。如Zookeeper中的Master和Slave分别部署在多台服务器上,共同组成一个整体提供集中配置服务。在常见的集群中,客户端往往能够连接任意一个节点获得服务,并且当集群中一个节点掉线时,其他节点往往能够自动的接替它继续提供服务,这时候说明集群具有高可用性

    • 负载均衡

    请求发送到系统时,通过某些方式把请求均匀分发到多个节点上,使系统中每个节点能够均匀的处理请求负载,则可认为系统是负载均衡的

    • 正向代理和反向代理

    系统内部要访问外部网络时,统一通过一个代理服务器把请求转发出去,在外部网络看来就是代理服务器发起的访问,此时代理服务器实现的是正向代理;当外部请求进入系统时,代理服务器把该请求转发到系统中的某台服务器上,对外部请求来说,与之交互的只有代理服务器,此时代理服务器实现的是反向代理。简单来说,正向代理是代理服务器代替系统内部来访问外部网络的过程,反向代理是外部请求访问系统时通过代理服务器转发到内部服务器的过程。

    3. 架构演进

    3.1 单机架构

    以淘宝作为例子。在网站最初时,应用数量与用户数都较少,可以把Tomcat和数据库部署在同一台服务器上。浏览器往www.taobao.com发起请求时,首先经过DNS服务器(域名系统)把域名转换为实际IP地址10.102.4.1,浏览器转而访问该IP对应的Tomcat。

    随着用户数的增长,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务

    3.2 第一次演进:Tomcat与数据库分开部署

    Tomcat和数据库分别独占服务器资源,显著提高两者各自性能。

    随着用户数的增长,并发读写数据库成为瓶颈

    3.3 第二次演进:引入本地缓存和分布式缓存

    在Tomcat同服务器上或同JVM中增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的html页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。

    缓存抗住了大部分的访问请求,随着用户数的增长,并发压力主要落在单机的Tomcat上,响应逐渐变慢

    3.4 第三次演进:引入反向代理实现负载均衡

    在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个Tomcat中。此处假设Tomcat最多支持100个并发,Nginx最多支持50000个并发,那么理论上Nginx把请求分发到500个Tomcat上,就能抗住50000个并发。其中涉及的技术包括:Nginx、HAProxy,两者都是工作在网络第七层的反向代理软件,主要支持http协议,还会涉及session共享、文件上传下载的问题。

    反向代理使应用服务器可支持的并发量大大增加,但并发量的增长也意味着更多请求穿透到数据库,单机的数据库最终成为瓶颈

    3.5 第四次演进:数据库读写分离

    把数据库划分为读库和写库,读库可以有多个,通过同步机制把写库的数据同步到读库,对于需要查询最新写入数据场景,可通过在缓存中多写一份,通过缓存获得最新数据。其中涉及的技术包括:比如Mycat,它是数据库中间件,可通过它来组织数据库的分离读写和分库分表,客户端通过它来访问下层数据库,还会涉及数据同步,数据一致性的问题。

    业务逐渐变多,不同业务之间的访问量差距较大,不同业务直接竞争数据库,相互影响性能

    3.6 第五次演进:数据库按业务分库

    把不同业务的数据保存到不同的数据库中,使业务之间的资源竞争降低,对于访问量大的业务,可以部署更多的服务器来支撑。这样同时导致跨业务的表无法直接做关联分析,需要通过其他途径来解决,比如做数据异构,但这不是本文讨论的重点,有兴趣的可以自行搜索解决方案,或读一下涛哥的书(又推荐了一次)

    随着用户数的增长,单机的写库会逐渐会达到性能瓶颈

    3.7 第六次演进:把大表拆分为小表

    比如针对评论数据,可按照商品ID进行hash,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能。其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。

    这种做法显著的增加了数据库运维的难度,对DBA的要求较高。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的,如分库分表的管理和请求分发,由Mycat实现,SQL的解析由单机的数据库实现,读写分离可能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是MPP(大规模并行处理)架构的一类实现。

    目前开源和商用都已经有不少MPP数据库,开源中比较流行的有Greenplum、TiDB、Postgresql XC、HAWQ等,商用的如南大通用的GBase、睿帆科技的雪球DB、华为的LibrA等等,不同的MPP数据库的侧重点也不一样,如TiDB更侧重于分布式OLTP场景,Greenplum更侧重于分布式OLAP场景,这些MPP数据库基本都提供了类似Postgresql、Oracle、MySQL那样的SQL标准支持能力,能把一个查询解析为分布式的执行计划分发到每台机器上并行执行,最终由数据库本身汇总数据进行返回,也提供了诸如权限管理、分库分表、事务、数据副本等能力,并且大多能够支持100个节点以上的集群,大大降低了数据库运维的成本,并且使数据库也能够实现水平扩展。

    数据库和Tomcat都能够水平扩展,可支撑的并发大幅提高,随着用户数的增长,最终单机的Nginx会成为瓶颈

    3.8 第七次演进:使用LVS或F5来使多个Nginx负载均衡

    由于瓶颈在Nginx,因此无法通过两层的Nginx来实现多个Nginx的负载均衡。图中的LVS和F5是工作在网络第四层的负载均衡解决方案,其中LVS是软件,运行在操作系统内核态,可对TCP请求或更高层级的网络协议进行转发,因此支持的协议更丰富,并且性能也远高于Nginx,可假设单机的LVS可支持几十万个并发的请求转发;F5是一种负载均衡硬件,与LVS提供的能力类似,性能比LVS更高,但价格昂贵。由于LVS是单机版的软件,若LVS所在服务器宕机则会导致整个后端系统都无法访问,因此需要有备用节点。可使用keepalived软件模拟出虚拟IP,然后把虚拟IP绑定到多台LVS服务器上,浏览器访问虚拟IP时,会被路由器重定向到真实的LVS服务器,当主LVS服务器宕机时,keepalived软件会自动更新路由器中的路由表,把虚拟IP重定向到另外一台正常的LVS服务器,从而达到LVS服务器高可用的效果。

    此处需要注意的是,上图中从Nginx层到Tomcat层这样画并不代表全部Nginx都转发请求到全部的Tomcat,在实际使用时,可能会是几个Nginx下面接一部分的Tomcat,这些Nginx之间通过keepalived实现高可用,其他的Nginx接另外的Tomcat,这样可接入的Tomcat数量就能成倍的增加。

    由于LVS也是单机的,随着并发数增长到几十万时,LVS服务器最终会达到瓶颈,此时用户数达到千万甚至上亿级别,用户分布在不同的地区,与服务器机房距离不同,导致了访问的延迟会明显不同

    3.9 第八次演进:通过DNS轮询实现机房间的负载均衡

    在DNS服务器中可配置一个域名对应多个IP地址,每个IP地址对应到不同的机房里的虚拟IP。当用户访问www.taobao.com时,DNS服务器会使用轮询策略或其他策略,来选择某个IP供用户访问。此方式能实现机房间的负载均衡,至此,系统可做到机房级别的水平扩展,千万级到亿级的并发量都可通过增加机房来解决,系统入口处的请求并发量不再是问题。

    随着数据的丰富程度和业务的发展,检索、分析等需求越来越丰富,单单依靠数据库无法解决如此丰富的需求

    3.10 第九次演进:引入NoSQL数据库和搜索引擎等技术

    当数据库中的数据多到一定规模时,数据库就不适用于复杂的查询了,往往只能满足普通查询的场景。对于统计报表场景,在数据量大时不一定能跑出结果,而且在跑复杂查询时会导致其他查询变慢,对于全文检索、可变数据结构等场景,数据库天生不适用。因此需要针对特定的场景,引入合适的解决方案。如对于海量文件存储,可通过分布式文件系统HDFS解决,对于key value类型的数据,可通过HBase和Redis等方案解决,对于全文检索场景,可通过搜索引擎如ElasticSearch解决,对于多维分析场景,可通过Kylin或Druid等方案解决。

    当然,引入更多组件同时会提高系统的复杂度,不同的组件保存的数据需要同步,需要考虑一致性的问题,需要有更多的运维手段来管理这些组件等。

    引入更多组件解决了丰富的需求,业务维度能够极大扩充,随之而来的是一个应用中包含了太多的业务代码,业务的升级迭代变得困难

    3.11 第十次演进:大应用拆分为小应用

    按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代。这时候应用之间可能会涉及到一些公共配置,可以通过分布式配置中心Zookeeper来解决。

    不同应用之间存在共用的模块,由应用单独管理会导致相同代码存在多份,导致公共功能升级时全部应用代码都要跟着升级

    3.12 第十一次演进:复用的功能抽离成微服务

    如用户管理、订单、支付、鉴权等功能在多个应用中都存在,那么可以把这些功能的代码单独抽取出来形成一个单独的服务来管理,这样的服务就是所谓的微服务,应用和服务之间通过HTTP、TCP或RPC请求等多种方式来访问公共服务,每个单独的服务都可以由单独的团队来管理。此外,可以通过Dubbo、SpringCloud等框架实现服务治理、限流、熔断、降级等功能,提高服务的稳定性和可用性。

    不同服务的接口访问方式不同,应用代码需要适配多种访问方式才能使用服务,此外,应用访问服务,服务之间也可能相互访问,调用链将会变得非常复杂,逻辑变得混乱

    3.13 第十二次演进:引入企业服务总线ESB屏蔽服务接口的访问差异

    通过ESB统一进行访问协议转换,应用统一通过ESB来访问后端服务,服务与服务之间也通过ESB来相互调用,以此降低系统的耦合程度。这种单个应用拆分为多个应用,公共服务单独抽取出来来管理,并使用企业消息总线来解除服务之间耦合问题的架构,就是所谓的SOA(面向服务)架构,这种架构与微服务架构容易混淆,因为表现形式十分相似。个人理解,微服务架构更多是指把系统里的公共服务抽取出来单独运维管理的思想,而SOA架构则是指一种拆分服务并使服务接口访问变得统一的架构思想,SOA架构中包含了微服务的思想。

    业务不断发展,应用和服务都会不断变多,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题,此外,对于如大促这类需要动态扩缩容的场景,需要水平扩展服务的性能,就需要在新增的服务上准备运行环境,部署服务等,运维将变得十分困难

    3.14 第十三次演进:引入容器化技术实现运行环境隔离与动态服务管理

    目前最流行的容器化技术是Docker,最流行的容器管理服务是Kubernetes(K8S),应用/服务可以打包为Docker镜像,通过K8S来动态分发和部署镜像。Docker镜像可理解为一个能运行你的应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动Docker镜像就可以把服务起起来,使服务的部署和运维变得简单。

    在大促的之前,可以在现有的机器集群上划分出服务器来启动Docker镜像,增强服务的性能,大促过后就可以关闭镜像,对机器上的其他服务不造成影响(在3.14节之前,服务运行在新增机器上需要修改系统配置来适配服务,这会导致机器上其他服务需要的运行环境被破坏)。

    使用容器化技术后服务动态扩缩容问题得以解决,但是机器还是需要公司自身来管理,在非大促的时候,还是需要闲置着大量的机器资源来应对大促,机器自身成本和运维成本都极高,资源利用率低

    3.15 第十四次演进:以云平台承载系统

    系统可部署到公有云上,利用公有云的海量机器资源,解决动态硬件资源的问题,在大促的时间段里,在云平台中临时申请更多的资源,结合Docker和K8S来快速部署服务,在大促结束后释放资源,真正做到按需付费,资源利用率大大提高,同时大大降低了运维成本。

    所谓的云平台,就是把海量机器资源,通过统一的资源管理,抽象为一个资源整体,在之上可按需动态申请硬件资源(如CPU、内存、网络等),并且之上提供通用的操作系统,提供常用的技术组件(如Hadoop技术栈,MPP数据库等)供用户使用,甚至提供开发好的应用,用户不需要关系应用内部使用了什么技术,就能够解决需求(如音视频转码服务、邮件服务、个人博客等)。在云平台中会涉及如下几个概念:

    • IaaS:基础设施即服务。对应于上面所说的机器资源统一为资源整体,可动态申请硬件资源的层面;
    • PaaS:平台即服务。对应于上面所说的提供常用的技术组件方便系统的开发和维护;
    • SaaS:软件即服务。对应于上面所说的提供开发好的应用或服务,按功能或性能要求付费。

    至此,以上所提到的从高并发访问问题,到服务的架构和系统实施的层面都有了各自的解决方案,但同时也应该意识到,在上面的介绍中,其实是有意忽略了诸如跨机房数据同步、分布式事务实现等等的实际问题,这些问题以后有机会再拿出来单独讨论

    4. 架构设计总结

    • 架构的调整是否必须按照上述演变路径进行?

    不是的,以上所说的架构演变顺序只是针对某个侧面进行单独的改进,在实际场景中,可能同一时间会有几个问题需要解决,或者可能先达到瓶颈的是另外的方面,这时候就应该按照实际问题实际解决。如在政府类的并发量可能不大,但业务可能很丰富的场景,高并发就不是重点解决的问题,此时优先需要的可能会是丰富需求的解决方案。

    • 对于将要实施的系统,架构应该设计到什么程度?

    对于单次实施并且性能指标明确的系统,架构设计到能够支持系统的性能指标要求就足够了,但要留有扩展架构的接口以便不备之需。对于不断发展的系统,如电商平台,应设计到能满足下一阶段用户量和性能指标要求的程度,并根据业务的增长不断的迭代升级架构,以支持更高的并发和更丰富的业务。

    • 服务端架构和大数据架构有什么区别?

    所谓的“大数据”其实是海量数据采集清洗转换、数据存储、数据分析、数据服务等场景解决方案的一个统称,在每一个场景都包含了多种可选的技术,如数据采集有Flume、Sqoop、Kettle等,数据存储有分布式文件系统HDFS、FastDFS,NoSQL数据库HBase、MongoDB等,数据分析有Spark技术栈、机器学习算法等。总的来说大数据架构就是根据业务的需求,整合各种大数据组件组合而成的架构,一般会提供分布式存储、分布式计算、多维分析、数据仓库、机器学习算法等能力。而服务端架构更多指的是应用组织层面的架构,底层能力往往是由大数据架构来提供。

    • 有没有一些架构设计的原则?
    1. N+1设计。系统中的每个组件都应做到没有单点故障;
    2. 回滚设计。确保系统可以向前兼容,在系统升级时应能有办法回滚版本;
    3. 禁用设计。应该提供控制具体功能是否可用的配置,在系统出现故障时能够快速下线功能;
    4. 监控设计。在设计阶段就要考虑监控的手段;
    5. 多活数据中心设计。若系统需要极高的高可用,应考虑在多地实施数据中心进行多活,至少在一个机房断电的情况下系统依然可用;
    6. 采用成熟的技术。刚开发的或开源的技术往往存在很多隐藏的bug,出了问题没有商业支持可能会是一个灾难;
    7. 资源隔离设计。应避免单一业务占用全部资源;
    8. 架构应能水平扩展。系统只有做到能水平扩展,才能有效避免瓶颈问题;
    9. 非核心则购买。非核心功能若需要占用大量的研发资源才能解决,则考虑购买成熟的产品;
    10. 使用商用硬件。商用硬件能有效降低硬件故障的机率;
    11. 快速迭代。系统应该快速开发小功能模块,尽快上线进行验证,早日发现问题大大降低系统交付的风险;
    12. 无状态设计。服务接口应该做成无状态的,当前接口的访问不依赖于接口上次访问的状态。
    • 【高可用高并发】系统设计原则

    可以阅读一下我的这篇文章:【高可用高并发】系统设计原则

    5. 参考资料

    服务端高并发分布式架构演进之路

    https://segmentfault.com/a/1190000018626163

     

     

     

    ------------------------------------------------------

    ------------------------------------------------------

     

    关于我(个人域名)

    我的开源项目集Github

     

    期望和大家一起学习,一起成长,共勉,O(∩_∩)O谢谢

    欢迎交流问题,可加个人QQ 469580884,

    或者,加我的群号 751925591,一起探讨交流问题

    不讲虚的,只做实干家

    Talk is cheap,show me the code

    如果觉得内容赞,您可以请我喝杯咖啡:

            

    展开全文
    hemin1003 2019-07-09 09:52:00
  •  (用户行为数据,系统性能监控数据,系统异常和业务相关数据等的上报) 三,数据分级存储原则:单内存cache存储,内存cache+异步更新,内存cache+同步更新; (从三个纬度分析用户行为模型,决定相关数据的存储...

    一,可(异地)部署和就近路由接入,破除单点故障;

          (可分布,可调度的原则)

     

    二,数据上报和监控平台;

          (用户行为数据,系统性能监控数据,系统异常和业务相关数据等的上报)

     

    三,数据分级存储原则:单内存cache存储,内存cache+异步更新,内存cache+同步更新;

          (从三个纬度分析用户行为模型,决定相关数据的存储策略:1,能忍受用户数据的丢失吗?2,能忍受数据的非及时性吗?

            3,数据的读写比例分布如何?)

     

    四,动静分离原则;

          (能静态化尽量静态化,在代码和进程部署上,在DNS层上做好动静分离的系统设计准备)

     

    五,轻重分离原则;

          (保持接入和业务处理的分离,接入尽量轻量化,使得系统具有很好的吞吐量,处理尽量异步化,使得可以平滑扩展)

     

    六,破除服务依赖原则:同一IDC的其他服务对系统的影响,第三方调用系统接口的隔离和过载保护,依赖第三方服务的

    监控和安全保护原则等。

     

    七,柔性可用原则;

          (处理好异常情况下的灰度体验,区分好关键处理路径和非关键路径,而系统设计要尽量把关键路径转换成非关键路径)


    八,能异步的尽量异步原则;

          (通过内存管道,操作流水等技术进行拼接各个处理模块)

     

    九,灰度原则;

          (灰度发布策略是根据用户号码段,用户ip段,还是用户vip等级,用户所在城市等进行灰度升级,保证系统的平滑迭代)

     

    十,异常的快速响应和一键切换原则;

          (IDC断电?系统切换到正常的成本是多少?时间呢?需要几个人操作?牛的系统可以一个人在管理后台按一个按钮就可以切换,再按一下就可以切换回来)

     

    十一,有损服务原则;

          (用低成本提供海量的服务原则)

     

    十二,一切简单化处理的原则,真真假假,假假真真!

          (方案的简单化,允许的误差评估等)

     

    十三,充分利用DNS层做好系统的可分布设计。

     

    十四,区分系统行为和用户行为并分别进行设计,甚至在关键时刻可以进行转换。

     

    十五,坚持app_server设计的无状态设计原则,转变用户行为为系统行为,使得app_server具有无状态的特点。

     

    十六,负载均衡原则和平滑扩容。

     

    十七,多级cache设计以及各个cache的路由设计。

     

    十八,“大系统小做”原则。   


    十九,面向接口编程,面向服务编程设计原则,解耦业务模块的依赖关系。


    二十,强事务模型到最终一致性事务模型的转换原则。

    展开全文
    chen_fly2011 2017-02-14 16:55:35
  • vivo_tech 2019-12-23 10:24:38
  • w397090770 2020-02-16 21:17:15
  • yuanziok 2020-03-26 10:39:48
  • qq_33154343 2019-07-23 00:19:27
  • cuichun6294 2018-05-07 14:59:44
  • 5星
    4KB goodxianping 2021-11-01 15:31:58
  • zhanglinlove 2019-05-12 19:17:15
  • qf2019 2019-12-02 09:51:22
  • qq_36632174 2020-11-23 15:31:41
  • qq_43692950 2021-06-12 19:20:22
  • u012921921 2020-07-05 16:29:25
  • naisongwen 2021-04-07 00:50:38
  • qq_41904194 2020-02-23 23:23:20
  • Enmotech 2017-12-06 00:00:00
  • fzpzy123 2010-06-02 11:22:00
  • slowwind2007_lishu 2013-08-27 20:28:13
  • zhongqi2513 2018-03-08 18:09:35
  • qq_38265137 2020-04-18 16:22:29
  • universsky2015 2019-08-17 16:02:55
  • qq_30513483 2019-01-03 10:32:06
  • slowwind2007_lishu 2013-08-30 21:15:03

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,701
精华内容 11,080
关键字:

数据架构设计的八大原则