不得不说现在大陆和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加速小水管动态应用技巧的更多相关文章

  1. Signalr系列之虚拟目录详解与应用中的CDN加速实战

    目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Si ...

  2. 什么是CDN加速?(转载)

    随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...

  3. CDN和CDN加速原理

    随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...

  4. 什么是CDN及CDN加速原理

    目录 CDN是什么? CDN的相关技术 负载均衡技术 动态内容分发与复制技术 缓存技术 谁需要CDN? CDN的不足 随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激 ...

  5. vue项目性能优化(路由懒加载、gzip加速、cdn加速)

    前端工程性能优化一说意义深远悠长,本章主要介绍除了一些基础优化外如何实行路由懒加载.Gzip加速.CDN加速,让网页飞的快一些. 基础优化 老生常谈的一些: 不要在模板中写复杂的表达式 慎用watch ...

  6. CDN是什么与CDN加速的原理

    CDN是什么 CDN全称:Content Delivery Network或Content Ddistribute Network,即内容分发网络 CDN设计思路 避让:尽可能避开互联网上有可能影响数 ...

  7. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  8. 利用免费cdn加速webpack单页应用

    回顾现状 在之前的学习过程中,react单页应用经过webpack打包之后会输出大概如下的目录结构,它就是站点的所有前端组成了:   1 2 3 4 5 6 MacBook-Pro:output ba ...

  9. 浅析门户网站体育赛事CDN加速解决方案

    经过近些年来的高速发展,互联网已经成为现今媒体传播的主要力量.这一点在大型体育赛事的报道与转播上,体现的尤为明显.更及时的信息内容.更多样的报道形式.更齐全的资料组成.更方便的阅读查询.更具互动性的报 ...

随机推荐

  1. 【CSS3】自定义设置可编辑元素闪烁光标的颜色

    前言 因为业务需求, 要求我们的input框内的文本与悬浮的光标颜色不同, 这样的问题肯定在书本上很难找到解决办法, 需要通过平时的基础积累和经验. 解决方案 使用 ::first-line 伪元素 ...

  2. mupdf 基于命令行的 pdf转图片

    下载地址: https://www.mupdf.com/downloads/index.html 使用方法: 打开cmd,切换到mupdf文件路径下,再在命令行中敲入命令  mutool.exe  d ...

  3. python入门到放弃-基本数据类型之tuple元组

    #概述 元组俗称不可变的列表,又称只读列表,是python的基本数据类型之一, 用()小括号表示,里面使用,逗号隔开 元组里面可以放任何的数据类型的数据,查询可以,循环可以,但是就是不能修改 #先来看 ...

  4. Python——项目-小游戏

    开始我们的项目 飞机大战 1 项目的初体验 以及前期准备 游戏初体验画面 验证一下本地第三方包有没有导入 python3 -m pygame.examples.aliens 如果没有出现游戏画面请先安 ...

  5. tableZen maxHeight 解决方案 如果数据条数小于N,不进行高度设置,超过N条,直接设置高度,解决原生iview Table 对于右侧固定列,不能计算出正确数值的解决方案

    tableZen maxHeight 解决方案 如果数据条数小于N,不进行高度设置,超过N条,直接设置高度,解决原生iview Table 对于右侧固定列,不能计算出正确数值的解决方案 if (thi ...

  6. 关于WPF System.windows.Media.FontFamily 的类型初始值设定项引发异常问题解决方法

    造成原因:此问题的根本原因是.NET Framework January 2018 Rollup(KB4055002)与已安装的.NET Framework 4.7.1产品版本之间的MSI安装交互.R ...

  7. Python程序设计试验报告一: 熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告                                                                  班级   物流192   ...

  8. vmware导入ova文件踩坑记

    问题来源 众所周知,所有的网络行为都会产生相应的网络流量,那么所有的网络攻击行为也有其对应的流量特点,那么是否能根据流量特点进而分析出其对应的是什么攻击行为呢? 我在虚拟机上使用vulnhub的靶场环 ...

  9. XSS构造剖析

    参考:邱永华<XSS跨站脚本攻击剖析与防御> 一 绕过XSS-filter 1.利用<>标记注射Html/JavaScript比如:<script>alert('X ...

  10. 云CRM系统安全吗

    云CRM系统有一个特点只要连接互联网就能够进行访问,这种访问可以是移动端也可以是电脑端的,而且本地CRM系统只允许电脑端访问.云CRM系统将数据存储在云服务器上,很多人就会问云CRM系统安全吗?下面和 ...