系统的复杂程度是由很多原因引起的,高性能问题是其中之一,那高性能问题又是什么引起的呢?严格意义上说高性能不是问题,而是一个需求,随着互联网时代到来,特别是移动互联网,人们随时随地都在产生数据,对于单机服务来说已经无法承受大量的计算和网络请求了,所以提出了对于高性能服务的需求。在两种场景下,即单机和服务器集群,都有提高性能的解决方案,下面聊聊这两种方式对于我们软件而言带来的复杂性。

  • 单机服务

单机提供服务时,如果想提高性能,可以通过增加内存,增加核数,改用SSD,增加网卡吞吐量,这是通过改进硬件的形式提高性能,但是目前硬件发展是有瓶颈的,总会有个上限值,无法无限量的增加内存和硬盘容量。

再者通过操作系统来进行提升,比如通过使用多线程方式来提升并行速度,使用多进程来提高吞吐量。但是多进程本身也存在很多问题,因为进程数据是独立的,进程之间数据无法共享,只有通过存储机制来进行数据共享,或者引入管道,消息队列,信号量等新的机制,增加了编程的复杂度;而线程机制虽然是进程内部的,可以共享进程的数据,但是同样也引入了复杂度,如为了保证多个线程共享数据的一致性,需要考虑同步机制,互斥锁机制等,编程复杂度提高。

  • 集群方案

单机硬件性能是有上限的,所以引入了集群,即通过多台机器提供服务,但是任务的分配形式复杂性提高了。百度的春晚红包,后面由几十万台服务器提供服务,那么任务在这些机器之间如何分配,如何汇总,如何协调,这些是通过一系列的机制来保证的。没有这些保证,机器的数量增长和提供的服务性能提升之间并不是正向的。

我们举一个简单的场景,服务器由一台增加到2台,如何让这2台服务器均匀的提供服务,那么就需要增加负载均衡服务,负载均衡服务是通过硬件还是软件,都需要进行判断和选择,F5,LVS,Nginx,HAProxy,每一种机制都要判断是否适应当前你的业务环境和成本;如果你选择了Nginx来做负载均衡,那么分配算法是轮循还是负载权重?如何保证负载均衡服务器和业务服务器之间的连接,以及业务服务器的负载数据上报等,再者,如何保证负载均衡服务器本身不会出现问题?这些复杂度是集群带来的。

为了解决高性能的需求,我们引入进程线程,甚至协程,我们引入了集群方案,这种复杂性提升往往随着机器数量的增加,越发变得不能控制。所以在我们架构设计时需要通过各种手段,甚至妥协来解决遇到的所有问题。

results matching ""

    No results matching ""