前言
目前生产环境下的 App
经常会出现使用卡顿,有下面几种表现:
在 [加载中] 页面会停留较长时间,如下
软件安装包下载速度较慢
图片视频音频资源加载速度较慢。
之前开会时讨论过这个问题,当时定位的原因是 服务器带宽导致的。但是这只是其中一个原因,下面来结合各个因素整体分析一下 生产服务器网速较慢 的原因。
网速较慢的原因
目前 云鱼App 涉及的所有服务都部署在同一台生产服务器上,这些服务共享同一台服务器的带宽资源,其中占用网络带宽资源较多的服务是:**[接口服务]、[聊天服务]、[文件服务]、[管理页面]** 四个服务。
下面的这些行为都会占用网络带宽资源:**App
端请求接口、用户发送聊天消息、用户查看图片/视频、用户下载 App
安装包、用户在管理页面操作。这些行为可以分为3类:接口请求、聊天消息对应的 Socket
请求、静态资源的加载。这3类中,静态资源的加载** 对服务器带宽资源的占用最大,因为 静态资源 是内存占用较大的 图片/视频/音频/文件,相比 接口请求 和 聊天消息对应的 Socket
请求 会耗费更多的带宽资源。
进行如下测试,在 管理页面 - 商品列表 中进行的一次查询列表数据操作对应的网络请求:
另外,还有一种更直观的方式来测试 加载静态资源占用带宽导致 App
网络卡顿 的情况:在浏览器中同时开启多个 App
安装包下载任务,然后这时使用 App
,就会出现接口请求缓慢,甚至可能出现 [图片/视频/音频] 加载失败的情况。
处理办法
最直接的办法:增加服务器的带宽,但这个方案应该只能缓解网络卡顿的情况。上面说过,静态资源的加载 是占用服务器带宽的主要因素,因此可以考虑对这一块儿进行优化,有如下几个办法:
- 额外购买服务器。将涉及 静态资源加载 较多的服务单独部署,目前主要集中在 [文件服务] 和 [管理页面] 两个服务中。
- 静态资源通过 [对象存储服务] 进行存储和访问(阿里云简称
OSS
,华为云简称OBS
,下面统一描述为OSS
)。OSS
工作原理(来源:阿里云)数据以对象(Object)的形式存储在OSS的存储空间(Bucket )中。如果要使用OSS存储数据,您需要先创建Bucket,并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后,您可以将数据以Object的形式上传到Bucket,并指定Object的文件名(Key)作为其唯一标识。
OSS以HTTP RESTful API的形式对外提供服务,访问不同地域需要不同的访问域名(Endpoint)。当您请求访问OSS时,OSS通过使用访问密钥(AccessKey ID和AccessKey Secret)对称加密的方法来验证某个请求的发送者身份。
OSS
进行存储,之后访问静态资源时,直接请求OSS
服务的地址,这种方式使用的是OSS
服务的流量,需要支付OSS
服务的 [存储] 和 [流量] 费用。文档地址:对象存储服务OBS - 华为云,价格参考:OBS价格计算器 - 华为云 - 静态资源存储在云服务器上,通过
CDN
服务进行访问。CDN
工作原理(来源:华为云)CDN
服务的优势见:为什么推荐将静态资源放到CDN上?静态资源仍然存储在云服务器中,开通云服务商的CDN
服务,之后访问静态资源时,请求配置的CDN
服务地址,这种方式需要额外支付CDN
服务的流量费用。文档地址:内容分发网络CDN - 华为云,价格参考:CDN价格计算器 - 华为云 - 静态资源通过
OSS
进行存储,通过CDN
服务进行访问。工作原理(来源:使用CDN加速OSS访问 - 阿里云)补充说明:上面给出的工作原理中,静态资源是存储在
OSS
中的,如果将其替换为存储在云服务器上,那么就是上面说的第3种方法了。 - 手动限制静态资源的下载速度。在静态资源所在的服务中添加代码,限制静态资源的下载速度。如果代码中无法处理,可以考虑将静态资源通过
Nginx
配置直接访问,然后在Nginx
中限制下载速率,参考:文件服务器文件加载较慢的解决方案(CDN+Nginx)。
综合来看,目前较为合适的处理是第3种:静态资源存储在云服务器上,通过 CDN
服务进行访问。通过这种处理只需要接入 CDN
服务即可,目前静态资源占用的空间不大,服务器自带的存储空间完全够用,待后期服务器存储空间不足时可以再考虑接入 OSS
服务。
补充
在进行改造前,可以先调查下生产服务器目前的网络资源使用情况,方便与改造之后的情况进行对比。
引入CDN
后带来的问题
需要注意 CDN
盗刷问题:
目前的生产服务器其实也存在被盗刷的风险,额外引入
CDN
并不会让这个风险增加或减少。
华为云和阿里云给出的相关的处理办法: