CDN加速小水管动态应用技巧
不得不说现在大陆和HK的云主机都是小水管模式,由于硬件的快速发展在这种小水管的情况下很难发挥出用户硬件资源的能力,当然可以加水管但费用很高,更多时候会浪费带宽;这个时候我们想到CDN加速,这种资源的好处就是可以把瞬间流量分担出去,让小水管可以应对更多的请求。但CDN在我们印象中都是加速静态资源,更新慢对于动态不怎好用,但办法总是用的接下来介绍一下如何用CDN加速动态应用。
需求
最近在做一个在线讨论的服务,由于涉及到比较多的内容如发送图片,附件和历史记录等,对于这样的动态信息展示的确不适合小水管;对于3Mb的小水管来说一张图片就可以把小水管给卡住了。。更不要说记录中有大量的图片和附件存在!接下来想到了CDN,经过一些时间的思考把发送消息和历史信息的资源都落地到CDN上,但这些消息都是动态如果每次变更去刷CDN那基本就没法用了!为了实现这些想到了一种新的思路并落地到group.beetlex.io
接下来就把这思路介绍给大家。
CDN配置
现有的云服务商都提供CDN服务,费用也不高对于500G的年包也就一百块不到。CDN配置很简单,以下以百度为例(虽然百度搜索很烂,但这个CDN服务还是挺稳的)。在CDN中添加你的域名
里面的CNAME就是你原域名的DNS指向值,添加完成后可以根据自己的需要制定访问控件,最好配置一下主要防止其他网站直接利用网站的资源来进行流量输出。
使用
当有了CDN后第一步就可以把你的静态资源直接挂载的CDN中,主要是网站固定的HTML,CSS,JS和图片等。可以直接在页面中添加域引用的资源如:
<script src="http://group.tomap.me/js/comm.js"></script>
如果你的网站是HTTPS访问,则资源连接也必须是HTTPS。
动态数据使用
对于动态数据的应用则因为应用的情况不同来进行不同的设计,不过方式差别不大;以下是针对group.beetlex.io应用做的一些处理。在这个应用中主要有两类动态信息主要是实时发送消息和历史记录;实时消息并不需要走CDN但消息内图片和附件则无法由小水管来保障!还有每次进入房间获取历史聊天记录都有着比较高的瞬间流量,这种流量小水管也应付不来。
消息图片和附件资源
由于group.beetlex.io以Markdown的方式进行消息输入,所以可以上传图片或附件进行一个消息展示。虽然可以把这些资源先存到云服务商中然后获取相关访问URL再输出,但这种设计的方式有着一定的依赖性,以后相 关URL切换并不方便,最终还是选择存储到本地服务中;但这种存储方式存在一个问题就是小水管输出比较麻烦,既然有CDN只需要在Markdown输出的时候更换一下URL地址即可;更换代码如下:
msg.Message = msg.Message.replace(/<img.*?src="(.*?)">/gi, (data) => {
var regex = /<img.*?src="(.*?)"/;
var src = regex.exec(data.toString())[1];
if (src[0] == '/')
src = 'http://group.tomap.me' + src;
var html = '';
if (insert == true) {
if (src.indexOf('faces') >= 0) {
html = '<img src="/images/imgloading.gif" _src="' + src + '">'
}
else {
html = '<img src="/images/imgloading.gif" _src="' + src + '" onclick="page.imgViewSrc=\'' + src + '\'">'
}
}
else {
if (src.indexOf('faces') >= 0) {
html = '<img src="' + src + '">'
}
else {
html = '<img src="' + src + '" onclick="page.imgViewSrc=\'' + src + '\'">'
}
}
return html
});
只需要简单地匹配一下相关图片标签替换即可,如果是站外图片则不代替;对于下载的文件的连接也可以使用这种处理方式。这样这些图片的展示和文件下载都由CDN来输出处理。
历史记录
在group.beetlex.io中每个用户进讨论组都要重新拉取历史记录信息,如果消息量太大的情况一个就把小水管的带宽拉完了。为了解决这一问题也使用了CDN来加载历史记录,但房间的历史记录是经常变的如果变更后自动去刷新CDN可能很难达到有效性。为了解决这一问题采用了URL重写机制来解决这一问题,原理很简单当讨论组每次有消息的时候都变更讨论组的版本号,然后在进这个讨论组时都访问这样一个版本的URL来处理,重写代码如下:
"/rooms/{room}-{version}.html" => "/GetRoomHistory?room={room}"
这样每次获取讨论历史信息的时候都访问一个房间ID+版本的静态页面,而后台则根据这个URL重写到获取信息的控制器上,这样只要信息有变更每次加载新的都能从CDN中获取。不过这种做法就是当第一个访问的用户大概延时1秒左右这延时完全可以接受,但后面访问的速度就快多了;通过这样做法即使小水管也能支撑很多历史记录加载而不影响服务效率。以下是调用的代码
this.enterRoom.asyncget({ room: id, password: password })
.then((result) => {
var url = 'http://group.tomap.me/rooms/' + id + '-' + result + '.html';
this.getRoomHistory.loading = true;
axios.get(url).then((r) => {
r.data.forEach(v => { this.addMessage(v, true); });
this.imgs = null;
setTimeout(this.loadImg, 1000);
this.hasNewMessage = true;
this.getRoomHistory.loading = false;
}).catch((error) => {
this.$errorMsg(error);
this.getRoomHistory.loading = false;
});
rooms_password[id] = password;
}).catch((err) => {
this.selectItem = {};
rooms_password[id] = null;
});
技巧总结
其实动态数据使用CDN也是比较简单事情,主要利用更改请求的URL或重写来把静态资源切换到动态数据接口上;为了让CDN更快速地获取到新数据,通过数据变更的版本号来定位到新的URL来让CDN加载新的数据。通过这种方式就可以把很多动态接口做成CDN静态化。
CDN加速小水管动态应用技巧的更多相关文章
- Signalr系列之虚拟目录详解与应用中的CDN加速实战
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Si ...
- 什么是CDN加速?(转载)
随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...
- CDN和CDN加速原理
随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...
- 什么是CDN及CDN加速原理
目录 CDN是什么? CDN的相关技术 负载均衡技术 动态内容分发与复制技术 缓存技术 谁需要CDN? CDN的不足 随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激 ...
- vue项目性能优化(路由懒加载、gzip加速、cdn加速)
前端工程性能优化一说意义深远悠长,本章主要介绍除了一些基础优化外如何实行路由懒加载.Gzip加速.CDN加速,让网页飞的快一些. 基础优化 老生常谈的一些: 不要在模板中写复杂的表达式 慎用watch ...
- CDN是什么与CDN加速的原理
CDN是什么 CDN全称:Content Delivery Network或Content Ddistribute Network,即内容分发网络 CDN设计思路 避让:尽可能避开互联网上有可能影响数 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 利用免费cdn加速webpack单页应用
回顾现状 在之前的学习过程中,react单页应用经过webpack打包之后会输出大概如下的目录结构,它就是站点的所有前端组成了: 1 2 3 4 5 6 MacBook-Pro:output ba ...
- 浅析门户网站体育赛事CDN加速解决方案
经过近些年来的高速发展,互联网已经成为现今媒体传播的主要力量.这一点在大型体育赛事的报道与转播上,体现的尤为明显.更及时的信息内容.更多样的报道形式.更齐全的资料组成.更方便的阅读查询.更具互动性的报 ...
随机推荐
- Service Mesh - gRPC 本地联调远程服务
Description Service Mesh 架构下,服务间调用会通过服务名(Service Name)互相调用,比如在 Kubernetes .Docker Swarm 集群中,服务 IP 均由 ...
- 基于Unix Socket的可靠Node.js HTTP代理实现(支持WebSocket协议)
实现代理服务,最常见的便是代理服务器代理相应的协议体请求源站,并将响应从源站转发给客户端.而在本文的场景中,代理服务及源服务采用相同技术栈(Node.js),源服务是由代理服务fork出的业务服务(如 ...
- 【从零单排HBase 01】从一无所知到5分钟快速了解HBase
最近公司正好准备投入HBase,因此做了一些基础学习准备,所以先暂时停止MySQL的更新,把HBase的学习心得跟大家分享一下,接下来一段时间都会发布HBase相关内容. 在学的过程中,发现跟MySQ ...
- linux 安装 memcached
1.Linux系统安装memcached,首先要先安装libevent库. yum install libevent libevent-deve 2.安装memcached yum install - ...
- 转pdf
一.转印厂pdf(书本类及折页类) 1.储存为(Ctrl+Shift+S) 2.保存类型选择 pdf 3.常规==>Adobe PDF预设==>选择印刷质量 4.选择标记和出血==&g ...
- python网络协议
一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...
- 【Win10】我们无法更新系统保留的分区
前言 笔者是一个萌新,这个方案也是慢慢摸索出来的,有更好的方案欢迎大家提出 前段时间用公司电脑发现win10新版本还行,回家升级自己的电脑却提示“我们无法更新系统保留的分区”.(O_o)?? 笔者 ...
- django 和 七牛云 交互
django 和 七牛云 交互 七牛开发文档 安装 pip install qiniu 初始化 # access_key 个人中心的 ak # secret_key 个人中心的 sk from qin ...
- ALSA driver---DPCM
https://www.kernel.org/doc/html/v4.11/sound/soc/dpcm.html Description Dynamic PCM allows an ALSA PCM ...
- 网络安全从入门到精通 (第二章-2) 后端基础SQL—MySQL数据库简介及SQL语法
本文内容: 什么是数据库 常见数据库 数据库的基本知识 基本SQL语法 1,什么是数据库? 数据库就是将大量数据保存起来,通过计算机加工,可以高效访问的数据聚合. 数据库就是长期存储在计算机内,有组织 ...