在当今的电商、直播、社交工具和视频网站等互联网应用中,存在着大量的图片、视频、文档等资源需要分发给用户。对于一些体量较大的应用而言,若将大量资源集中在单一节点进行分发,几乎没有哪个机房能够承受如此巨大的流量。例如,一个日活达 100W 的小型互联网产品,若每次请求需 1M 数据,那每日的数据量将近 1TB。面对这样的数据规模,仅靠单一节点进行分发显然不现实。因此,如今的互联网应用在分发内容时,并非直接从自己架设的服务器分发,而是借助一种名为内容分发网络(Content Dilivery Network,CDN)的互联网底层建设。
一、CDN 究竟是什么?
内容分发网络(CDN)与域名系统类似,是一个专门用于分发内容的分布式应用。它构建在现有的互联网之上,通过在各地部署数据中心,使不同地域的用户能够就近获取所需内容。这里所说的内容通常包括文件、图片、视频、声音、应用程序安装包等,这些资源具有显著的无状态(即静态)特征,且一旦发布,很少发生变化。同时,它们往往会被大量用户需求,因此分发这些资源的流量成本较高。
为何不能集中提供这些静态资源呢?这与域名系统的 DNS 记录不能集中提供的道理相同,需要考虑流量、单点故障、延迟等因素。在离用户更近的地理位置提供资源,能够减少延迟。按照地理位置分散地提供资源,也可降低中心化带来的服务压力。
CDN 服务商会在全球或某个国家范围内进行布点,具体取决于服务提供商的服务范围。目前,国内的阿里云、腾讯云等也在提供 CDN 业务。
二、内容的分发
CDN 是一个分布式的内容分发网络。当用户请求一个网络资源时,实际上是在请求 CDN 提供的资源。与域名系统类似,当用户请求一个资源时,首先会接触到一个类似域名系统中目录的服务,该服务会告知用户应从哪个 IP 获取这个资源。
事实上,许多大型应用会将 DNS 解析作为一种负载均衡手段。当用户请求一个网址时,会从该网站提供的智能 DNS 中获取网站的 IP。例如,当请求百度时,具体连接到哪个百度的 IP,是由百度使用的智能 DNS 服务决定的。
所以,总体静态资源的使用路径如下:当用户请求一个静态资源时,首先会触发域名系统的解析。域名系统会将解析的责任交由 CDN 提供商处理,CDN 的智能 DNS 服务会为用户选择离自己距离最近的节点,并返回这个节点的 A(或 AAAA)记录。然后,客户端会向 CDN 的资源节点发起请求,最终获得资源。在整个过程中,CDN 的智能 DNS 还起到了负载均衡的作用。若一个节点压力过大,可将流量导向其他节点。
三、回源
目前,我们已经讨论了 CDN 的主要设计和架构,但还有一个问题尚未解决——资源如何进入内容分发网络。资源的生产者即 CDN 的购买者,其目的是向用户提供网络服务。那么,服务提供者的静态资源如何进入 CDN 呢?是手动上传、用接口推送,还是通过其他方式呢?
可以将 CDN 想象成一个分布式的分级缓存加上数据库的两层设计。用户的请求先到达缓存层,若缓存被穿透,才会到达最终的存储层。缓存的设计必须是分布式的,因为绝大多数的资源使用都会发生在缓存上,只有极少数请求会穿透到底层存储。通常,我们期望缓存层至少能挡住 99%的流量。既然缓存层能挡住如此多的流量,那么实际的数据存储就可以由源站点完成。
值得一提的是,在程序设计中有一个核心原则,即单一数据源(Single Souce of Truth,SSOT)。该原则指的是,在程序设计中,应尽可能减少数据的来源,最好每个数据来源只有单独一份。这样能够避免大量的数据不一致以及同步数据的问题。基于此设计,谁来提供资源的存储呢?谁来提供这个单一的数据源呢?当然是服务提供者本身。如果 CDN 再提供一份资源的存储,就会出现两个数据源。而且,只有服务的提供者才能更好地维护这个资源仓库。
CDN 是一种网络应用,其作用是分发互联网上的资源。CDN 服务的提供商,会在世界(或国家)范围内设立数据中心,以帮助分发资源。用户请求的资源会被 CDN 分发到最临近的节点获取。
总的来说,CDN 作为一门生意,CDN 服务商会从运营商处大批量获取流量,再以较高但可接受的价格卖给服务提供方。对于中小型互联网公司来说,购买一定的 CDN 流量成本可控,比如 1G 流量在 1 元以内。对于大型互联网公司,特别是对 CDN 依赖严重的公司,可能还需要自己建设。例如,2021 年抖音每天分发的数据量在 50PB 左右(1PB = 1024TB),如此庞大的数据量若换算成钱是非常高的。按照阿里云的报价,50PB 的价格是 480W 人民币。按照这种体量计算,抖音每天要花 480W 人民币,一年就是 17 亿。
所以,当你设计一个内容分发方案时,除了要考虑其中的技术细节,还需从成本上进行思考,看看能否从数据压缩、资源格式等角度做些文章。
文章(专栏)将持续更新,欢迎关注公众号:服务端技术精选。欢迎点赞、关注、转发。
标签:分发,缓存,请求,CDN,用户,深入,资源 From: https://blog.csdn.net/u010223407/article/details/143818598个人小工具程序上线啦,通过公众号(服务端技术精选)菜单【个人工具】即可体验,欢迎大家体验后提出优化意见!