分布式系统解析之分布式系统常用优化思路

分布式系统优化的思路

方向一: 尽可能减少跨机间的网络传输量,尽量优化传输耗时.
原因是1G带宽下传输1M耗时20微妙, 而锁操作一次25ns,两者有1000倍的差距,在分布式环境下,网络传输会成为性能瓶颈. 在处理分布式事务时更明显.

优化方法有:
方法一:通过同步复制, 将跨机操作转为本机操作,即将跨机的数据拷贝到 机器本地去处理.
把跨机器的join操作,通过将小表复制到大表所在机器,将跨机器的join操作转换为本机join.
这里的复制是增量进行的,会有延迟,如果业务可以接受,这是一个不错的方案. 这样,下一次如果再需要join,则可以直接在大表机器上完成本地join.

方法二:将跨机的计算下沉到各子节点本地,节点之间只传输各自处理结果,主节点合并结果.
与这种方式对应的是 主节点从各子节点收集需要处理的数据,在主节点完成数据处理和合并, 问题就是 主节点和子节点间的数据传输量太大.

方法三:将跨机的事务拆分为多个本机事务,通过消息中间件串联.
想办法把一部分跨机操作转成本地操作,然后通过其它方式串联.

方法四:万兆网卡,纯粹的加速传输速度.

方向二:查询优化 (不考虑cache)

方法一:建议都带sharding key来查询
方法二:建冗余表, 方便查询

 

本文说说系统优化的常用手段吧,其中可能有一些内容在系列前面的文章里已经总结过了,这里还是再系统地整理出来,方便将知识汇总,有个整体上的认识。本文只讲方法论,没有具体实现。限于水平总结得可能不全,后面还会补充。

本文将系统主要分为前端优化和架构优化两个层面来说。

前端优化

1.页面优化

延迟加载

对一些还没有访问到的元素实行延迟加载,尤其是首页上的内容。

预加载

对用户即将访问到的元素进行预加载,提升用户体验。

减少DOM元素数量

可提升页面渲染速度。

iframe数量尽量少

众所周知iframe用于在页面中嵌入页面,如果数量过多也会降低页面加载速度。

压缩html文件大小

减少网络请求字节数,提升加载速度。

减少http请求数

分为三个方面:一是合并js或css文件;二是对图标类文件,使用css的sprites和background-image、background-position属性进行切图使用;三是使用浏览器缓存。

减少DNS查找次数

我们知道,我们是通过DNS服务器将网址解析成对应的服务器地址的,如果每次请求都去询问DNS服务器访问速度会很慢,因此我们第一次获取到对应的IP地址后将其缓存本地,不要每次去取。

避免跳转

页面的跳转都是通过301或302实现的,每次跳转也增加了网络消耗。

使用Ajax的GET请求

使用Ajax和服务器交互时,GET是交互一次,而POST是交互两次,分别发送文件头和请求数据。因此当我们只是为了加载数据时,通过GET方式即可,需要注意的是此方式限制数据量大小为2KB。

控制cookie大小

每次请求都会带上cookie,如果cookie过大爷会造成响应缓慢。建议不要将不常用的信息写入cookie。

2.CSS优化

将CSS置于页面顶端

因为页面是顺序加载的,预先加载css样式,可以保证后面的元素以我们设计的方式占线,用户体验更好。

避免使用CSS表达式

因为页面每加载到这个元素,就会重新计算一次,频率太高影响加载速度。

使用外部CSS

可减少HTML文件大小

3.JS优化

脚本放于页面底部

因为脚本的加载不影响页面内容的展示。

剔除重复的脚本

有效减少脚本大小,加速加载速度。

减少不必要的DOM访问

对已访问过的元素进行保存,因为DOM访问速度并不高。

判断条件多时用switch

尽量将概率大的case放在上面。

类型相同判断使用"==="

"==="判断类型相同的元素,而"=="会做类型转换。

4.图片

不在HTML中缩放图片

页面每次加载该图片,都是一个重新计算的过程。建议直接将图片切好尺寸载入。

架构优化

1.负载层

CDN加速

关于CDN的介绍可以系列这篇文章。使用CDN技术可以保证来自不同运营商网络的请求获取相差不多的访问速度。

动静分离

网站包括动态数据和静态数据。动态数据只能每次回到我们服务器上去取,而一些静态数据则可以部署在CDN服务器上,不要每次回源,加快加载速度。

负载均衡

通过随机、轮询、加权或哈希取模等方式,将请求尽量均衡地散布到我们的服务器上。详见系列这篇文章。

2.应用层

串行改并行、同步改异步

对热门数据或大的资源的加载,可考虑将其储存在多台服务器节点上,访问时启用多个线程去获取,加快访问速度。对于一个流程上对多个服务的调用,可考虑采用异步的方式(放入消息队列),快速响应用户请求。

连接复用、请求合并

不要每次连接都重新申请,可引入资源池的概念进行管理(线程池)。对高频次访问的请求,可考虑合并为一个请求处理,节约连接资源。

熔断、隔离、限流、降级

对服务调用的一系列治理措施。详见此文。

3.数据层

缓存

对经常访问的数据储存在缓存中,不要每次访问数据库。详见此文。

读写分离

针对数据库而言,使读和写操作互不影响。

分库分表

当数据库数据达到一定量级,可考虑分库分表。详见此文。

你可能感兴趣的:(架构)