内容分发网络(CDN)
CDN 推送与拉取的设计与取舍
Content Delivery Network (CDN) 是一组地理分布式的 servers,协作来更快地交付互联网内容。一般来说,像 HTML/CSS/JS、图片、视频这些 static files 会从 CDN 提供。

为什么要用 CDN?
CDN 能提高内容 availability 与 redundancy,同时降低 bandwidth 成本并提升 security。内容从 CDN 提供可以显著提升 performance,因为用户会从离他更近的数据中心拿到内容,origin server 不需要自己扛这些请求。
CDN 是怎么工作的?

在 CDN 里,origin server 保存内容的原始版本,edge servers 分布在世界各地。
为了缩短访问者和网站服务器之间的距离,CDN 会把内容的 cached 版本放在多个地理位置(edge locations)。每个 edge location 里有多个 caching servers,负责向附近的用户交付内容。
当某个地区的 CDN servers 把静态资源 cache 好以后,该地区的后续请求就会从 edge servers 返回,而不是打到 origin,这样可以降低 origin 负载并提升 scalability。
举个例子,如果英国用户访问一个部署在美国的网站,请求会命中最近的 edge location(比如伦敦),比起让用户直接访问美国的 origin server,latency 会明显更低。
类型
CDN 一般分为两类:
Push CDN
Push CDN 的逻辑是:内容更新就推送到 CDN。你需要负责内容发布,直接上传到 CDN,并重写 URLs 指向 CDN。你也可以配置 content 的过期时间与更新策略。内容只有在新增/修改时才会上传,流量开销小,但 storage 成本更高。
适合 traffic 较小或者内容更新不频繁的网站。内容只需要推送一次,不必定期重新拉取。
Pull CDN
Pull CDN 是“按需 cache”。当 client 请求某个 static asset,如果 CDN 没有,它会去 origin server 拉取最新内容,写入 cache,然后再返回给用户。
相比 Push CDN,Pull CDN 维护成本更低,因为 cache 更新由用户请求驱动。适合 heavy traffic 的网站,因为流量会更均匀分散,而且只有近期访问的内容会留在 CDN 上。
缺点
CDN 也有代价:
- 额外费用:高流量服务使用 CDN 会比较贵。
- 限制:某些组织或国家会封禁热门 CDN 的 domain 或 IP。
- 地理覆盖:如果用户集中在 CDN 没有节点的国家或地区,反而可能比不使用 CDN 更慢。