写点什么

架构师训练营 -week04 作业

用户头像
GunShotPanda
关注
发布于: 2020 年 07 月 01 日
架构师训练营 -week04 作业

作业一:一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。


大型互联网架构


以开发的眼光,来看老东家的架构,只能线性的联系一下,现在学习以架构的眼光,来重新组织知识,说的比较笼统,以后会补充,想到哪写到哪吧

架构目标

低成本:任何公司存在的价值都是为了获取商业利益。在可能的情况下,希望一切都是低成本的。

高性能:网站性能是客观的指标,可以具体体现到响应时间、吞吐量等技术指标。系统的响应延迟,指系统完成某一功能需要使用的时间;系统的吞吐量,指系统在某一时间可以处理的数据总量,通常可以用系统每秒处理的总的数据量来衡量;系统的并发能力,指系统可以同时完成某一功能的能力,通常也用 QPS(query per second)来衡量。

高可用:系统的可用性(availability)指系统在面对各种异常时可以正确提供服务的能力。系统的可用性可 

以用系统停服务的时间与正常服务的时间的比例来衡量,也可以用某功能的失败次数与成功次数的比例来衡量。

易伸缩:注重线性扩展,是否可以容易通过加入机器来处理不断上升的用户访问压力。系统的伸缩性(scalability)指分布式系统通过扩展集群机器规模提高系统性能(吞吐、延迟、并发)、存储容量、计算能力的特性。

高安全:现在商业环境中,经常出现被网站被拖库,用户账户被盗等现象。网站的安全性不言而喻。

典型实现

下面典型的一次 web 交互请求示意图。


DNS

  1. 当用户在浏览器中输入网站地址后,浏览器会检查浏览器缓存中是否存在对应域名的解析结果。如果有,则解析过程结束;否则进入下一个步骤

  2. 浏览器查找操作系统缓存中是否存在这个域名的解析结果。这个缓存的内容来源就是操作系统的 hosts 文件。如果有,则解析过程结束;否则进入下一个步骤

  3. 前两个步骤都是本地查找,没有发生网络交互。在本步骤中,会使用到在网络配置的中 DNS 地址。这个地址我们通常称之为 LDNS(Local DNS)。操作系统会把域名发送给 LDNS 解析。如果解析成功,则解析过程结束;否则进入下一个步骤

  4. LDNS 将请求返回给 GTLD(Global Top Level Domain)服务器,GTLD 服务器查找此域名对应的 Name Server 域名的地址。这个 Name Server 通常就是你的域名提供商的服务器。Name Server 根据客户请求,返回该域名对应的 IP 地址和 TTL(Time To Live)值。

  5. 浏览器根据 TTL 值,把这个域名对应的 IP 缓存在本地系统中。域名至此解析结束。

CDN

CDN(Content Delivery Network,内容分发网络)部署在网络提供商的机房里面。在用户请求网站服务时,可以从距离自己最近的网络提供商获取数据。比如视频网站和内容网站的热点内容。

如果需要自己搭建 CDN 系统,有 3 种主流方案可以选择:

  • squid 是缓存服务器科班出生,自己实现了一套内存页/磁盘页的管理系统

  • varnish 是觉得 squid 性能不行,varnish 觉得 linux 内核已经把虚拟内存管理做得很好了,squid 的多此一举反而影响了性能。

  • nginx cache 是属于不务正业,得益于 nginx 强大的插件机制。


主要接触过的就是 nginx。

LB

LB(Load Balance,负载均衡)就是将负载(用户的请求)根据某些策略,将负载分摊给多个操作单元执行。该技术可以提供服务器的响应速度以及利用效率,避免出现单点失效。

这里回顾下前面介绍的两个小节,其实本质上把数据分类(根据数据更新频率,分为动态文件,静态文件),并把数据放在离距离用户最近的地方。另外一点就是,在 DNS 和 CDN 具体实现时,也是大量使用了负载均衡技术。

常见的负载均衡算法由:RR(Round Robin,轮询),WRR(Weighted RR,加权轮询),Random(随机),LC(Least Connection,最少连接),SH(Source Hash,源址哈希)

在常见的互联网架构中,通常使用软件负载:LVS+HAproxy+WebServer(Nginx)。在部署时,LVS,HAProxy,WebServer 都会部署一个集群,用来进行负载均衡。LVS 工作在第 4 层,在网络层利用 IP 地址进行转发。 HAProxy 工作在第 7 层,根据用户的 HTTP 请求(比如根据 URL,消息头)来进行转发。

在上述实现中,通常还会使用 Keepalived+VIP(虚 IP) 技术。Keepalived 提供健康检查,故障转移,提高系统的可用性。通过 VIP(配置 DNS 绑定域名)的形式对网站进行访问。

WEB APP

前端技术:主流的 VUE,React ,不太了解

后端技术:

  • HTTP 协议:HTTP 协议大概分为请求头,请求体,响应头,响应体。无论是 WebServer 还是 ApplicationServer,很多花样都是基于请求头的请求路径来玩的。

  • API 接口:使用 RESTFUL API,暴露接口。它具有如下好处:1.充分利用 HTTP 协议本身语义。2.面向资源,一目了然,具有自解释性。3.无状态,在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,极大的降低了复杂度。

  • Application Server:在 Java 中,为了保证程序能够在各个厂商的 AS 中兼容运行,Sun 公司为制定了 J2EE 规范。从技术发展路径来看, Serverlet,JSP 演变都是为了更好地方便程序员们编程。以典型的 Tomcat 为例,Connector 和 Container 组成一个 Service,多个 Service 组成一个 Server。Connector 主要负责接受外部请求,Container 负责处理请求。Server 提供了生命周期管理,如启动,停止等,对于前沿互联网公司来说,比较过时了。

  • Session Framework:在大型互联网架构中,单台机器已经存放不了用户的登录信息。同时为了支持故障转移等特性,需要一套 session 管理机制,支持海量用户同时在线。通常可以在遵循 J2EE 的容器内,使用 Filter 模式和分布式缓存系统来实现。

  • MVC:即 Model,View 和 Controller。Model 代表业务逻辑,View 表示页面视图,Controller 表示根据用户请求,执行相应的业务逻辑,并选择适当的页面视图返回。用过 ROR 的同学都知道,里面的 router 配置了什么样的 URL 和什么样的 action 相对应。相应的,MVC 的本质就是根据不同的 URL 选择不同的 servlet 来执行。只不过,结合了Intercepting Filter提供了强大的功能而已。

  • IOC:究其本质实现,无非是反射+单例模式+Hash 算法+字节码增强+ThreadLocal。前 3 者用来实现对象生命周期的管理,后 2 者用来支持 AOP,声明式事务。

  • ORM:这个词实际上放在这里介绍不太合适,但是笔者目前没想把它单独拉出章节来讲。根据笔者的经验,ORM 主要完成了类和表的映射,对象和一条表数据记录的映射。其核心实现是通过 jdbc 获取数据库的 meta 信息,然后根据映射关系(这里可以通过 COC(Conversion Over Configuration,约定优于配置),注解等技术来简化配置)来动态生成 sql 和返回数据库的执行结果。

SOA

网站架构的演进之路,从单一应用架构到垂直应用架构,分布式服务架构以及流动计算架构,越来越体现 SOA 框架的重要性。用过 dubbo 来为 公司的 sass 系统做注册中心。

简而言之,就是使用了 spring 的 schema 的扩展机制,进而支持自定义 dubbo 标签;通过类似 serviceload 机制配置多个可选服务。通过 jdk 动态代理和 Javassist,使服务调用透明化。结合 ZooKeeper 实现高可用元数据管理。

MQ

MQ(Message Queue,消息队列)使服务调用异步化,可以削峰填谷,提升网站响应速度。 在 MQ 实现中,公司的多种计量及同步都用的 Kafka,有专门的文档,日后补充。

CACHE

Cache 就是将数据放到距离计算最近的地方,用来加快处理速度。通常对一定时间内的热点数据进行缓存。 

在使用缓存时,需要注意缓存预热和缓存穿透问题。

一般海量数据的缓存系统不会使用 Java 来实现,是因为 Java 有额外的对象大小开销以及 GC 压力。所以一般是用 ANSI C 来实现。目前用的比较火的是 Redis,公司多个产品线用的也是 Redis 作为缓存。

STORAGE

在出现 NOSQL 之前,一统天下的是 MySQL 分库分表技术。结合类似 TDDL 等 SQL agent 技术,也能够执行类似 join 的操作。后来,就像忽如一夜春风来,出现了很多 NOSQL/分布式存储系统产品,MongoDB,HBase。

分布式存储系统是分布式系统中最复杂的一部分,相比较 SOA,CACHE 等框架,它需要解决的问题更加复杂。常见的问题如下:

  • 数据分布 在多台服务器之间保证数据分布均匀,跨服务器如何读写

  • 一致性 异常情况下如何保证副本一致性

  • 容错 把发生故障当成常态来设计,做到检测是否发生故障并进行故障迁移

  • 负载均衡 新增、移除服务器时如何负载均衡 数据迁移如何不影响已有服务

  • 事务并发控制 如何实现分布式事务,如何实现多版本并发控制

  • 压缩、解压缩 根据数据特点选择恰当算法,如何平衡时间和空间的关系。


其他

还有其他方面的知识,等后面积累再多些,再重点写吧,这里仅仅是索引下。

  • 配置数据、元数据管理系统

  • 搜索系统:机器学习分析用户行为,结合搜索进行推荐排名。 各种大数据分析工具。

  • 云计算:硬件虚拟化。创业公司可以购买云服务,避免固定资产开销,可能闲置, 购买,管理,安装费用 ,无法迅速购买等问题,属于浮动消费,类似开车和租车的区别,仅是租用服务。 云厂商在能源,制冷,运维成本,量大硬件定制,充分利用闲置资源具有优势。

  • 鹰眼系统:日志规范化+打点+数据分析+树状展现

  • 系统运维: 目标是自动化运维。监控各种资源指标:OS:(cpu,memory,disk(空间,读写次数))网络流量中间件: tomcat, jvm,MQ:通过监控生产者,broker,消费者之间的队列情况,动态决定增加、减少消费者服务框架自省(运维监控) 依赖关系统计,前台系统访问路径,显示各种监控结果:Agent —》 Explorer ,Analyze,Visual,Dashboard,Share。预警,运维 自动、手工降级,系统问题自动排查甚至问题自动修复,

  • 能源节省:能源消耗(CPU,机柜,水冷)

  • 系统安全:涉及系统的方方面面,各种脚本,sql 注入,0day 等等。

  • 版本开发、版本发布:开发环境,测试环境,支持开速发布,不用大的 cycle,灰色发布,回滚降级流程,周边协调。。

  • 数据中心:阿里主要是为了解决机房网络瓶颈和超大规模系统的伸缩性问题,把完成某一特定业务需要的系统、核心服务、数据库组合成一个业务单元。

发布于: 2020 年 07 月 01 日阅读数: 111
用户头像

GunShotPanda

关注

JAVA开发 2019.09.03 加入

This is a letter for myself, for my future, for the past, for the better man of (health) Just got to do you and nobody else

评论

发布
暂无评论
架构师训练营 -week04 作业