Loading

复杂度来源:高性能

前言

本文介绍架构的复杂度来源之一,高性能。

高性能的复杂度主要体现在两面,一是单机实现高性能带来的复杂度,一是集群实现高性能带来的复杂度。

单机的复杂度

单机中最复杂的就是操作系统,操作系统中与性能有关的就是进程和线程。

在早期,计算机每执行一个操作前,都需要等待用户输入指令,这显然无比低效。于是,后面有了批处理操作系统,提前将需要执行的指令和数据录入,形成一个指令清单,这就是我们常说的“任务”,再让操作系统运行。

不过,CPU的执行速度是很快的,如果发生IO操作,那么CPU就会空闲。于是,为了提高CPU的利用率,出现了进程的概念,一个任务就是一个进程,进程间互不相关,不能相互访问。并且,操作系统不再将一个进程完全执行完毕,而是给每个进程分配一个执行时间,分时地调度进程来执行,当进程在IO的时候,CPU就可以执行其他进程,从而实现了一个并发的执行。

如果进程间不能通信,就只能等待前一个进程将数据写进存储,另一个进程再从存储中读取,这样无疑也是很低效的。于是,后面有了进程通信方式。

多进程让任务可以并发地处理,但还是存在缺陷。比如,如果想让一个进程可以执行多个子任务,那么当一个子任务执行时间较长,那么其他任务就会阻塞住,体现在用户上就是一部分用户执行其他子任务时卡住。于是,为了解决这个场景,进程下有了线程的概念,线程共享进程资源,线程成为CPU更小的调度单位,在进程中并发调度执行。

单处理机下,多进程只能并发运行,即在一个时间间隔运行。为了实现进程并行执行,后面操作系统有了像对称多处理器结构,实现了多进程真正并行运行。

集群的复杂度

当单台服务器扩展到多台服务器之后,解决复杂度的方式主要有两种,任务分配和任务拆分。

任务分配

通过任务分配器将用户的请求任务按指定的分配算法分配到相应的服务器,每台服务器有完整的请求处理逻辑。

随着用户量增加,首先需要增加服务器。假设原先一台服务器每秒可以处理5000个请求,增加到两台服务器后,理论上每秒可以处理10000个请求,但实际上效果打八折,只能处理8000个请求。

image

用户量继续增加,任务分配器的性能到达瓶颈,需要从单机变成集群方式。

image

当从单机变成集群后,复杂度就上来了,体现在:
1、不同用户的请求需要合理地分配到不同的任务分配器,任务分配器又要合理地将请求分配到业务服务器。
2、业务处理器状态管理和故障管理复杂度都增加。

缺点:
当业务逻辑越来越复杂,单纯的任务分配来扩展性能,得到的收益将越来越低。因为单台服务器的处理性能越来越低。

任务拆分

为了解决任务分配方式下,单台服务器到达性能瓶颈,可以采用任务拆分的方法。举例,将一个完整的业务流程拆分成多个处理逻辑,分到多个业务集群中。

image

优势在于:
1、单个系统功能简单越容易实现高性能
2、业务功能解耦,可以针对单个模块进行扩展,而不影响其他模块

注意,不是业务拆分的越细越好,业务拆分的太细,可能反而会降低性能,因为太多远程调用需要网络传输,将降低响应速率。并且,任务拆分提升的性能也是有限的,需要架构师把控拆分的粒度,让性能逼近这个极限。

参考

posted @ 2021-09-10 11:12  flowers-bloom  阅读(108)  评论(0编辑  收藏  举报