网络内容分发利器 ---- CDN

2,365 阅读7分钟

最近要做一个新项目,分为客户端(windows exe)和服务端。服务端的逻辑我比较熟悉,提供 RESTFul 接口即可。 客户端这里,涉及到安装包的分发、下载、版本更新等逻辑,比较生疏。项目用户大概在亿级别。

初步考察了下,方案选择了 COS 源站 + CDN 加速分发。为了避免踩坑给业务带来损失,在使用 CDN 之前,对 CDN 的一些知识进行了初步的了解。

简介

CDN 的全称是 Content Delivery Network,即内容分发网络。简而言之,就是通过将文件部署在离用户更近的网络节点上,来减少网络交互耗时,加速文件传输。

  • CDN 是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  • CDN 的关键技术主要有内容存储和分发技术。

CDN 和源站的关系

源站,就是文件的提供方站点。如果 CDN 文件找不到,就会穿透到源站下载,例如 COS 等。

  • 源站是指存储原始内容的服务器或网站。
  • 加速域名是指用户提供的需要使用 CDN 加速服务的域名,即终端用户访问的域名。
  • 当用户请求加速域名下的内容时,CDN 系统会根据用户的位置和网络状况,将请求转发到最近或最优的边缘服务器上。
  • 如果边缘服务器上没有缓存该内容,则会向源站发起回源请求,并将回源得到的内容缓存到边缘服务器上,并返回给用户。
  • 这样可以减少源站的压力和流量消耗,并提高用户访问资源的速度和体验。

源站和 CDN 的关系,可以类比如:数据库(mysql)和缓存(redis)的关系。

CDN 的计费成本

不同的 CDN 提供商可能有不同的计费方式和标准,一般来说主要包括以下几种:

  • 按流量计费:根据用户消耗的流量进行计费,适合流量波动大或者无法预估流量需求的场景;
  • 按带宽计费:根据用户使用峰值带宽进行计费,适合流量稳定或者能够预估流量需求的场景;
  • 按请求数计费:根据用户发送给边缘服务器或者回源服务器的请求数进行计费;
  • 按资源类型计费:根据不同类型(如静态资源、动态资源、视频资源等)或者不同区域(如国内、国外等)进行区分计费;
  • 组合套餐:根据不同场景和需求提供多种组合套餐供用户选择

我们目前选择腾讯云上按照峰值下行带宽收费的策略。

成本控制

总体来说,CDN 成本和下行带宽、下行流量相关。

以我们业务选择的付费策略(下行峰值带宽)为例,节约成本的办法就是:尽量控制 CDN 下行带宽平缓,而不是尖刺增加。比较如下两种版本升级策略:

  1. 全天下载速度都在 1Gbps 左右,10:00 业务推送一波更新触达用户,大量用户同时进来下载更新,导致 CDN 带宽直接飙升到 100Gbps 左右。
  2. 匀速推送更新,保证更新用户数尽量均匀,全天带宽都在 10Gbps 左右。

成本上来说:第1种方案 CDN 成本是第2种方案的10倍,当然,第2种升级策略覆盖全量用户更慢,用户体验上有影响。但是绝大多数 app 的更新,应该都是缓慢全量覆盖。所以总体来说,还是推荐选择第2种方案。

猜一猜 iOS AppStore 的更新为啥那么慢?比如微信发布了 10.0 版本,广州的同事发布第一天就收到了 AppStore 推送更新,西安的同事等了4、5天还没收到推送,只能进 AppStore 手动刷新更新。我猜就是成本方面的考虑。

当然,除了第2种这种从推送维度上进行控制外,还可以控制单用户下载速度,例如限制单用户 8Mbps,还可以控制同时下载人数(通过全局令牌桶)。

举个例子,如果预算带宽是 40Gbps,应用大小为 100MB,单用户限速 10Mbps,那么同时下载人数应该设置多少呢?

单用户下载时长:100MB(100Mb * 8) / 10Mbps ~ 80s,也就是说同时会有 80s 的下载用户的带宽叠加在一起。

同时下载人数估算为:40Gbps/80s/10Mbps ~ 50人。

CDN 的分片回源策略

  • 分片回源是指当边缘服务器需要回源获取大文件时(如视频文件),不是一次性将整个文件下载到本地再返回给用户,而是将文件切分成多个小片段,在下载每个片段后就立即返回给用户,并同时继续下载后续片段
  • 分片回源可以有效地降低回源时间和带宽消耗,并提高传输效率和可靠性

忽略 URL 参数

例如 https://xxxx.xx.com/test1.exe?ch=huaweich=huawei 就是拼接 URL 参数。

为什么要在 CDN 链接上拼接 URL 参数?

有很多原因啦,例如,软件推广更新,需要携带参数表明用户是从那个渠道下载的安装包,ch=huawei就是华为应用市场,ch=yyb就是应用宝等等。

  • URL 参数是指在 URL 中以 ? 开头并以 & 分隔各个参数的部分。
  • URL 参数通常用于传递一些用户身份信息、访问渠道信息等,但是对于 CDN 节点来说,这些参数并不影响缓存内容的有效性
  • 如果不忽略 URL 参数,那么 CDN 节点在处理用户请求时,会根据完整的 URL 来生成缓存 hashkey,这样可能导致缓存碎片化和命中率降低.
  • 如果开启忽略参数功能,那么 CDN 节点在处理用户请求时,会去除请求 URL 中携带在 ? 之后的参数,并以原始 URL 来生成缓存 hashkey,这样可以提高缓存利用率和命中率

CDN 配合云函数自动刷新和预热

  • 刷新是指当源站内容发生变化时,通过 CDN 控制台或者 API 接口通知 CDN 系统清除边缘服务器上对应的缓存内容,并重新回源获取最新内容.

  • 预热是指当有新内容上线或者有大量访问预期时,通过 CDN 控制台或者 API 接口通知 CDN 系统主动从源站拉取指定的内容,并缓存到边缘服务器上,提前为用户访问做好准备.

  • 刷新和预热都需要手动操作或者调用 API 接口,如果有大量或者频繁的刷新和预热需求,可能会比较麻烦和耗时.

  • 如果使用云函数服务(如腾讯云函数计算),可以编写一些自定义函数来实现自动刷新和预热功能.

    • 比如可以利用 COS 触发器,在 COS 上上传文件后自动触发一个函数来调用 CDN 的刷新接口;
    • 比如可以利用定时触发器,在每天固定时间自动触发一个函数来调用 CDN 的预热接口;
    • 比如可以利用 HTTP 触发器,在收到某个 HTTP 请求后自动触发一个函数来调用 CDN 的刷新或者预热接口;
  • 这样可以节省人力和时间,并提高效率和可靠性。

项目实际应用

项目上上线前配置了:

  1. 单用户 CDN 下载限速 10Mbps,同时并发下载人数。
  2. 配置了 预热策略。
  3. 配置了 CDN 分片回源。
  4. 配置了 CDN 忽略 URL 参数。

昨天是新项目灰度第一天,放量 5%,预祝新项目成功,大卖!

image.png