三高综述
1 高并发简述
高并发是互联网分布式系统架构设计中必须考虑的因素之一,当多个进程或线程在同一段时间内访问同一资源时会产生并发问题,因此需要通过专门的设计来保证系统能够同时正确处理多个请求。
高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。高并发绝不意味着只追求高性能,这是片面的理解。从宏观角度看,高并发系统设计的目标有高性能和高可用。
2 高性能与性能指标
高性能是就是指程序处理速度快、耗能少。高性能的指标经常和高并发的指标紧密相关,想要提高性能,那么就要提高系统高并发能力,两者互相捆绑在一起。性能是客观的指标,可以具体体现到响应时间、吞吐量等技术指标,同时也是主观的感受,而感受则是一种与具体参与者相关的微妙的东西,用户的感受和工程师的感受不同,不同的用户感受也不同。从技术角度上,衡量一个系统的性能可以从响应时间、并发数、吞吐量、性能计数器等这几个主要指标入手。系统的性能问题很多是在用户高并发访问时产生的,所以系统性能优化的主要工作是改善高并发用户访问情况下的响应速度。
3 高可用与可用性度量
高可用性通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。实现一个高可用的互联网应用和服务是个非常具有挑战的任务。每个架构师对高可用或许都有不同理解。对很多架构师而言,高可用意味着服务不存在单点故障、数据有冗余备份、架构设计上避免使用单点。
系统可用性度量,系统不可用时间(故障时间)=故障修复时间点-故障发现(报告)时间点,系统年度可用性指标=(1-系统不可用时间/年度总时间)。对于大多数系统而言,2个9是基本可用,不可用时间小于88小时;3个9是较高可用,不可用时间小于9小时;4个9是具有自动恢复能力的高可用,不可用时间小于53分钟。
4 高性能设计方案
高性能的最终目的就是提升用户的体验,使他们感觉系统很快。离开这个目的,追求技术上的所谓高性能,失去意义。而用户体验的快或是慢,可以通过技术手段改善,也可以通过优化交互体验改善。
从前端角度进行性能优化包括访问优化,CDN加速策略。访问优化通过减少http请求、使用浏览器缓存、减少cookie传输等方法进行实现。
从服务器角度优化性能,第一个想到的解决方案就是使用缓存。系统中80%的访问落在20%的数据上,因此利用内存的高速访问特性,将这20%的数据缓存起来,可很好地改善系统性能,提高数据读取速度,降低存储访问压力,系统往往采用分布式缓存架构来实现高性能目标。另外一种策略是使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓慢,使用户请求具有更好的响应延迟体验。
值得一提的时,在技术层面,性能优化也需要全面考虑,综合权衡:性能提升一倍,但服务器数量也需要增加一倍;或者响应时间缩短,同时数据一致性也下降,这些在设计高性能系统时都需要考量取舍。
5 高并发设计方案
实现高并发的一种纵向设计方案是提升单机能力,包括提升单机的硬件性能,通过增加内存、CPU核数、存储容量等堆硬件的方式来提升;提升单机的软件性能,使用缓存减少IO次数,使用并发或者异步的方式增加吞吐量。
另一种横向角度是采用负载均衡。高并发的首选方案就是集群化部署,一台服务器承载的QPS有限,多台服务器叠加效果就不可同日而语。将流量转发到服务器集群,这就要用到负载均衡。
还有一类方法是采用池化技术。复用单个连接无法承载高并发,如果每次请求都新建连接、关闭连接,考虑到TCP的三次握手、四次挥手,时间开销浪费。池化技术的核心是资源的“预分配”和“循环使用”,常用的池化技术有线程池、进程池、对象池、内存池、连接池、协程池。
上述是正向方式提升系统QPS,在设计时也可以选择逆向思维,做减法,拦截非法请求,将核心能力留给正常业务。互联网高并发流量并不都是纯净的,也有很多恶意流量(比如黑客攻击、恶意爬虫、黄牛、秒杀器等),我们需要设计流量拦截器,将那些非法的、无资格的、优先级低的流量过滤掉,减轻系统的并发压力。
6 高可用设计方案
硬件故障是常态,系统的高可用架构设计的主要目的就是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。实现上述高可用架构的主要手段是数据和服务的冗余备份及失效转移,一旦某些服务器宕机,就将服务切换到其他可用的服务器上,如果磁盘损坏,则从备份的磁盘读取数据。
常见的高可用服务策略有超时设置,异步调用,服务降级等。其中超时设置指的在应用程序中设置服务调用的超时时间,一旦请求超时,通信框架就抛出异常,应用程序根据服务调度策略,可选择继续重试或将请求转移到提供相同服务的其他服务器上;异步调用策略意为着应用对服务的调用通过消息队列等异步方式完成,避免一个服务失败导致整个应用请求失败的情况;服务降级策略指的是通过暂时关闭某些非核心服务或者组件从而保护核心系统的可用性。
保证数据存储高可用的手段主要是数据备份和失效转移机制。数据备份是保证数据有多个副本,任意副本的失效都不会导致数据的永久丢失从而实现数据完全的持久化。而失效转移机制则保证当一个数据副本不可访问时,可以快速切换访问数据的其他副本,保证系统可用。
7 结语
高可用,高性能,高可用是我们在设计开发系统时追求的目标和努力的方向,随着科技的发展人们对系统的要求越来越高,用户会想要更快的响应速度,系统要少出故障,要同时容纳大量的用户。这些要求和目标越发考验设计师和程序员。作为业内人员,我们需要考虑如上述提到的设计方案策略来实现高要求的系统。