
# PERF05-01 设计优化
- **风险等级**
  中
  
- **关键策略**
  - 快速通道模式
  
  
  通过减少支配性工作量负载的处理量，只剩下必要的部分，来改进响应的时间。一个软件可以有多项功能，只有几个是被经常使用的，经常使用的功能构成支配性工作量负载。快速通道模式减少这些功能的处理量，或简化其处理过程。快速通道通过简化执行路径的方式来实现，简化路径即是快速通道。
  快速通道的前提是识别出支配性工作量，可以根据某项功能的使用频率来选择。常见的快速通道如，页面快速导航键、DB的索引等。
  - 重要事情优先
  
  
  把资源优先用于或者集中在重要的任务处理上，确保重要任务的完成；如果不能在可用的时间内完成所有事情，被忽略的是最不重要的任务。主要用于处理瞬时突发负载导致超出系统处理的容量的情况，一般给重要任务赋予高优先级，最重要的行为优先得到处理。只适用于暂时超载的情况，如果超载不是暂时的，需要减少处理量，或者升级系统。如在性能过载场景下，按照功能优先级进行熔断间接，保证主要功能可用。
  - 聚合
  
  
  将大多数场合在一起使用的功能组合在一起，以减少调用的交互次数。
  本模式要求将组合调用居多的一些子功能，合并起来使用。聚合这个模式要求尽量将相关或紧耦合的功能放到一个对象中，使用本地接口，避免在外部接口或重开销的接口（如CORBA接口），呈现小粒度对象。聚合模式使用更粗粒度的对象，经常被访问的数据应当组合成一个聚合物，以消除对少量信息的频繁请求。如，帐户类CustAcct可以提供访问函数getName()，getAddress()，getZip()，如果经常用到该类的任务是创建邮件标签，可以使用一个新函数genMailLableInfo()，以便调用一次取得所有信息，减少交互次数。
  - 批处理
  
  
  把经常性的服务请求合并到一起，节省请求的初始化、传输、终止的处理开销。当请求的任务初始化、传输、终止的开销较大时，系统的额外开销可能超过真正的处理时间。通过将请求合并为批处理，开销处理为一批请求所分摊，不再是单独分别执行一次，从而提高处理效率。如DB的批量保存、Redis的pipeline方式都是常用的批处理操作。
  ![](https://support.huaweicloud.com/usermanual-architecture/zh-cn_image_0000001949545286.png)
  批处理过程模型
  - 替代路由（Bypass）
  
  
  从空间上分散对高使用率对象的请求，将请求分散到其他对象或者对象的其他位置，以降低争用延时.类似于通过一条替代路线，绕开交通瓶颈，到达目的地。具体方案一是对目标对象进行空间划分，划分成小粒度对象，操作分散到不同物理位置；二是增加单独线程，每个线程更新自身的数据区域。
  比如进程必须与下游单个进程协作时，只有一个下游进程，在高负载的情况下跟不上，造成交通堵塞。可以使用多个下游进程，每个进程只更新其自身的数据区域。
  - 弹性时间
  
  
  在时间上分散对高使用率对象的要求，分散到不同的时间段上，减少对这些对象的争用延时。
  很多请求在某一时刻同时发出，导致要求返回的结果激增，响应缓慢。而在其他时间，很少或者没有请求。当处理请求以特定频率出现，或者在一天中的某个特定时间出现，就会产生这种情况。识别那些定期的，以特定间隔反复处理的功能，然后修改他们的处理时间，在给定时间范围内，随机分散到不同时间，以解决这个问题。
  - 空间换时间
  
  
  通过使用更多的存储空间，以节省执行时间。
  空间换时间包括简单地预先存储结果，或者存储经常被访问的数据以方便计算；另一种空间换时间则包括选择特定的算法，如HASH算法就是一种典型的空间换时间的算法。另一种是OLAP技术，在此技术中，数据被按照一定的层级关系预先汇总，这样会大幅降低后续查询的耗时。
  比如在慢SQL优化的时候，常用手段是识别频繁访问的字段并且设置索引，通过索引来缩短访问时延。
  - 处理有效负载
    识别出必须要处理的数据，排除对其他数据的重复处理。在一项处理数据的操作中，并非所有的处理数据都是必须处理的，可以通过分析，识别出必须处理的数据。可以有多种方式，来减轻负载的方法，如增量处理、变化通知等。
    - 增量处理
    
    - 变化通知
      
  
  
  有效减负的反模式是"负载过重"，是在处理过程中，处理了大量不必要的处理数据，大幅增加了处理负载。出现这种情况的原因，有时为了简化处理过程，有时候是没有做必要性分析。可以通过对待处理数据进行分析，筛选出必须处理的数据，重新设计处理方案。
  - 串行同步衔接
  
  
  给线程/进程间的串行衔接设计紧密的衔接和同步措施，减少同步等待延时。
  将一个串行处理通过划分多个线程并行处理，但各线程的处理又有一定的顺序和同步关系，需要设计合适的衔接和同步措施。同步方式可以是定时查询，也可以选择消息同步，或Event关联，选择的原则是衔接时间缝隙满足性能目标要求。
  这个方法最佳的效果只是让整体性能略等于处理环节中最差的一个环境的性能（忽略线程切换及信号量等切换时间）。
  
 
