互联网系统高并发设计目标

随着互联网、移动互联网、物联网的普及,对于有一定规模的系统来说高并发设计是势在必行的,本文来总结一下高并发设计的目标,首先看一下高并发的定义。

高并发定义

高并发是指系统在单位时间内处理更多的用户并发请求,也就是承担更大的流量,它是一切系统架构设计的背景和前提。每秒一次请求和每秒一万次请求,两种场景下分别做到毫秒级响应和五个九(99.999%)的可用性,设计难度和复杂度都不是一个量级的。

高并发设计的目标

  1. 高性能
  2. 高可用
  3. 可扩展

一、如何提升性能

性能优化原则
  1. 性能问题不能盲从,一定是问题导向
  2. 遵循二八原则,用20%的精力解决80%的性能问题,抓住主要矛盾,优化主要瓶颈点
  3. 要有数据支撑,缩短了多少响应时间,提高了多少吞吐量
  4. 优化过程是持续的,明确目标,制定优化方案,持续不断地找到性能瓶颈,直到达到目标为止
性能度量指标
  • 一般来说,度量性能的指标是指系统接口的响应时间,单次的响应时间是没有意义的,需要有一段时间内的特征值
  1. 平均值:敏感度比较差
  2. 最大值:过于敏感
  3. 分位值:把一段时间内响应时间从小到大排序,假如有100个请求,排在第90位的就是90分位值,排除偶发情况外,能很好地反映这段时间的性能情况,分位值越大对慢请求的影响越敏感
  • 响应时间控制在多少比较合适
  1. 200ms是第一个分界点,200ms之内用户是感觉不到延迟的
  2. 1s是第二个分界点,1s之内用户能感受到一些延迟,还是接受的,超过1s之后用户有明显的等待,等待时间越长用户体验越差,所以健康系统响应时间的99分位值应该控制在200ms以内,不超过1s的请求占比要达到99.99%以上
性能优化思路
  1. 提高系统的处理核心数
    多线程,增加系统的并行处理能力
  2. 缩短单次请求的响应时间
    CPU密集型:选用更高效的算法或减少运算次数
    IO密集型:大部分业务系统都属于IO密集型,比如数据库系统、缓存系统、Web系统,这些系统的瓶颈可能在内部也可能在依赖的其它系统,需要具体问题具体分析

二、怎样做到高可用

  • 成熟系统的可用性需要从系统设计和系统运维两方面做保障,缺一不可
系统设计
  • 无损方案
  1. 故障转移Faliover
  • 有损方案
  1. 超时控制
    不让请求一直保持,而是在经过一段时间后让请求失败,释放资源给接下的请求
  2. 降级
    保证核心服务的稳定而牺牲非核心服务的做法
  3. 限流
    对并发请求进行限速来保护系统
系统运维
  1. 灰度发布
    按照一定比例逐步推到线上
  2. 故障演练
    对系统进行一些破坏性的手段,观察出现故障时系统的表现,从而发现潜在的可用性问题。故障演练是以系统可以抵御一些异常为前提的,如果系统还没有做到这一点,需要另外搭建一套和线上一模一样的测试环境来演练,避免对生产系统造成影响。
  3. 混沌工程
    在线上系统随机关闭节点来模拟故障,让工程师了解在出现此类问题时会有什么样的影响
DevOps
  • Dev:冗余和取舍,冗余指的是有备用节点,集群来顶替出故障的服务,取舍指的是丢卒保车,保障主题服务安全
  • Ops:注重如何避免故障的发生,关注变更管理以及如何做故障演练

三、如何让系统易于扩展

  • 数据库、缓存、依赖的第三方、负载均衡、交换机带宽都是系统扩展时需要考虑的因素
高可扩展性的设计思路
  • 拆分是提升系统扩展性最重要的一个思路
  1. 存储层的扩展性
  • 存储拆分首先考虑业务维度
  • 长时间运行后,单一业务数据库在容量和并发请求上会超过单机限制,此时可以对数据库做水平拆分(分库分表),不能随意增加节点,一旦增加节点需要手动迁移数据,成本很高,基于长远考虑需要一次性增加足够多的节点以避免频繁扩容
  • 拆分后尽量不要用事物,分布式事物两阶段提交的协调成本会随着资源的扩展不断提高,最终达到无法承受的程度
  1. 业务层的扩展性
    可以从三个维度考虑业务层的拆分方案:业务维度、重要性维度、请求来源维度
  • 把相同业务的服务拆分成单独集群
  • 根据业务接口的重要程度,把业务分为核心集群和非核心集群
  • 根据接口调用方做不同业务集群的拆分

总结

高并发设计是为了使系统能应对大流量请求,设计方案需要考虑高性能、高可用、可扩展三个方面,优化之前需要有指标数据支撑,确立目标后,循序渐进,以解决系统中存在的问题为目标,持续优化系统实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章