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加速解决方案
经过近些年来的高速发展,互联网已经成为现今媒体传播的主要力量.这一点在大型体育赛事的报道与转播上,体现的尤为明显.更及时的信息内容.更多样的报道形式.更齐全的资料组成.更方便的阅读查询.更具互动性的报 ...
随机推荐
- GZOJ 1361. 国王游戏【NOIP2012提高组DAY1】
国王游戏[NOIP2012提高组DAY1] Time Limit:1000MS Memory Limit:128000K Description 国王游戏(game.cpp/c/pas) [问题描述] ...
- Python 解密JWT验证苹果登录
验证苹果登录,官方提供两种验证方法,一种是token,另一个种是code.这里使用的是token 登录流程: 苹果客户端调用苹果API,获取到用户的信息,包括: user_id 昵称 identity ...
- Flink消费Kafka到HDFS实现及详解
1.概述 最近有同学留言咨询,Flink消费Kafka的一些问题,今天笔者将用一个小案例来为大家介绍如何将Kafka中的数据,通过Flink任务来消费并存储到HDFS上. 2.内容 这里举个消费Kaf ...
- qtp10安装步骤(比较完整)
在安装qtp之前,要提前安装软件(不知道是干嘛的,反正安装就完了),右键--管理员运行完成安装,如下图: 解压qtp镜像: 双击setup: 第一步,点击第一排 第二步, 注:安装QTP系统提示“ 计 ...
- C语言程序设计(三) 简单的算术运算和表达式
第三章 简单的算术运算和表达式 算数运算符:一元.二元.三元(条件运算符) 1/2是整型除法,1.0/2是浮点数除法 求余运算(%)限定参与运算的两个操作数必须为整数,不能对两个实型数据进行求余运算 ...
- ubuntu下使用apt-get install安装软件的安装位置
在ubuntu下使用 apt-get install 或 apt install 下载安装软件,软件下载及安装后的目录.: A.下载的软件的存放位置:/var/cache/apt/archives B ...
- C语言 变量初始化二进制、八进制、十六进制
int a1 = 10; //十进制 int a2 = 0b10; //二进制 int a3 = 010; //八进制 int a4 = 0x10; //十六进制 打印的结果:
- Lambda表达式学习笔记
Lambda基础语法 Java8中引入了一个新的操作符" -> ",该操作符被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分: 左侧:Lamb ...
- pycharm+keras+yolo3的使用和自选模型的训练中遇到的坑
1.TensorFlow版本的问题 报错:RuntimeError: `get_session` is not available when using TensorFlow 2.0. 解决办法:这个 ...
- 三万字、91道MySQL面试题。 附PDF
文末领取面试题 高清PDF 数据库基础知识 1. 为什么要使用数据库 数据保存在内存 优点:存取速度快 缺点:数据不能永久保存 数据保存在文件 优点:数据永久保存 缺点:1)速度比内存操作慢,频繁的I ...