美文网首页
01 高并发通用设计方法

01 高并发通用设计方法

作者: 浥羽醉悠扬 | 来源:发表于2020-02-06 16:48 被阅读0次

    免责声明:本内容非原创并且已付款,仅作为笔记使用,如有侵权行为,请联系本人删除。本声明对于后续的内容同样适用。

    在应对高并发场景时,一般来说,会采用以下三种方法:

    1.Scale-out:横向扩展。采用分布式部署的方式吧流量分流开,让每个服务器都承担一部分并发和流量。
    2.缓存:使用缓存来提高系统的性能。
    3.异步。在某些场景下,未处理完成之前我们可以让请求先返回,在数据准备好后再通知请求方,这样可以在单位时间内处理更多的请求。

    首先,先来了解第一种方法,先对比一下scale-up和scale-out。我们将不断提升CPU性能的方案叫做scale-up(纵向扩展),把通过购买性能更好的硬件来提升系统的并发处理能力。scale-out则是另外一个思路,它通过将多个低性能的机器组成一个分布式集群来共同抵御高并发容量的冲击。那么两种方式该如何选择呢?一般来讲,在系统设计初期会考虑使用scale-up的方式,因为这种方式足够简单。所谓能用堆砌硬件解决的问题就用硬件来解决。但是当系统并发超过了单机的极限时,就要使用scale-out的方式。scale-out虽然能够突破单机的限制,但也会引入一些复杂问题。比如如果某个节点出现故障如何保证整体可用性?当多个节点有状态需要同步时如何保证状态信息爱不同节点的一致性?如何做到使用方无感知的增加和删除节点?

    第二种方法:缓存。
    缓存遍布在系统设计的每个角落。从操作系统到浏览器,从数据库到消息队列。任何略微复杂的服务和组件中你都可以看到缓存的影子,使用缓存的主要作用时提升系统的访问性能。在高并发的场景下就可以支撑更多的用户同时访问。

    为什么缓存可以大幅度提升系统的性能?我们知道数据是放在持久化存储中的,以机械硬盘为例,它主要由机械手臂、磁头、转轴、盘片组成,盘片又分为磁道、柱面和扇区。


    p

    盘片是存储介质,每个盘片被划分为多个同心圆,信息被存储在同心圆之中,这些同心圆就是磁道,机械手臂驱动磁头沿着径向移动,在磁道上读取所需要的的数据,磁头寻找信息话费的时间叫做寻道时间。
    扑通磁盘的寻道时间是10ms左右,在整个计算机体系中,磁盘是最慢的一环,甚至比其他组件要慢几个数量级。因此我们用以内存作为存储介质的缓存,以此提升性能。当然,我们可以将任何降低相应时间的中间存储都成为缓存。

    第三种方法:异步处理
    以方法调用为例,同步调用代表调用方要阻塞等待被被调用方法中的逻辑执行完成,这种方式下当调用方法响应时间较长时,会造成调用方长久的阻塞,在高并发下会造成整体系统性能下降甚至崩溃。
    异步调用恰恰相反,调用方法不需要等待方法逻辑执行完成就可以返回执行其他的逻辑,在被调用方法执行完毕后再通过回调、事件通知等方式将结果反馈给调用方。
    异步调用在大规模高并发系统中被大量使用,比如12306,当我们订票时,页面会显示系统正在排队,这个提示就代表着系统在异步处理我们的订票请求。采用异步的方式,后端处理时会把请求丢到消息队列中,同时快速响应用户,告诉用户正在排队处理,然后释放出更多的资源来处理更多的请求。订票请求完成后,再通知用户订票成功或者失败。
    处理逻辑后移动异步处理程序中,web服务压力小了,资源占用少了,自然就能接受更多的订票请求。系统承受高并发的能力就提升了。


    image.png

    那么是不是意味着在高并发系统设计中,开发一个系统时就要把这些方法都用上呢?当然不是,系统的设计是不断演进的。。
    不同量级的系统有不同的痛点,也就有不同的架构设计和侧重点,盲目追求只能让我们的架构复杂不堪,最终难以维护。

    建议一般系统的演进过程应该遵循下面的思路:
    1.最简单的系统设计满足业务和流量现状,选择最熟悉的技术体系。
    2.随着流量的增加和业务的变化修正架构中存在问题的点,如单点问题,横向扩展问题,性能无法满足需求的组件。在这个过程中,选择社区比较成熟的、团队熟悉的组件帮助我们解决问题,在社区没有合适解决方案的情况下才会自己造轮子。
    3.当对架构的小修补无法满足需求时,考虑重构、重写等大的调整方式来解决现有的问题。

    归根结底一句话:高并发系统的推荐应该是循序渐进,已解决系统中存在的问题为目的和驱动力的

    Martin Fowler:能使用单体解决掉 问题,就不要采用分布式,不能为了技术而技术,采用分布式固然可以分流用户请求,提高系统的响应能力,但同样也带了复杂性。

    相关文章

      网友评论

          本文标题:01 高并发通用设计方法

          本文链接:https://www.haomeiwen.com/subject/awhuxhtx.html