架构师训练营第四周作业
大型互联网应用的架构和其它类型应用的架构类似,也是由应用的功能需求和质量属性确定的。
对于互联网应用,需要重点考虑的质量属性一般包括:性能、可伸缩性、可用性和弹性、可扩展性、安全。下面,我们分别从这几个属性出发,说明为了实现这些属性,互联网应用可能采用的主要方法和手段(注有些技术手段可以同时满足多个质量属性)。
性能
缓存
通过缓存,我们可以减少不必要的服务调用和数据库访问,降低系统负荷,提高响应速度。
前端采用的缓存技术包括:客户端本地缓存、CDN 等。
后端采用的缓存技术主要是 Redis 等分布式缓存技术。
异步
在互联网应用中,大部分操作都是 I/O,所以使用异步/非阻塞 IO 可以充分利用 CPU,在相同资源情况下提供更高的吞吐率。
实际中,我们可以利用 Akka actor、Reactor 等异步或者流式编程框架来实现异步编程,将来,我们还可以通过协程等技术来降低异步编程的难度。
并发
并发可以让我们充分利用 cpu 的多核特性,在面对计算密集型任务时,我们通过设计并发模型,使得系统可以同时处理多个任务,提高吞吐,降低延迟。
集群
从提高性能的角度看,集群可看作是并发的延伸,从单个节点上的多任务并发,到多个节点上的任务并发。
为了高效建立和有效管理集群,我们往往还需要依赖其它的基础设施,包括:zookeeper 分布式事务协调器、k8s 编排器等。
CQRS
互联网应用有个特点就是查询需求在大部分时候高于命令需求(即改变状态的需求),所以我们可以把这两个需求分开,分别实现:为它们建立独立的服务和基础设施。
在查询部分,通过缓存、NOSQL 提高查询性能,减少或者消除对命令部分的影响;
在命令部分,由于不用支持查询请求,所有处理能力都用于执行命令。
可伸缩性
可伸缩性是指系统可以通过增加资源的方式应对未来工作负荷的增长。
分布式
引入分布式基础设施,包括但不限于:分布式数据库、NOSQL、分布式缓存、分布式消息队列,系统可以在不改变架构的情况下,通过增加节点增强分布式基础设施的处理能力,承担更大负载。
微服务
对于系统自身实现的逻辑,为了能够适应负荷的增长,将这部分逻辑独立出来,成为一个独立部署的服务。
微服务需要很多配套的流程和技术,包括:CI/CD、状态/性能监控、服务发现、服务网关等。
可用性/弹性
冗余
在系统中引入冗余的备用组件,在主组件故障时,可以切换到备用组件,减少系统的不可用时间。
有些基础设施支持自动备份和切换,比如:hdfs/hbase,在工作时异步备份数据到从节点,当主节点故障时,自动切换。
限流/背压
在系统负荷高于服务的承受能力时,如果接受所有请求并正常处理,会导致服务质量下降,并最终导致服务不可用,为了避免这种情况,我们通过主动限流,拒绝部分请求的方法,保证服务稳定运行。
背压的性质和限流类似,它除了拒绝请求外,还意味着位于上流的应用应当根据下游应用的回应,主动降低请求频率。
消息中间件
消息中间件可以实现服务请求的削峰和请求的负载平衡,避免上游请求对下游服务的冲击。
可维护
监控
通过引入开源监控平台:Prometheus, TSDB, ZipKin 等,我们可以实现性能指标的收集、统一存储、呈现和分析。
自动化
基于监测,我们可以在这个基础上定义运维规则,在性能裂化、服务不可用等异常情况下,实现服务的自动启动、扩容。
适应不同环境
通过将配置外部化,集中化管理配置,使得服务可以部署到不同环境中。
目前配置管理的主流包括:Apollo、Spring cloud config 等。
评论