架构师面试题(3)
一个典型的大型互联网应用系统使用了那些技术方案和手段, 主要解决什么问题? 请列举描述
1. CDN
CDN 全称 Content Delivery Network,即内容分发网络,它是指将源站内容分发至最接近用户的节点服务器,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、音乐、图片、文件、点播、直播、应用程序等内容的加速分发。
第一,降低服务器带宽压力
假如你的服务器同时支持 100 人同时访问,那么当有 300 人访问的时候,你的网站就会出现访问瓶颈,延时、卡顿甚至宕机问题接踵而至。在使用 CDN 后,CDN 可以将网站的静态内容缓存在边缘节点上,这样当用户访问静态资源时候就不用再请求回源服务器了,以此减少服务器的带宽峰值。
第二,保护源站服务器
CDN 的负载均衡和分布式存储技术,可以加强网站的可靠性,相当于无形中给你的源站添加了一把保护伞,将绝大部分的互联网攻击事件与源站隔离,避免源站遭到恶意攻击而带来的业务停摆或者资产损失。
2. 缓存
缓存主要用于解决互联网系统性能瓶颈; 性能瓶颈主要集中访问文件 和 数据库上。
当用户输入一个地址到页面的展示这其中通常包含了很多的缓存种类。有前端缓存本地缓存(协商缓存,强缓存等)到我们的网关缓存(CDN 缓存),最后到我们服务端缓存。服务端缓存又区分为进程缓存(本地缓存),还有比较火的分布式缓存,最后到了数据库层面的缓存。80%以上的请求都被各种缓存处理,只有不到 20%的请求落在文件系统,数据库上,这样就大大降低了文件系统,数据库访问压力。
3. 数据库读写分离
数据库读写分离,是了提高数据库访问性能; 在互联网系统场景下,一般情况, 读操作大大多于写操作;这个时候可以让写数据库作为主库,多个从数据库专门用于读操作。
4. 数据库分库,分表
关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到 1000W 或 100G 以后,由于查询维 度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
(1)水平分库
概念:以 字段为依据 ,按照一定策略(hash、range 等),将一个 库中的数据拆分到多个 库中。
结果:每个 库的 结构都一样;每个 库的 数据都不一样,没有交集;所有 库的 并集是全量数据;
场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。
分析:库多了,io 和 cpu 的压力自然可以成倍缓解。
(2)水平分表
概念:以 字段为依据 ,按照一定策略(hash、range 等),将一个 表中的数据拆分到多个 表中。
结果:每个 表的 结构都一样;每个 表的 数据都不一样,没有交集;所有 表的 并集是全量数据;
场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了 SQL 效率,加重了 CPU 负担,以至于成为瓶颈。
分析:表的数据量少了,单次 SQL 执行效率高,自然减轻了 CPU 的负担。
(3)垂直分库
概念:以 表为依据,按照业务归属不同,将不同的 表拆分到不同的 库中 。
结果:每个 库的 结构都不一样;每个 库的 数据也不一样,没有交集;所有 库的 并集是全量数据;
场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。
分析:到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。
(4)垂直分表
概念:以 字段为依据,按照字段的活跃性,将 表中字段拆到不同的 表(主表和扩展表)中。
结果:每个 表的 结构都不一样;每个 表的 数据也不一样,一般来说,每个表的 字段至少有一列交集,一般是主键,用于关联数据;所有 表的 并集是全量数据;
场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读 IO,产生 IO 瓶颈。
分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读 IO。拆了之后,要想获得全部数据就需要关联两个表来取数据。但记住,千万别用 join,因为 join 不仅会增加 CPU 负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务 Service 层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。
5. 反向代理
反向代理(reverse proxy):是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
(1)隐藏服务器真实 IP
使用反向代理,可以对客户端隐藏服务器的 IP 地址。
(2)负载均衡
反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。
(3)提高访问速度
反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
(4)提供安全保障
反向代理服务器可以作为应用层防火墙,为网站提供对基于 Web 的攻击行为(例如 DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和 SSL 加速(如 SSL 终端代理),提供 HTTP 访问认证等。
6. 微服务
“微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通(通常是基于 HTTP 的 Restful API).每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构"---- Martin Fowle
优点
提升开发交流,每个服务足够内聚,足够小,代码容易理解;
服务独立测试、部署、升级、发布;
按需定制的 DFX(Design for X(面向产品生命周期各/某环节的设计)),资源利用率,每个服务可以各自进行 x 扩展和 z 扩展,而且,每个服务可以根据自己的需要部署到合适的硬件服务器上;每个服务按需要选择 HA(高可用集群)的模式,选择接受服务的实例个数;
容易扩大开发团队,可以针对每个服务(service)组件开发团队;
提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪;
新技术的应用,系统不会被长期限制在某个技术栈上;
缺点
没有银弹,微服务提高了系统的复杂度;
开发人员要处理分布式系统的复杂性;
服务之间的分布式通信问题;
服务的注册与发现问题;
服务之间的分布式事务问题;
数据隔离再来的报表处理问题;
服务之间的分布式一致性问题;
服务管理的复杂性,服务的编排;
不同服务实例的管理
7. 分层
分层是企业应用系统中最常见的一种架构模式, 将系统在横向维度上切分成几个部分, 每一个部分负责一部分响度比较单一的职责, 然后通过上层对下层依赖 和 调用组成一个完整的系统
8. 分割
如果说分层是将软件在横向方面进行切分, 那么分割就是在纵向方面对软件进行切分
系统越大, 功能越复杂, 服务和数据处理的种类也越多, 将这些不同的功能和服务分割开来, 包装成高内聚低耦合的模块单元, 一方面有助于软件的开发和维护; 另一方面, 便于不同模块的分布式部署, 提高网站的并发处理能力和功能扩展能力
9. 分布式
对于大型网站, 分层和分割的一个主要目的是为了切分后的模块便于分布式部署, 即将不同模块部署在不同服务器上, 通过远程调用协同工作。分布式意味着解决同样的问题可以使用更多的计算机, 计算机越多,CPU, 内存, 存储资源也就越多, 能够处理并发访问和数据量就越大。
分布式应用和服务
分布式静态资源
分布式数据和存储
分布式计
评论