本文导读:

  • 物流仓库配送如何加速

  • 静态资源文件部署方式

  • 静态资源加速之CDN技术

  • 解析过程中的名词解释

  • 最后的总结


1、物流仓库配送如何加速

我们还是从生活中购物的例子来展开。

将时光倒回到几年前,在那时候我的老家县城里,如果你从京东APP上购物下单,起码需要等上个几天时间,才能将商品送到你的手中。

因为他们的物流仓库中心当时并没有在县城里来建设,所以一般可能从地市或者省会(看做区域仓库)物流仓库去查找是否有库存,如果区域物流仓库还是没有库存,则可能会从北京物流仓库(看做中心仓库)发货,一旦中心仓库也无货,那就只能从厂商进货了(看做源站)。

但是,现在不一样了,不管你是身在一线城市还是在老家,从京东网站上购物(默认以自营商品为主)下单,基本隔天就能收到货了,快递小哥送货效率都是一样的。

这就是京东强大的物流优势,将物流仓库扩建到离老百姓最近的地方,使得用户购物体验得到了非常大的提升。

通过这个案例,我们就理解了商品送货的加速过程。

商品有普通商品,大件商品等,这些商品最开始都是备货到中心物流仓库,中心物流仓库可以认为是几乎是最全的商品仓库中心。

当区域物流仓库建设好之后,就可以将这些商品提前备货到区域仓库,进一步提高商品送达时间。

当仓库在县城里建设后,就可以将这些商品提前备货到县城仓库,只要仓库离你越来越近,你下单后不需要费那么大的周折,从区域或中心仓库发货了,甚至你都可以去当地仓库某个点上门自提了。

如下图所示:

县城仓库就是离用户最近的仓库,也就是在用户与中心仓库之间通过增加多级中间仓库,就近发货,加快送货速度,提升了用户体验。

2、静态资源文件部署方式

那么,如果在网络上,当你访问一个购物商城时,点击进入商品详情页,可以看到会有大量图片以及广告视频,这些都属于静态资源,那么这些静态资源用户是如何访问到的?

最开始,我们考虑部署个 Nginx 集群,每台机器上都会存储这些静态资源,可以通过某个服务将文件上传到其中一台机器,然后 rsync 方式分发到其他 Nginx 机器上。对于小的静态资源文件这么做没有问题。

但是,对于图片、视频这些资源可能从几M到几百M不等,是不建议放到 Nginx 集群上的,而且也不建议使用分布式缓存,分布式缓存本身也不建议存储过大的Key。假设你的确这么做了,把 Nginx 集群或者分布式缓存都部署在北京机房,当用户访问这些资源时,由于要经过多个骨干网络上的传输,会导致网络延迟高,给你在视觉上感觉就是图片无法加载,视频播放卡顿的现象。

此时,我想你也不会有兴趣在继续等下去了,对于电商网站来说用户就此流失了。

通常,我们可以将小的静态资源文件使用 Nginx 集群当做源站,而对于流媒体音视频数据,会使用单独的分布式存储作为源站。所谓源站,即你的静态数据原始存储的地方。为了达到高可用的、高稳定性的目的,结合企业成本考量,一般要部署成 BGP 多线机房。

BGP 机房示意图如下所示:

所谓的 BGP,它可以实现让网站在各运营商线路之间实现互联互通,做到所有互联运营商的用户访问网站都很快,结合用户网络选择最优质的网络链路。因此,BGP 机房带宽的成本更高。

BGP 机房带宽成本一般在80~400元/M,所以假设每 1M 流量按照 100元算,那么 1G 流量就是 10 万块的,如果是几十或者上百 G流量,这个成本可想而知了。

3、静态资源加速之 CDN 技术

在上面的案例中,我们知道了用户访问静态资源,会直接访问 BGP 源站,带宽成本是很昂贵的。一个网站用户会分布在全国各地,甚至是分布在全球,如何让用户更快的访问这些静态资源呢?

我们也可以借鉴物流仓库的例子来理解,跟物流仓库类似,当然是这些静态资源离用户越近,访问就越快了。由此,CDN 技术应运而生了。

什么是 CDN 技术?

CDN 的全称是 (Content Delivery Network/Content Distribution Network),即内容分发网络。CDN解决的问题是在网络中增加一层CACHE(缓存)层,将源站的资源分发到距离用户最近的网络"边缘"节点上,使用户就近访问内容,提高网站响应速度,避免网络拥塞,保证了用户访问资源的速度和体验。

增加 CDN 节点后,如下图所示:

CDN 的分发架构:

跟物流仓库做个类比:中心仓库物流就是相当于 CDN 中心节点,区域物流仓库相当于 CDN 区域节点,县城物流仓库中心就相当于 CDN 边缘节点。

CDN 分发架构示意图:

当前 CDN 技术应用是非常普遍的,有实力的公司,也会自建 CDN,而且有自己的CDN研发团队支撑,提供了更加稳定可靠的 CDN 服务。但是大多数公司,还是会选择专业的 CDN 厂商,如果你的服务部署在云上,可以选择阿里云、腾讯云提供的 CDN 服务。此外,还可以选择老牌的 CDN 厂商,如网宿和蓝汛。

CDN 工作原理:

那么用户是如何访问到离他最近的 CDN 节点的呢?

我们还是用一张图来整体理解下,更加直观:

上述这张图解决了两个问题:

访问域名如何映射到 CDN 地址的

如何找到离用户最近的 CDN 节点

接下来,我们根据上面两个问题,结合图示来详解下这个流程。 

1. 访问域名如何映射到CDN地址

当你通过浏览器访问 static.example.com 域名时,假设这就是个静态域名,并且做了 CDN 静态资源加速。

1)首先会经过本地 DNS 解析器,查看下本机 /etc/hosts 文件是否存在域名对应的IP,如果找到,直接使用该 IP 发起请求。否则,执行步骤2)。

2)由于本地 DNS 服务器解析,如果在本地 DNS 缓存中找到域名对一个IP,则直接用该 IP 访问。否则,继续步骤3)。

3)本地 DNS 服务器会向根域名服务器发起请求,根域名服务器返回顶级 DNS 域名服务器地址,让你去它那里查找。

4)本地 DNS 服务器会向顶级 DNS 域名服务器发起请求,.com 顶级域名服务器返回权威 DNS 域名服务器地址,让你去它那里查找。

5)本地 DNS 服务器继续向 example.com 权威 DNS 域名服务器发起请求,权威 DNS 域名服务器一看这个域名我能解析,发现是有做过CDN加速域名配置,它会 CNAME 到 static.xxx.example.cdn.com 域名。

到此,其实我们通过访问静态域名 static.example.com 经过一番波折,终于找到了 CDN 域名地址。

如果你不需要找离用户最近的节点,通过 static.xxx.example.cdn.com 域名就可以找到正确的 IP 地址了。

2. 如何找到离用户最近的 CDN 节点

结合上图,继续解析如果找到距离用户最近的 CDN 节点。

1)本地 DNS 服务器会将 static.xxx.example.cdn.com 会向第一层 GSLB 全局负载均衡发起请求,第一层全局负载均衡会根据用户所在运营商网络分析,比如移动运营商,返回 CNAME 到如 static.yd.example.cdn.com 域名地址。

2)本地 DNS 服务器会继续向第二层 GSLB 全局负载均衡发起请求,第二层全局负载均衡依据 DNS 地理位置判断,返回 SLB CDN 负载均衡地址。

3)本地 DNS 服务器从返回的多个 CDN 节点 IP 中,可以通过本地简单轮询的方式去选择一个 CDN IP 访问。

此时,最终通过 GSLB 全局负载均衡找到的这些 CDN 节点,就是离用户最近的 CDN 节点了。

什么是 GSLB?

GSLB(Global Server Load Balance),即全局负载均衡,它的含义是对于部署在不同地域的服务器之间做负载均衡。一方面可以让流量均衡负载到它下面的服务器上,另一方面能根据地理位置判断,找到离用户最近的服务器。

找到了离用户最近的 CDN 节点,并不一定能直接从该 CDN 节点上获取对应的资源,如果资源不存在,会继续从上级区域或中心 CDN 节点查找,如果都不存在,最终就会回源到源站获取资源,然后设置 CDN 缓存失效时间。

一般对于一些小的静态资源文件,存储在源站,由 CDN 节点主动拉取方式来访问的。

对于大的音视频流媒体文件,可以通过 CDN 厂商提供的接口提前将资源写入到 CDN 某一个节点上,再由 CDN 内部机制将资源分发到其他 CDN 节点上。

但是,即使主动同步资源,也是存在延时的,最终可能会导致回源,而回源带宽成本又是很大的。所以,我们在使用 CDN 的时候就有必要关注 CDN 命中率和源站带宽情况。

4、解析过程中的名词解释

CNAME( Canonical Name ):

它可以将一个域名解析到另外一个域名。

举个例子:

当你使用 docs.example.com 去访问一些资源时,希望通过 docs-xyz.example.com 也能访问相同的这些资源,你可以在 DNS 解析服务商添加一条 CNAME 记录,将 docs-xyz.example.com 指向 docs.example.com,添加后,所有访问 docs-xyz.example.com 的请求都会被转发到 docs.example.com 域名。

CNAME 域名:

接入 CDN 时,在 CDN 厂商控制台添加完加速域名后,会得到一个 CDN 给你分配的 CNAME 域名, 需要在你的 DNS 解析服务商添加 CNAME 记录,将自己的加速域名指向这个 CNAME域名,这样该域名所有的请求才会都将转向 CDN 的节点,达到加速效果。

DNS (Domain Name System):

域名解析服务。

将域名解析为网络上可识别的IP地址。服务器之间认识的都是IP,但用户习惯记忆的都是域名,所以域名与IP地址之间关系是一对一的。它们之间的转换工作,就称为域名解析,由专门的解析器来完成域名解析,可参见上述图中的 DNS 解析过程。

5、最后的总结

大家可能觉得作为一名工程师,离上述提到的 CDN 技术很遥远,忽略 CDN 技术的重要性,好像都是运维干的事情,与我何干。这个想法是错误的,咱们的思维不能太过于局限,如果你做一些直播、视频相关技术,多多少少肯定能接触到这块的技术。

你有没有考虑过抖音、快手上的短视频的整个流程,A城市用户上传视频后,经过转码分发后,B城市用户很快就能看到了,视频播放也是非常流畅,这其中也是得益于 CDN 分发技术的应用。

本文通过引入物流仓库的例子与 CDN 技术做个类比,对于 CDN 分发架构有了感官认识。

同时对 CDN 解析工作原理做了进一步剖析,大家通过 CDN 工作原理分析的那张图好好理解一下,里面包含了 DNS 解析的详细过程,DNS GSLB 是如何查找离用户最近节点的。

CDN 是各大系统的门面,更擅长缓存静态数据、图片、流媒体数据。CDN 作为一种特殊的缓存,它的命中率和高可用性也是我们需要重点关注的。

有收获扫码关注 Java爱好者社区 支持,公众号:javatech_cbo 原创干货及时推送!

欢迎关注我的公众号,扫二维码关注获得更多精彩文章,与你一同成长~

作为一名程序员,你真正了解CDN技术吗?的更多相关文章

  1. 【G彩娱乐网】作为一名程序员,我应该如何选购一台电脑?

    G彩娱乐网说到程序员专用电脑,那肯定是苹果电脑.优点有很多,比如白平衡特别准.酷炫的黑科技.特别方便的软件等显而易见的优势:也有能够增加提案通过率.专注工作提高工作效率这样的玄学buff. 但是!并不 ...

  2. 作为一名程序员,在面试中如何展现你Python的coding能力?

    来源商业新知,原文标题:如何在一场面试中展现你对Python的coding能力? 如果你已经通过了招聘人员的电话面试,那么下面正是该展现你代码能力的时候了.无论是练习,作业,还是现场白板面试,这都是你 ...

  3. Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?

    作为一名程序员这些代码托管工具你都知道吗? 作为一名优秀的开发者,大家都会用到代码托管,我本人用的是github,确实github里面有很多很多开源的项目,所以我们目前的创业项目程序员客栈www.pr ...

  4. 3名程序员被抓!开发“万能钥匙”APP,撬走3个亿

    来自:程序员头条 报道 又有 3 名程序员被抓!开发"万能钥匙"APP,撬走 3 亿! 前几天,据央视新闻报道,上海公安机关接到共享单车企业报案,随后破获了一起共享单车万能解锁 A ...

  5. 怎样从一名程序员过度到项目经理(整理自csdn论坛) 选择自 whoopee 的 Blog

    1.从程序员到PM,是一条脱变的路,事实上程序员走的路最终不应该是项目经理.首先有一点需要明白的就是,一定规模的项目中,项目经理不需要太懂技术,他可以是一知半解.项目经理的任务不是在技术方面,技术相关 ...

  6. 从程序员到CTO的Java技术路线图 作者:zz563143188

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

  7. 总结一下ERP .NET程序员必须掌握的.NET技术

    总结一下ERP .NET程序员必须掌握的.NET技术,掌握了这些技术工作起来才得心应手   从毕业做.NET到现在,有好几年了,自认为只能是达到熟练的水平,谈不上精通.所以,总结一下,自己到底熟练掌握 ...

  8. 一篇文章搞懂高级程序员、架构师、技术总监、CTO从薪资到技能的区别

    一篇文章搞懂高级程序员.架构师.技术总监.CTO从薪资到技能的区别 http://youzhixueyuan.com/senior-programmers-architects-technical-d ...

  9. 如果你想or即将成为一名程序员,那你需要知道这些东西!上岗须知~

    前两天公司学院的同学给我看了一下即将入职的应届生的数量,真是不少.感慨一下,一批新人即将到来,而自己又老去了一岁.码农是一个必将终身学习的职业.而相关的知识越来越多了.接下来该学什么?接下来该干什么? ...

随机推荐

  1. 利用threading模块开线程

    一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...

  2. Spring IOC(2)----如何注册bean定义

    前面说到IOC容器在刷新之前的一些初始化工作,现在来看看在refresh()方法中,是怎样来加载注册我们自己的bean定义的. refresh()方法中有很多功能,从注释中就可以看出来 我们本次重点关 ...

  3. Shell之命令执行的判断依据

    目录 Shell之命令执行的判断依据 参考 Shell之命令执行的判断依据

  4. POJ 2533——Longest Ordered Subsequence(DP)

    链接:http://poj.org/problem?id=2533 题解 #include<iostream> using namespace std; ]; //存放数列 ]; //b[ ...

  5. VR应用评测 - Google Spotlight Story: Sonaria

    Google Spotlight Story: Sonaria 一个5min左右的VR小电影,坐姿观看,但是用户其实可以移动+旋转视角.画面很抽象,所有的物体都由基本的单色几何形状组成,主角是两个一公 ...

  6. mysql操作遇到的坑(第一版)

    1.当我们要统计数据表数量时,如果遇到多表查询,会出现一个主表对应多个子表的维度,我们会用到group by,但是不要再用统计函数去操作数据,因为统计还是会统计原数据 案例 SELECT sum(`o ...

  7. MongoDB 学习笔记之 地理空间索引入门

    地理空间索引: 地理空间索引,可用于处理基于地理位置的查询. Point:用于指定所在的具体位置,我们以restaurants为例: db.restaurants.insert({name: &quo ...

  8. IoC 之装载 BeanDefinitions 总结

    最近时间重新对spring源码进行了解析,以便后续自己能够更好的阅读spring源码,想要一起深入探讨请加我QQ:1051980588 ClassPathResource resource = new ...

  9. opencv之形态变换

    形态变换 在opencv之膨胀与腐蚀中介绍了Dilation/Erosion的原理.建议先读这一篇,搞懂原理. 这样就可以很轻松地理解为什么本文的这些形态变换可以取得相应的效果. 基于此,我们可以组合 ...

  10. ssrf漏洞学习(PHP)

    自己最近原本是想深入的学习一下关于xss.csrf的东西的,可是感觉这些东西需要有很好的js的基础来进行学习..还有感觉自己感觉也差不多该要学习内网渗透了..正好ssrf在内网这一块也是比较有用的.于 ...