记一例简单web业务性能瓶颈的改造过程

web项目通常由于需求紧,任务重,在上线初期,通常不会考虑太多架构性以及可靠性的问题。因此在业务稳定增长的过程中,大多都存在一个持续优化的过程。

这里记录一下前段时间,因某业务需要,对其持续优化的过程。

业务包括两个数据部分,一个负责实时数据上报的client,一个是负责数据接收以及实时数据展示的web系统。

优化目标有两个,一个是保证实时数据从收集到展示的延迟尽可能短,另一个是提高业务的可扩展性,保证业务的吞吐量不被一台服务器瓶颈所限制。

主要的操作包括静态资源加速,数据上报通道优化,服务器分布差异导致的延迟问题等。

web服务原始架构:

Client为安装在客户终端设备中的一个程序,浏览器为客户的其它带屏终端。Web Server为部署的服务器。

登录:

Client ==(认证信息)==> Web Server ==(返回服务URL)==> Client显示

授权通过后,Client开始收集数据并上传,客户通过Client显示的URL,在浏览器中加载完素材后,便有如下数据流。

Client ==(post提交)==> Web Server ==(Get阻塞轮询)==> 客户浏览器

在上线初期,我仅用了一台1c2g的服务器完成了这些业务流程。

带来的问题可而知,

带宽消耗型资源与延迟敏感性资源同时访问时产生冲突,容易造成实时展示效果短暂性中断,业务的不可扩展性导致分布式应用无法展开。

在第一步的优化中,将大量静态资源通过CDN网络进行加速,也是对带宽消耗型资源进行分离。

这样减轻了对服务器的带宽消耗。

第二步,增加数据上传通道,由于post提交包含HTTP/TCP的链接,握手,数据打包传输,下发反馈等过程,不利于快速数据交换。因此,在服务器端另开UDP服务,使得数据上传更加快速。

数据流变成如下所示

客户A/B浏览器   <===静态数据===  (CDN服务器)
-------------------------
ClientA ==实时数据==>(post提交) \                                   / 客户A浏览器
                               〉==> Web Server <==(Get阻塞轮询)==>
ClientB ==实时数据==>(UDP上传)  /                                   \ 客户B浏览器

第三步,分离数据通道,实现分布式架构。

由于Client之间的数据互不关联,互不影响。多个Client可使用不同的Server来实现数据交换。此外,不同Client位于不同地域,在合适的地域建立的Server,使得数据链路在物理空间上尽可能的短。

因此,通过分离Login与数据交互功能,形成LoginServer与DataServer便有了如下新的架构,

Client ==(认证信息)==> LoginServer ==(返回服务URL与DataServer)==> Client显示
在此背后,LoginServer ==>(认证信息)==>DataServer(1or2)

ClientA ==实时数据==>(post提交) ==> DataServer1<==(Get阻塞轮询)==>客户A浏览器
ClientB ==实时数据==>(UDP上传)  ==> DataServer2<==(Get阻塞轮询)==>客户B浏览器

Comments