4.低成本;
5.安全;
6.规模;
一、高性能
对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次。但伴随着性能越来越高,相应的方法和系统复杂度也是越来越高。现代的计算机CPU集成了几亿颗晶体管,逻辑复杂度和制造复杂度相比最初的晶体管计算机,根本不可同日而语。
软件系统也存在同样的现象,比如以淘宝为例,最早期间可能最多支撑几千人的访问,但是,随着用户群体的增长和业务规模的扩大,已经远远不止几千人,这时对于性能方面就要求很高,总不可能,用户买个东西点击搜索或者查看商品详情出现卡顿现象吧。
软件系统中高性能带来的复杂度主要体现在两方面,一方面是单台计算机内部为了高性能带来的复杂度;另一方面是多台计算机集群为了高性能带来的复杂度。
(1)单机复杂度
以我公司最早项目来说,刚开始一个服务器对一个项目,那个时候还好,很少出现服务器宕机现象,但是当一台机器上运行好几个tomcat,而且好几个tomcat上都分别放置web项目,那个时候就是一台服务器,测试和线上都在一个服务器,最后总是频繁宕机,虽说,当时靠着shell脚本时刻监控着,发现宕机,就自动重启。但是那也无济于事,后来改变了下,将所有的项目集中在一个tomcat上,将这个tomcat的优化程度做到最高,关于tomcat优化,可以参考我的这篇博客:Jmeter之tomcat性能测试+性能改进措施
然后在这个基础上再做了nginx动静分离和负载均衡。也许有人问什么是动静分离?
简单的说,就是由Nginx处理静态资源(img,css,js等之类),Tomcat处理动态请求(比如接口或者jsp之类的),Nginx作为高性能Web服务器,自然对于静态资源的处理效率高的多。
这个负载均衡做的有点名不符实,仅仅只是在一个tomcat上。不过在做了将tomcat优化配置和Nginx相关优化配置和动静分离等后,发现网站的性能变的高了,关于网站性能测试可以参考这篇文章:网站在线性能测试分享
这个性能不仅仅指的是网页性能,同时还包含并发,目前并发仍然不是特别高。
上面我只是提提最初的到后来改变,但是一个服务器上随着后面我们慢慢有了私服和jenkins,还有装上了redis和phpmyadmin等,每个软件都会有对应的进程运行者,这也会占用很多内存。最后虽然勉强运行起来,但是时不时还是回到了卡顿,最后我只能将一些不必要的去掉(也许有人说,再买个服务器呗,反正现在的阿里服务器也很便宜,但是呢,经理说了,目前这个服务器只是测试服务器,以后正式上线再买一个好的)。
有点说偏了,最后提一下,单机复杂度的因素主要是进程和线程,,比如进程之间通信、多进程、多线程、多线程并发等。
(2)集群的复杂度
集群的复杂度主要体现在这么几个方面?
a.任务分配
比如当服务器由一台变成十台甚至上百台时,如何保障对应的请求分发获得对应的响应呢(web的本质基本上还是遵循HTTP协议,同学们,有时间还是得好好回顾回顾一下HTTP,关于HTTP相关的,我觉得朋友们可以参考我的这篇文章:谈谈HTTP)?
b.任务分解
通过任务分配的方式,我们能够突破单台机器处理性能的瓶颈,通过增加更多的机器来满足业务的性能需求,但如果业务本身也越来越复杂,单纯只通过任务分配的方式来扩展性能,收益会越来越低。为此,为了解决这个问题,于是就有了任务分解。
任务分解,在此你可以理解,如果一个项目有上百个子系统,可以将子系统分类并放在不同的服务器上,以此达到一个系统只办一件事(系统只办一件事总比系统办好几件事情效率要高的)。
考虑到依赖性,如果好几个系统杂糅一起,不做好合理的业务分离,最后可能演变成这样,修改了A系统,还得修改B系统,修改了B系统,还得修改C系统,这是一件非常麻烦的事情。相信,无论是项目经理还是开发的小伙伴们都不愿意看到这种现象的出现。另外还有一点需要强调的是,分解后,模块变小,有助于更好的发现问题。
针对高性能,摘抄李运华先生提出的一个问题,问题如下:
你所在的业务体系中,高性能的系统采用的是哪种方式?目前是否有改进和提升的空间?
我对此的回答如下:
我们目前开发出的三个系统,由于目前没有完全上线为客户服务,对于性能方面要求不是特别高。
不过要问,采取的是上面哪种方式,目前仅仅只是Nginx负载均衡+动静分离,还仅仅只停留在单体应用上面。也没有做一些主从复制、读写分离之类的。目前用不到。