一、使用缓存
缓存指将数据存储在相对较高访问速度的存储介质中,以供系统处理。一方面缓存访问速度快,可以减少数据访问的时间,另一方面如果缓存的数据是经过计算处理得到的,那么被缓存的数据无需重复计算即可直接使用,因此缓存还起到减少计算时间的作用。
缓存有很多种方式,有代码级的,如Mybatis,Hibernate都有自己的缓存机制。还有基于组件的,如ehcache。还有独立于应用包之外的缓存,如redis,ehcache等。当然使用缓存也有很多的注意点,我们后面再聊。
二、异步操作
在高并发的情况下,可将同步的操作异步化,降低系统压力。比如使用消息队列。在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力,同时也使得响应延迟加剧。在使用消息队列后,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程(通常情况下,该进程通常独立部署在专门的服务器集群上)从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度远快于数据库(消息队列服务器也比数据库具有更好的伸缩性),因此用户的响应延迟可得到有效改善。目前消息中间件有很多,如Kafaka,ActiveMQ,RabbitMQ等
当然,使用异步操作是需要在业务进行配合的,需要在业务流程上进行优化。对于一些实时的操作,并不能使用异步,比如支付,用户支付后马上就要看到结果。
三、使用集群
在网站高并发访问的场景下,使用负载均衡技术为一个应用构建一一个由多 台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓慢,使用户请求具有更好的响应延迟特性。
说白了,就和我们上厕所一样的,一个坑的时候,大家都要排队上,多修几个坑大家都通畅了。目前通过负载均衡集群的方式也有多种,有基于硬件的,如F5;有基于软件的,如HAproxy,Nginx等。不过硬件的成本比较高,但性能好,一般金融行业用的比较多,毕竟有钱嘛。
四、优化代码
网站的业务逻辑实现代码主要部署在应用服务器上,需要处理复杂的并发事务。合理优化业务代码,可以很好地改善网站性能。不同编程语言的代码优化手段有很多,这里我们概要地关注比较重要的几个方面。
1、多线程
多用户并发访问是网站的基本需求,大型网站的并发用户数会达到数万,单台服务器的并发用户也会达到数百。CGI编程时代,每个用户请求都会创建- -一个独立的系统进程去处理。由于线程比进程更轻量,更少占有系统资源,切换代价更小,所以目前主要的Web应用服务器都采用多线程的方式响应并发用户请求,因此网站开发天然就是多线程编程。
2、资源复用
系统运行时,要尽量减少那些开销很大的系统资源的创建和销毁,比如数据库连接、网络通信连接、线程、复杂对象等。从编程角度,资源复用主要有两种模式:单例( Singleton )和对象池( Object Pool )。
3、合理使用数据结构
早期关于程序的一个定义是,程序就是数据结构+算法,数据结构对于编程的重要性不言而喻。在不同场景中合理使用恰当的数据结构,灵活组合各种数据结构改善数据读写和计算特性可极大优化程序的性能。
4、合理进行垃圾回收
如果Web应用运行在JVM等具有垃圾回收功能的环境中,那么垃圾回收可能会对系统的性能特性产生巨大影响。理解垃圾回收机制有助于程序优化和参数调优,以及编写内存安全的代码。