(转)CDN是如何工作的?

转载自:CDN是如何工作的?

CDN是互联网中使用较频繁的一种技术。你也许常听人说:“我们的网站使用了CDN技术”,但可能他们对CDN的了解并不多,也许只局限于--用了以后网站访问速度会变快。

其实,CDN的原理非常简单。当浏览器请求一资源时,第一步是做DNS解析,DNS解析就像是从通讯录根据姓名找号码,浏览器发送域名,然后得到DNS服务器返回的IP地址。浏览器通过IP地址和服务器连接并获取资源(DNS服务器会有很多层的缓存,但超出本文范围)。

对于小站点或个人博客,一个域名对应一个IP地址,而大站点可能含多个IP地址。

当请求一个资源时(如网站),距离会影响连接速度,所以从国内访问国外的网站比较慢。因此,一些大公司在世界各地配置服务器并同步数据,这就叫CDN,而那些离当地用户最近的服务器叫“边缘服务器(edge servers)”。

DNS解析

当浏览器通过CDN做域名解析请求时,针对单IP的网站会有一些不同。DNS服务器会找出最适合的服务器来处理请求,而且非常简单,DNS会找出离请求地点最近的边缘服务器。如下图所示,如果我从维吉尼亚州发送一个指向美国中部服务器的请求,就会得到位于东海岸的边缘服务器地址,如果我从加利福尼亚州发送请求,就会得到位于西海岸的边缘服务器地址。

也就是说处理请求的第一步:找出离请求位置最近的服务器。有些公司可能会用其他的方式优化CDN服务器,例如,如果最近的服务器满负荷运作,那么接下来的请求就会转到其他闲置的服务器。总之,CDN总会找出最适合的服务器来处理请求。

获取内容

边缘服务器是一种代理缓存,类似浏览器缓存。当请求到达边缘服务器,它会首先检查内容是否是最新的。缓存标识(key)就是整个Url地址(跟浏览器一样),如果内容已被缓存且没有过期,就直接返回缓存内容。

如果没有缓存或已过期,边缘服务器会向源服务器发送请求获取内容,并缓存起来。

雅虎创建了一个开源项目叫Apache Traffic Server,用来管理CDN直接的交互,如果想了解更多代理缓存的原理,推荐你读一下这个项目的文档。

示例

雅虎的CDN服务中,使用一个工具叫“组合处理器(combo handler)”,它会把多个文件的请求整合到一起,变成一个请求-响应操作。下面是例子:

http://yui.yahooapis.com/combo?3.4.1/build/yui-base/yui-base-min.js&3.4.1/build/array-extras/array-extras-min.js

域名yui.yahooapis.com是雅虎CDN服务的一部分,会把你的请求转给离你最近的边缘服务器,这个请求包含两个文件yui-base-min.js和array-extras-min.js,但只需一次响应便可完成。这些逻辑处理操作不在边缘服务器,只能在源服务器上。

静态指的是什么?

每当我描述类似上文的“组合处理器”之类的系统时,经常会看到别人困惑的表情。CDN有时候容易跟FTP资源混淆,因为它们都是上传静态资源供其他人获取。我希望我上文的描述能让大家搞清楚两者不一回事。边缘服务器是一个代理,源服务器告诉边缘服务器返回什么内容,源服务器可能是Java,Ruby,Node.js,.Net等,因此可以实现任何逻辑。边缘服务器什么也不做只是发生请求并返回内容。

既然CDN如此高效,为什么不把网站所有东西都用CDN来提高性能?CDN本质是缓存,如果保存的是动态页面,每次页面内容都会有所变化,那么每次请求都要和源服务器交互一次,那么这个缓存也就没有意义。

这也是为什么Javascript,CSS,images,Flash,音频,视频等文件特别适合使用CDN技术,因为这些文件是不变的,所有的用户获取的都一样,一旦通过CDN缓存,所有用户都受益。

缓存过期

雅虎性能指南规定静态资源应该要有缓存过期标识保存在Http协议的header中,这么做有两个原因:第一,浏览器会把资源缓存一段时间,第二,CDN会将资源缓存一段时间。这就意味着你不能使用重复的文件名,因为他们至少会被缓存在两个地方,用户可能会一直获取不到最新版本的文件。

有几种方式解决这个问题,YUI 库用包含不同版本库的目录来区分。通常也可以在文件名末尾加入标识符,如MD5的哈希值或者版本控制软件的修订号。任何一种继续都为了确保,当用户的请求包含过期标识的时候,依然能获得最新版本的文件。

结语

CDN技术已经是当今互联网重要的一部分,随着时间的推移,它只会变得越来越重要。即便是现在,一些公司仍然努力尝试把更多的功能移到边缘服务器,以便能给用户更快速的体验。这里包含了一种技术叫Edge Side Includes (ESI),用来缓存页面的部分内容。

更好的理解CDN技术及工作原理是提升CDN性能的关键。

 

原文:http://www.nczonline.net/blog/2011/11/29/how-content-delivery-networks-cdns-work/

注:这是我第一次翻译英文文章,花了比想象中要多的时间,如果看完文章对你有帮助是我最大的欣慰,不足的地方欢迎批评指出。

谢谢浏览!

转载于:https://www.cnblogs.com/Music/archive/2012/03/12/cdn-how-to-work.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch前缀匹配查询(英文检索)

#前缀匹配查询 #前缀匹配查询 GET /lib3/user/_search {"query": {"match_phrase_prefix": {"name":{"query":"zhao"}}} }{"took" : 59,"timed_out" : false,"_shards" : {"total&quo…

机器学习笔记(十六)——EM算法概述

一、引言 按照计划,这周应该学习HMM中的第三个基本问题:参数估计问题,但是其中的内容涉及到了EM算法,所以打算先把EM算法搞定之后再去继续HMM的问题。EM算法的推导过程比较复杂,这节我只给出简述和计算公式&#xff0c…

c# 日期函数[string.Format----GetDateTimeFormats] --转载

c# 日期函数[string.Format----GetDateTimeFormats] c# 日期函数 DateTime dt DateTime.Now;Label1.Text dt.ToString();//2005-11-5 13:21:25Label2.Text dt.ToFileTime().ToString();//127756416859912816Label3.Text dt.ToFileTimeUtc().ToString();//12775670485991281…

ElasticSearch wildcard查询(英文检索)

wildcard查询 允许使用通配符*和?来进行查询 *代表0个或多个字符 工代表任意1个字符 GET /ib3/user/ search { "query": { "wildcard":{ "name": *zhao* }}} GET /ib3/user/ search { "query": { "wildcard":{ *name"…

机器学习笔记(十七)——EM算法的推导

一、Jensen 不等式 在EM算法的推导过程中,用到了数学上的Jensen不等式,这里先来介绍一下。 若Ω是有限集合{x1,x2,…,xn}{x1,x2,…,xn},而μ是Ω上的正规计数测度,则不等式的一般形式可以简单地用和式表示: φ(∑i1ng(xi)λi)≤…

CCTextureCache的多线程加载原理和使用

做引擎的时候,遇到一个texture的异步加载,这里将具体的原理和使用方法贴出来,后面根据浏览器的特性做修改移植。 voidCCTextureCache::addImageAsync(constchar *path, CCObject *target, SEL_CallFuncO selector) { CCAssert(path ! NULL, …

ElasticSearch fuzzy模糊查询(英文检索)

fuzzy实现模糊查询 value:查询的关键字 boost:查询的权值,默认值是1.0 min_similarity:设置匹配的最小相似度,默认值为0.5, 对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天 prefix…

机器学习笔记(十八)——HMM的参数估计

一、HMM中的第三个基本问题 参数估计问题:给定一个观察序列OO1O2…OT,如何调节模型μ(A,B,π)的参数,使得P(O|μ)最大化: argmaxμP(Otraining|μ)arg \max_{\mu} P(O_{training}|\mu)模型的参数是指构成μ的πi,aij,bj(k)。本文…

[Pyramid 杂记]Static Routes,静态路由是用来干什么的?

官方文档上介绍说Static Routes(即添加路由时指定static参数为True,config.add_route(page, /page/{action}, staticTrue)),在匹配Request Url时不会被用来匹配,它只用于生成URL. 这哥就很奇怪,只用于生成URL,而不会被匹配,就是说生成的URL不会被匹配到了嘛(有点拗口 …),那要这…

ElasticSearch highlight搜索结果高亮显示(英文检索)

高亮显示搜索结果(使用highlight) #高亮搜索结果 GET /lib3/user/_search {"query":{"match":{"interests": "changge" } }, "highlight": { "fields": {"interests":{}}}}{&qu…

最优化学习笔记(十二)——基本共轭方向算法(续)

目标函数为n维二次型函数时,共轭方向法能够在n步迭代之后得到极小点。接下来会发现,共轭方向法的中间迭代步骤具有一种很有意义的性质。选定x(0)作为迭代初始点, d(0)为初始搜索方向, 有: x(1)x(0)−(g(0)Td(0)d(0)TQd(0))d(0)\…

C++ 入门笔记1

一.关于注释 注释总是以 /* 开始并以 */ 结束。这意味着,一个注释对不能出现在另一个注释对中。由注释对嵌套导致的编译器错误信息容易使人迷惑。 当注释掉程序的一大部分时,似乎最简单的办法就是在要临时忽略的区域前后放一个注释对。问题是如果那段代码…

基本查询(Query查询中文)

查询语句: GET /lib4/user/_search {"query": {"term": {"interests":"唱歌"}} }#terms:查询某个字段里含有多个关键词的文档 GET /lib4/user/_search {"query":{"terms":{"interests": …

C#实现POST提交方式

网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多,常用的用WebBrowser、WebClient、HttpWebRequest这三个。 以下就分别用这三种方法来实现: 1、WebB…

最优化学习笔记(十三)——基本共轭方向算法(扩张子空间定理)

由上节我们得出的一个引理: 引理 在共轭方向算法中, 对于所有的k,0≤k≤n−1,0≤i≤k都有 : g(k1)Td(i)0\boldsymbol{g}^{(k+1)T}\boldsymbol{d}^{(i)}=0由上可知:g(k1)正交于由向量d(0),d(1),…,d(k)张成的子空间中的任意向量。该引理可用…

term和match查询总结(中文检索)

es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。 由于DSL查询更为直观也更为简易,所以大都使用这种方式。 DSL查询是POST过去一个json,由于…

机器学习笔记(十九)——最大熵原理和模型定义

一、最大熵原理 最大熵原理是概率模型学习的一个准则。最大熵原理认为,在学习概率模型时,在所有可能的概率分布中,熵最大的模型是最好的模型。通常用约束条件来确定概率模型的集合,所以,最大熵模型也可以表述为在满足约…

EasyCode.Net代码生成器使用心得

前段时间购买了一个EasyCode的正式使用许可 看他的界面设计的不错 就用他生成了一个项目(目地是想把以前我自己的一个程序的界面给更换下 人家有专业的UI设计我自己设计出来的肯定没有人家专业UI设计师弄出来的好看) ,项目生成完了 发现还不能直接更换界面他的是sq…

ElasticSearch(中文检索)source总结

包含不包含这里不多讲了。 GET /lib4/user/_search {"query": {"match_all": {}},"_source": {"includes": ["name" ,"address"],"excludes": ["age" , "birthday" ]} }直接看看…

2012 依赖注入框架

以下内容来自维基百科的控制反转词条 控制反转(英语:Inversion of control,缩写为IoC),也叫做依赖注入(Dependency Injection,简称DI),是面向对象编程中的一种设计原则&a…