前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术角 | 架构学习书摘总结(五)架构实战(中)

技术角 | 架构学习书摘总结(五)架构实战(中)

作者头像
ZNing
发布2020-05-13 09:41:03
4520
发布2020-05-13 09:41:03
举报
文章被收录于专栏:ZNing·腾创库ZNing·腾创库

最近阅读了一本架构方面的入门图书叫《从零开始学架构:照着做,你也能成为架构师》,部分内容比较不错,先做书摘总结,以便加深印象与未来回顾学习。

本文是该书第五部分中的第十八章,主要介绍互联网架构模板等架构实际案例内容。

目录

▪第十八章 互联网架构模板

第十八章 互联网架构模板

上图基本涵盖互联网技术公司的大部分技术点,不同的公司只是在具体的技术实现上稍有差异,但不会跳出这个框架的范畴。

  1. 存储层技术
    1. SQL SQL即我们通常所说的关系型数据(库)。随着互联网业务的发展,性能要求越来越高,必然面对一个问题:将数据拆分到多个数据库实例才能满足业务的性能需求(其实Oracle也一样,只是时间早晚的问题)。数据库拆分满足了性能的要求,但带来了复杂度的问题:数据如何拆分、数据如何组合。所以互联网公司流行的做法是业务发展到一定阶段后,就会将这部分功能独立成中间件,例如淘宝的TDDL。再后期会导致新的复杂度问题:数据库资源使用率不高,比较浪费以及各SQL集群分开维护,投入的维护成本越来越高。因此,实力雄厚的大公司此时一般都会在SQL集群上构建SQL存储平台,以对业务透明的形式提供资源分配、数据备份、迁移、容灾、读写分离、分库分表等一系列服务。例如,淘宝的UMP(Unified MySQL Platform)系统。
    2. NoSQL NoSQL不是No SQL,而是Not Only SQL,即NoSQL是SQL的补充。首先NoSQL在数据结构上与传统的SQL的不同,例如典型的Memcache的key-value结构、Redis的复杂数据结构、MongoDB的文档数据结构;其次,NoSQL无一例外地都会将性能作为自己的一大卖点。 NoSQL的这两个特点很好地弥补了关系数据库的不足,因此在互联网行业NoSQL的应用基本上是基础要求。 由于NoSQL方案一般自己本身就提供集群功能,因此NoSQL在刚才是应用时很方便,不像SQL分库分表那么复杂。而NoSQL发展到一定规模后,通常都会在NoSQL集群的基础之上再实现统一存储平台。统一存储平台主要实现资源动态按需动态分配、资源自动化管理、故障自动化处理等几个功能。当然要发展到这个阶段,一般也是大公司才会这么做,简单来说就是如果只有几十台NoSQL服务器,那么做存储平台的收益不大;但如果有几千台NoSQL服务器,那么NoSQL存储平台就能够产生很大的收益。
    3. 小文件存储 除了关系型的业务数据,互联网行业还有很多用于展示的数据。这些数据具有数据量小一般在1M以下、数据量巨大、访问量巨大的典型特点。Facebook 2013年就达到每天上传3.5亿张照片,访问量超过10亿的规模。和SQL和NoSQL不同的是,小文件存储不一定需要公司或者业务规模很大,基本上认为业务在起步阶段就可以考虑做小文件统一存储。得益于开源与大数据,开源方案基础上封装一个小文件存储平台不太难。例如HBASE、Hadoop、Hypertable、FastDFS等都可以作为小文件存储的底层平台,只需要在这些开源方案上再包装一下基本上就可以用了。
    4. 大文件存储 互联网行业的大文件主要分为两类:一类是业务上的大数据,例如YouTube的视频、电影;一类是海量的日志数据,例如各种访问日志、操作日志、用户轨迹日志等。大文件没有小文件那么多,但每个文件都很大。这块开源方案也很成熟了,所以大数据存储和处理可以选择Hadoop、HBASE、Storm、Hive等。
  2. 开发层技术
    1. 开发框架 互联网公司都会指定一个大的技术方向,然后使用统一的开发框架。例如,Java相关的开发框架SSH、SpringMVC、SpringCloud、Play,Ruby的Ruby on Rails,PHP的ThinkPHP,Python的Django等等。使用统一的开发框架能够解决上面提到的各种问题,大大提升组织和团队的开发效率。 对于框架的选择,有一个总的原则:优选成熟的框架,避免盲目追逐新技术。首先,成熟的框架资料文档齐备;其次,成熟的框架受众更广,招聘时更容易招到合适的人才;最后,成熟的框架更加稳定,不会出现大的变动,适合长期发展。
    2. Web服务器 开发框架只是负责完成业务功能的开发,真正能够运行起来,给用户提供服务,还需要服务器配合。选择一个服务器主要和开发语言相关,例如Java有Tomcat、JBoss、Resin等,PHP/Python的用Nginx,当然最保险的就是用Apache了,什么语言都支持。有人要担心Apache性能之类的问题,其实不用过早担心这个,等到业务真的发展到Apache撑不住的时候再考虑切换也不迟,那时候你有的是钱,有的是人,有的是时间。
    3. 容器 传统的虚拟化技术是虚拟机,解决了跨平台的问题,但由于虚拟机太庞大,启动慢,运行时太占资源,在互联网行业并没有大规模地应用;而Docker的容器技术,虽然没有跨平台,但启动快,几乎不占资源,推出后立刻就火起来了。不要以为Docker只是一个虚拟化或容器技术,它将在很大程度上改变目前的技术形势:
      1. 运维方式会发生革命性的变化:Docker启动快,几乎不占资源,随时启动停止,基于Docker打造自动化运维、智能化运维将成为主流方式。
      2. 设计模式会发生本质上的变化:启动一个新的容器实例代价如此低,将鼓励设计思路朝“微服务”的方向发展。

    例如,一个传统的网站包括登录注册、页面访问、搜索等功能,没有用容器的情况下,除非有特别大的访问量,否则这些功能开始时都是集成在一个系统里面的;有了容器技术以后,一开始就可以将这些功能按照服务的方式设计,避免后续访问量增大时又要重构系统。

  3. 服务层技术 服务层的主要目标是为了降低系统间相互关联的复杂度。
    1. 配置中心 配置中心就是集中管理各个系统的配置。将配置中心做成通用的系统有如下好处:
      1. 集中配置多个系统,操作效率高。
      2. 所有配置都在一个集中的地方,检查方便,协作效率高。
      3. 配置中心可以实现程序化的规则检查,避免常见的错误。
      4. 配置中心相当于备份了系统的配置,当某些情况下需要搭建新的环境时,能够快速搭建环境和恢复业务。

    配置中心通过“系统标示+host+port”来标示唯一一个系统运行实例是常见的设计方法。

    1. 服务中心 服务中心未来解决跨系统依赖的配置和调度问题。其实现一般来说有两种方式:服务名字系统和服务总线系统。 服务名字系统(Service Name System),类似于DNS,其是为了将Service名称解析为“host+port+接口名称”,但是和DNS一样,真正发起请求的还是请求方。 服务总线系统(Service Bus System),类似于计算机总线,其为了直接由总线系统完成调用,服务请求方不需要直接和服务提供方交互。 两者简单对比如下: 服务总线系统服务名字系统复杂度设计更加复杂,要同时完成配置和调度功能,且本身高性能和高可用的设计也更加复杂。设计简单,基本类似一个服务配置中心,如果要做调度,需要独立的SDK包。可用性可用性的关键,它故障后所有业务间的访问都调用,影响较大,但因为服务总线主要做调度,可以部署两套或多套并行系统。仅仅保存配置,调用还是由服务请求方发起,可用性要求没那么高,即使故障,各系统也可以使用本地缓存配置继续完成调用。灵活性控制所有的调度和配置,可以做得非常灵活。仅仅有配置,即使提供独立的SDK支持调度,灵活性也要差一点,毕竟SDK只能获取静态的配置信息。实时性系统完成实际的调度,可以做到非常实时,例如某个服务及机器故障后立刻剔除故障节点。提供调度的SDK包,也需要定时更新配置,不能每次请求都去获取一下最新的配置,实时性一般,这个问题和DNS类似。可维护性服务总线系统的修改和升级只需要自己完成即可。修改和升级大部分情况下要修改SDK包(例如,调度算法变更),修改SDK包要求所有系统应用新SDK包才能生效。多语言支持服务总线系统支持通用的HTTP和TCP协议,和语言无关。服务名字系统提供的SDK包需要适配多个语言,这个工作量也不小。
    2. 消息队列 消息队列系统基本功能的实现比较简单,但要做到高性能、高可用、消息时序性、消息事务性则比较难。
  4. 网络层技术
    1. 负载均衡 负载均衡就是将请求均衡的分配到多个系统上。其实现方式很多,可大可小,可以软件实现,也可以硬件实现。 DNS是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。DNS负载均衡的优点是通用、成本低,但缺点也明显:DNS缓存时间比较长;DNS不能感知后端服务器的状态,只能根据配置策略进行负载均衡,无法做到更加灵活的负载均衡策略。所以对于时延和故障敏感的业务,有一些公司自己实现了HTTP-DNS的功能,即使用HTTP协议实现一个私有的DNS系统,这样的方案与通用DNS优缺点正好相反。 Nginx&LVS&F5用于同一地点内及其级别的负载均衡,其中Nginx是软件的7层负载均衡,LVS是内核的4层负载均衡,F5是硬件做4层负载均衡。 软件和硬件的区别就在于性能,硬件远远高于软件,Nginx的性能是万级,一般的Linux服务器上装个Nginx大概能到5万/秒;LVS的性能是十万级,没有具体测试过,据说可以达到80万/秒;F5性能是百万级,从200万/秒-800万/秒都有。 4层和7层的区别在于协议和灵活性。Nginx支持HTTP、E-mail等协议,而LVS和F5是4层负载均衡,和协议无关,几乎所有应用都可以做,例如聊天、数据库等。
    2. CDN CDN是为了解决用户忘了访问时的”最后一公里“效应,即将内容缓存在离用户最近的地方,用户访问的是缓存的内容,而不是站点实时内容。CDN经过多年的发展,已经变成了一个很庞大的体系:分布式存储、全局负载均衡、网络重定向、流量控制等都属于CDN的范畴。
    3. 多机房 多机房设计最核心的因素就是如何处理时延带来的影响。常见策略有: 同城多机房:可搭建私有高速网络,基本做到与同机房一样的效果。对业务影响较小,但投入较大,而且遇到地震水灾等严重自然灾害也是有很大风险。 跨城多机房:机房间通过网络进行数据复制,但由于跨城网络时延问题业务上需要做一定的妥协和兼容,不需要数据的实时强一致性,保证最终一致性即可。这种方式实现简单,但和业务有很强的相关性,微博可以这样做,支付宝就不能这样做。 跨国多机房:同跨城多机房,只是地理分布更远、时延更大。所以一般仅用于备份和服务本国用户。
    4. 多中心 多中心要求每个中心都同时对外提供服务,且业务能够自动在多中心之间切换,故障后不需要人工干预或很少干预就能自动恢复。 多中心设计的关键就在于”数据一致性“和”数据事务性“如何保证,但这两个难点都和业务紧密相关,不存在通用的解决方案,需要基于业务的特性进行详细的分析和设计。正因为多中心设计的复杂性,不一定所有业务都能实现多中心,目前国内的银行、支付宝这类系统就没有完全实现多中心。不然也不会出现挖掘机一铲子下去,支付宝中断4小时的故障。
  5. 用户层技术
    1. 用户管理 第一个目标:SSO,单点登录,又叫统一登录。单点登录的技术实现手段较多,例如cookie、token等,最有名的开源方案为CAS。 第二个目标:授权登录。现在最流行的授权登录就是OAuth 2.0协议,基本上已经成为事实上的标准,如果要做开放平台,则最好用这个协议,私有协议漏洞多,第三方介入也麻烦。 用户管理面临的主要问题是用户数巨大,一般至少千万级,但实现起来并不难,主要是因为不同用户之间没有关联。
    2. 消息推送 消息推送根据不同的途径,分为短信、邮件、站内信、App推送。App目前主要分为iOS和Android推送,iOS系统比较规范和封闭,基本上只能使用苹果的APNS了;但Android在国外用GCM和APNS差别不大,但在国内GCM不能用,另外各个厂商都有自己定制的Android,消息推送实现也不完全一样。通常情况下,对于中小公司,如果不涉及敏感数据,则Android系统上推荐使用第三方推送服务,因为这些第三方是专业做推送服务的,消息到达率是有一定保证的。 如果涉及敏感数据,则需要自己实现消息推送,这时就有一定的技术挑战了。消息推送主要包含3个功能:设备管理(唯一标识、注册、注销)、连接管理和消息管理,技术上面临的主要挑战有:海量设备和用户管理、连接保活、消息管理。
    3. 存储云与图片云 通常的实现都是”CDN+小文件存储“。由于图片业务的复杂性,普通的文件基本上提供存储和访问功能就够了,但图片涉及的业务可能包括裁剪、压缩、美化、审核、水印等处理,因此通常情况下图片云会拆分为独立的系统对用户提供服务。
  6. 业务层技术 业务层面对的主要技术挑战是复杂性,而不管什么业务难题,用上”拆“问题一般都迎刃而解。究其原因,复杂性的一个主要原因就是系统越来越庞大,业务越来越多,降低复杂性最好的方式就是“拆”,化整为零、分而治之,将整体复杂性分散到多个子业务或子系统里面去。 而子系统数量过多,则需要“合”。按照“高内聚,低耦合”的原则,将职责关联比较强的子系统合成一个虚拟业务域,然后通过网关对外统一呈现,类似于设计模式中的Facade模式。
  7. 平台技术
    1. 运维平台 运维平台核心的职责分为四大块:配置(资源管理:机器、IP、虚拟机)、部署(将系统发布到线上:包、灰度发布、回滚)、监控(收集系统上线运行后的相关数据并进行监控以便及时发现问题)、应急(系统出故障后的处理:停止程序、下线故障机器、切换IP)。 运维平台的核心设计要素:标准化、平台化、自动化、可视化标准化:需要制定运维标准,规范配置管理、部署流程、监控指标、应急能力等,各系统按照运维标准来实现,避免不同的系统不同的处理方式。标准化是运维平台的基础,没有标准化就没有运维平台。 平台化:在运维标准化的基础上,将运维的相关操作都集成到运维平台中,通过运维平台来完成运维工作。通过平台可将运维标准固化到平台中,且可以同简单方便的操作,可以复用支撑几百上千个业务系统。 自动化:将重复操作固化,由系统自动完成。类似还有监控。 可视化:提升数据查看效率,原理与汽车仪表盘类似。可直观地看到数据的相关属性,能够将数据的含义展示出来,能够将关联数据整合一起展示。
    2. 测试平台 核心职责是测试,包括单元测试、集成测试、接口测试、性能测试等。测试平台的核心目的是提升测试效率,从而提升产品质量,其设计关键就是自动化。为达到自动化,测试平台包括用例管理、资源管理、任务管理、数据管理等。
    3. 数据平台 核心职责包括数据管理、数据分析和数据应用。其中数据管理包括数据采集、数据存储、数据访问和数据安全四个核心职责,是数据平台的基础。数据分析包括数据统计、数据挖掘、机器学习、深度学习等几个细分领域。数据应用就广泛了,既包括在线业务,也包括利息按业务。例如推荐、广告等属于在线应用,报表、欺诈简称、异常检测等属于离线应用。
    4. 管理平台 核心职责是权限管理,无论业务系统(例如淘宝网)、中间件系统(例如消息队列Kafka),还是平台系统(例如运维平台)都需要进行管理。权限管理主要分为两部分:身份认证、权限控制。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 慧响 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档