首页 > 其他分享 >深入了解内容分发网络(CDN)

深入了解内容分发网络(CDN)

时间:2024-11-16 15:46:31浏览次数:3  
标签:分发 缓存 请求 CDN 用户 深入 资源

在当今的电商、直播、社交工具和视频网站等互联网应用中,存在着大量的图片、视频、文档等资源需要分发给用户。对于一些体量较大的应用而言,若将大量资源集中在单一节点进行分发,几乎没有哪个机房能够承受如此巨大的流量。例如,一个日活达 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

相关文章

  • 深入理解Jackson的@JsonCreator注解
    在Java的JSON处理库中,Jackson无疑是最流行的选择之一。它提供了强大的数据绑定功能,允许开发者轻松地在Java对象和JSON数据之间进行转换。在处理不可变对象或者需要自定义反序列化逻辑时,@JsonCreator注解显得尤为重要。本文将通过实例深入探讨@JsonCreator注解的使用,包括其在......
  • 缓存与数据库不一致的解决方案:深入理解与实践
    目录前言缓存与数据库不一致的原因缓存与数据库交互的基本策略常见的缓存与数据库不一致解决方案方案一:读写穿透模式方案二:Cache-Aside模式方案三:先删除缓存,再更新数据库方案四:先更新数据库,再删除缓存方案五:异步更新缓存数据不一致的经典场景与应对策略总结前言在分......
  • 深入探索LangChain的高级功能
    在当今的AI开发领域,LangChain以其独特的模块化设计和强大的功能集,成为大语言模型开发者的重要工具。本文将深入探讨LangChain的高级功能,展示其在复杂应用场景中的应用潜力。###LangChain的架构优势LangChain的设计理念是通过模块化和可扩展性,简化大语言模型的集成与管理。其核......
  • 【Linux探索学习】第十三弹——进程状态:深入理解操作系统进程状态与Linux操作系统中的
    Linux笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482前言:在上篇我们已经讲解了进程的基本内容,也了解了进程在操作系统的重要作用,今天我们正式开始进程的另一个知识点的讲解:进程状态,即一个进程不可能一直处在运行或终止状态中,它......
  • 如何通过优化服务器和基础设施来降低pcdn的成本(贰)?
    要通过优化服务器和基础设施来降低PCDN(P2PContentDeliveryNetwork)的成本,可以采取以下策略:1.高效利用用户设备资源(1)纳入更多用户设备:PCDN技术的一大优势在于能够利用用户设备的闲置带宽和存储资源来缓存和分发内容。因此,通过激励措施(如提供奖励或积分)鼓励更多用户参与,可以......
  • 深入浅出:Java 中的经典排序算法详解与实现
    文章目录1.冒泡排序(BubbleSort)基本思路详细步骤Java实现2.插入排序(InsertionSort)基本思路详细步骤Java实现3.选择排序(SelectionSort)基本思路详细步骤Java实现4.快速排序(QuickSort)基本思路详细步骤Java实现5.归并排序(MergeSort)基本思路......
  • 【深入浅出】之Linux多进程实现shell外壳程序(简易版)
    ......
  • c语言笔记(鹏哥)课件+上课板书汇总(深入指针1)
    深入指针(1)⽬录:一、内存和地址二、指针变量和地址三、取地址操作符四、指针变量类型的意义(这一讲到这)五、const修饰指针六、指针运算七、野指针八、assert断⾔九、指针的使⽤和传址调⽤内存和地址引例:假设有一个宿舍楼,你在一个房间里,宿舍楼里每一间房间都......
  • 深入理解 MySQL 大小写敏感性:配置、问题与实践指南20241115
    深入理解MySQL大小写敏感性:配置、问题与实践指南在开发和部署MySQL数据库时,表名的大小写敏感性问题常常被忽略,却可能在跨平台迁移、团队协作或工具兼容性方面引发复杂的故障。本文将结合实际案例,深入探讨MySQL的lower_case_table_names参数,剖析其行为、配置方法以......
  • Redis深入底层数据结构(万字详细)
    RedisRedis基本数据类型Redis支持5种数据类型:string(字符串)hash(哈希)list(列表)set(集合)zset(sortedset:有序集合)Stringstring:一个key对应一个value。string类型是二进制安全的,可以存储任何类型的数据常用命令:get,set,incr,decr,mget等hashhash:一个string类型的field......