我们知道高并发意味着大流量。高并发系统设计的魅力在于我们能够凭借自己的聪明才智设计出巧妙的解决方案,从而抵御巨大流量的冲击,为用户带来更好的体验。这些解决方案似乎能够操纵流量,让系统中的服务和组件更顺畅地处理流量。让我们举一个简单的例子。从古至今,长江、黄河水患不断。古时大禹拓宽河道,疏通淤泥,使水流更加顺畅。作为历史上最成功的治水案例之一,都江堰将岷江的水分流至多条支流,分担水流压力;三门峡、葛洲坝修建水库,先将水抽入水库蓄水,再想办法将水库中的水慢慢排放,以提高下游的防洪能力。根据上面的例子,我们可以分析:(1)“去淤泥”可以看作是提高了单个界面代码的质量,降低了时间复杂度或空间复杂度。提高单个接口的并发性能,也就是QPS。(2)“分裂”可以类比我们项目中的集群。单机能承受的并发数是有限的,可以增加多台机器来分担并发。(3)“水库”有多种理解。你可以理解为一个限流器,比如我们项目中使用的令牌桶或者漏斗限流器。也可以理解为使用消息队列的形式异步发送给消费者,让消费者慢慢处理任务。当然,在高并发的系统设计过程中,经常会用到缓存,也是解决高并发的重要手段之一。在后续的文章中,我会对上面提到的缓存进行详细的介绍。除了上面提到的几种高并发方案,我们还要从架构层面去考虑。传统的单体应用会将功能模块耦合在一起,放在一个应用服务器上。一个应用服务器的并发量是非常有限的,无法承受高并发带来的流量,而如果单机宕机就意味着所有的功能模块都无法访问。有的同学可能会说,那就加个机器吧!加机器确实可以在原来的基础上增加可以容忍的并发数,但这不是治本之策。单体应用不仅存在单点故障问题,还存在扩展难、可用性低的问题,因为每个功能模块都耦合到一个应用服务器上。当需要扩展时,需要重写原有代码,重新上线整个服务。什么是分布式微服务?简而言之,分布式微服务将原来单体应用的功能模块拆分开来,作为一个独立的服务部署在应用服务器上。成为分布式微服务架构后,我们会发现每个功能模块都是一个独立的应用。每个功能模块的并发数不同,有的高并发有的低并发。对于高并发的,我们可以在那个微服务里面加机器来增加服务的并发。而如果我们要扩展某个功能模块的功能,只需要修改相应微服务的代码,而不影响整体功能,实现了系统的轻松扩展。加机器不仅可以提高并发性,还可以避免单点故障导致整个系统不可用,可用性也大大提高。这就是我们经常听到的“三高”,高并发、高可用和可扩展。说到三高,就不得不提CPA理论。CPA理论是什么?C:Consistency,一致性:当一个进程修改数据时,要求其他进程读取的数据也要更新。A:Availability,易用性:用户发出请求需要实时响应,不能等其他事情完成才响应。P:Partitiontolerance,分区容错:一个系统由多个节点组成,部分节点坏了,整个系统还能保证正常通信。CPA理论表明,在一个系统中,CAP不能同时满足,最多只能同时满足两个。基本上,容错是必须的。如果需要保证一致性,只能牺牲可用性。一般情况下,系统会选择可用性而不是强一致性。数据一致性:强一致性:更新操作后,任何进程返回最新值。弱一致性:系统无法保证返回最新值,也不知道多久更新一次最新值。最终一致性:在系统保证没有后续更新的前提下,系统最终会返回上次更新操作的值。数据一致性问题是分布式系统中普遍存在的问题,也就是我们所说的分布式事务。在后续的这篇文章中,我将详细讲解目前主流的分布式事务解决方案。综上所述,应对高并发,首先要根据系统的并发量选择系统架构。如果并发不是很高,比如crm系统,可以考虑做成单应用。如果并发度高,比如商场项目,需要优先考虑分布式架构,提高系统的三高。选择架构后,我们会考虑使用缓存、消息队列、限流等方式来提高系统整体的可用性和稳定性。在后续的文章中,我们会继续按照这三个方向进行拓展,带大家设计一个完整的亿级高并发系统解决方案。后续文章目录大纲:
