架构师训练营第四周课后作业

用户头像
Cloud.
关注
发布于: 2020 年 07 月 01 日

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



存储

首先从数据存储上开始讲起:

  • 主从同步

大型互联网系统为了保证存储系统的高可用,都会用到主从同步的技术,主节点负责提供服务,从节点提供备份,并且主节点持续将数据同步到从节点。一旦主节点宕机,从节点可以立刻充当主节点来提供服务。比较常见的像redis的主从同步、es的副本机制,kafka的分区备份机制,kafka的主从节点机制等等。

  • 读写分离

大型互联网系统在性能层面最大的瓶颈主要是数据库的瓶颈,数据库的连接往往都是有限的,无法支撑大型互联网系统的请求,所以为了分流请求就会将数据库的读写进行分离,将数据库分为读库和写库,所有写请求都访问写库,读请求访问读库,通常写库是1,读库是n,这样请求被分流后就降低了数据库的压力。

  • 分库分表

虽然读写分离能降低一部分数据库的压力,但是读库只有一个,请求可能还是无法支撑,那么就要想办法把读库拆分为多个,这就是分库,不同的业务使用不同的数据库,这样从业务层面又进行了一次隔离。

但是这样分了以后部分业务请求还是很大,还是无法支撑呢,这时候就需要进行分表,分表就是指一张数据库表拆分多个数据库表,这个拆分有两种方式:垂直拆分和水平拆分。

  • 垂直拆分

垂直拆分是指在一张表上,有些字段的更新频率是不同的,比如有一些字段经常更新,有些字断基本不更新,那么可以把这两部分字断拆分成两个表,分开管理,这样就可以将请求又进行一次分流。

  • 水平拆分

水平拆分是指一张表数据很大,那么我们通过利用某个字段来将这一大批数据拆分到不同的表里面。

比如某个大集团,管理着旗下很多子品牌,那么他们的用户是不是可以根据品牌来拆分,这样每个品牌的表的数据都变少了,而且请求也分流了。

再比如根据用户的地理分区拆分,或者根据用户id进行hash分表等等都是拆分方式。目的一方面减小表数据,降低存储压力,另一方面,将请求分流也可以降低请求压力。

这种分库分表中间件比较常用的mycat

  • 动静分离搜索

数据还区分会动态和静态,动态数据指那些经常需要访问的数据,比如用户基本信息,用户地址信息,淘宝里的商品等,这些信息经常查询,为了保证性能都要提供各种方式来提高查询性能,这时候就会用到搜索系统,将这些数据同步到一个搜索系统中,利用搜索的到排索引机制提升查询性能。

静态数据指那些基本不会去访问,或者说很少访问的数据,比如用户已经完成的订单信息,很少有用户会去查询这些订单信息,那么这些数据就可以进行定期归档,或者存入其他nosql数据库中,用户需要查询的时候根据条件动态的切换不同的数据库去查询。



  • 缓存

光是分库分表、读写分离、动静分离搜索等依然应对不利大型互联网系统的超高请求,这时候就要应用缓存,因为缓存访问的速度是极快的。我们的系统是否能够提供高并发访问实际上就取决于单个请求的耗时能否降到最低。而利用缓存就可以达到这种目的。

将那些经常访问的热点数据并且不易改变的数据缓存起来,用户访问时优先访问缓存,提升查询性能。

甚至在进入我们的微服务之前利用其他内容缓存技术直接返回请求。

常用的缓存技术有redis、cdn、反向代理缓存等

分布式微服务

  • 微服务框架

大型互联网绝少不了分布式的微服务系统体系,而桥接这些微服务的方式就是分布式的微服务的框架,这些框架为我们建立起微服务之间的通信机制、负载均衡机制、服务注册发现机制,服务熔断、降级机制等等,常见的框架有dubbo、spring cloud。

  • 分布式事务

使用了分布式的系统就必定要面对分布式的事物问题,毕竟单一的服务只要使用数据库提供的事物管理就可以满足要求,但是分布式的系统是不可以的,在不同的服务中无法使用同一个事物,甚至不同的服务之间访问的也不是同一个数据库。

所以为了应对这种事物问题,解决手段常用的有最终一致性、以及一些分布式事务的框架,如seata、lcn等

  • 消息中间件

要使用最终一致性,常见的方式有利用消息系统来实现消息的最终一致性,只要利用消息系统提供的消息不丢失机制,就能保证消息一定能被消费,而消费者端需要做的是保证执行的幂等性。

同时请求一般有时候是集中在某一个时刻,而其他时刻请求又很少,资源又浪费,而利用消息可以进行一个消峰填谷的作用

  • 网关路由

在微服务的体系中,每个应用都可以提供自己的业务,但如何为用户提供一个单一的入口就是一个问题,这时候可以利用网关的机制,为我们进行微服务动态路由。常见的网关有zuul和gateway。



设计思想

  • 设计思想

在大型互联网系统中,业务往往是庞大和复杂的,那么为了更高效的维护和扩展这些业务,往往都需要将系统进行合理的划分,但如何划分以及如何界定往往都是一个难题,而领域驱动设计就是为了应对这个问题。



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

Cloud.

关注

还未添加个人签名 2020.05.14 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第四周课后作业