1、缩短响应时间
2、提高并发数(增加吞吐量)
3、让系统处于合理状态
图片
系统时间是瓶颈: 缓存复用计算结果,降低时间开销,因为cpu时间较内存容量更加昂贵。
如何拆分系统 如何使用部分系统整体负载更加均衡 充分发挥硬件设施性能优势 减少系统内部开销等
关注算法选择是否高效,算法逻辑优化,空间时间优化任务执行吃力,使用无锁数据结构。
空间换时间:ThreadLocal
时间换空间:采用压缩算法压缩数据,更复杂的逻辑减少数据传输。
关注代码细节优化,代码实现是否合理,是否创建了过多的对象,循环遍历是否高效,cache使用是否合理
优化层次:从整理到细节,从全局角度到局部视角。
代码优化层次(1)
代码优化层次(2)
图片
select count(*)from table where add time<"2017- 11-0623:59:59" and status=0 add count in(1,2) ORDER BY id ASC;
代码逻辑要适应数据变化的场景
图片
图片
图片
●用更高效的算法替换现有算法,而不改变其接口
● 增量式算法,复用之前的计算结果,比如一个报表服务,要从全量数据中生成报表数据量很大,但是每次增量的数据较少,则可以考虑只计算增量数据和之前计算结果合并,这样处理的数据量就小很多
● 并发和锁的优化,读多写少的业务场景下,基于CAS的LockFree比mutex 性能更好
● 当系统时间是瓶颈,采取空间换时间逻辑算法,分配更多空间节省系统时间
● 缓存复用计算结果,降低时间开销, CPU时间较内存容量更加昂贵
● 当系统空间容量是瓶颈,采取时间换空间算法策略
● 网络传输是瓶颈,使用系统时间换取空间的压缩, HTTP的gzip 压缩算法
● APP的请求分类接口,使用版本号判断哪些数据更新,只下载更新的数据,使用更多的代码逻辑处理更细粒 度的数据
● 并行执行,比如一段逻辑调用了多个RPC接口,而这些接口之间并没有数据依赖,则可以考虑并行调用,降低响 应时间
● 异步执行,分析业务流程中的主次流程,把次要流程拆分出来异步执行,更进一步可以拆分到单独的模块去执行, 比如使用消息队列,彻底和核心流程解耦,提高核心流程的稳定性以及降低响应时间
● 系统微服务化
● 无状态化设计,动态水平弹性扩展
● 调用链路梳理,热点数据尽量靠近用户
● 分布式Cache 、 多级多类型缓存
● 提前拒绝,保证柔性可用
● 容量规划
● 分库分表,读写分离,数据分片
案例:
图片
读多写少、冷热数据明显,热点数据缓存到调用链路更靠近用户的地方
● L1缓存容量小负责抗最热点的数据, L2缓存考虑目标是容量,缓存更大范围的数据(一般用户的timeline), 高热点,数据单独缓存,比如设置白名单,大V 的用户数据放在L1缓存
● feed(关注的feed 、topic 的feed,一些运营的feed),前几页的访问比例,前三页占了90%+,针对这种业务特性,把 前面几页数据作为热点数据提到L1 cache
Feed系统消息发布
写扩散 (PUSH)
● 推送策略:拆分数据并行推,活跃用户先推,非活跃用户慢慢推
● 有 1w个用户关注,发了一个feed,拆分成100份,每份100个并行推
● 1w个用户里活跃的可能有2000个,活跃用户先推,非活跃用户慢慢推,保证活跃用户体验,非活跃用户推 了很大概率也不看
读扩散(PULL)
图片
Feed系统存储选型
图片