Serverless架构实现CDN预热实践分析

简介: 预热是源站将会主动将对应的资源缓存到CDN节点,当您首次请求时,就能直接从CDN节点缓存中获取到最新的请求资源,提高缓存命中率。在游戏等行业,业务高峰前对热门资源进行预热,提高缓存命中率,降低访问延时。
直达最佳实践:【 Serverless架构实现CDN预热最佳实践
最佳实践频道:【 最佳实践频道
这里有丰富的企业上云最佳实践,从典型场景入门,提供一系列项目实践方案,降低企业上云门槛的同时满足您的需求!

为什么要预热

首先,什么是CDN预热呢?

CDN预热是指源站主动将对应的资源缓存到CDN节点,当您首次请求资源时,即可直接从CDN节点获取到最新的资源,无需再回源站获取,从而降低访问延时,提升访问体验。例如,在游戏行业中,某个热门游戏首发时,会有大量玩家等待开服,第一时间下载客户端。通常游戏客户端都比较大,如果没有预热,最先体验游戏的玩家下载时,CDN中还没有缓存,就会先回源到源站获取游戏客户端,这样下载速度往往会很慢,而且源站的主机CPU和带宽在短时间内被大量用户访问,也会占用大量资源,通常源站的带宽成本比CDN要高,不但影响用户体验也增加带宽成本。如果有了CDN预热,在游戏开服前把游戏安装包提前通过预热的方式推送到各个CDN节点,最先开始下载的玩家都能直接从CDN缓存中快速获取安装包,大大提升下载体验。

举个“栗”子

接下来以一个山东游戏用户为例(以下数据为构造数据),在无CDN加速的情况下,直接访问源站,大概耗时50ms。在使用CDN,但CDN未命中的情况下,通过访问山东L1到北京L2到上海机房,整体延时大约40ms,比直接访问减少10ms。再看下,如果直接命中CDN缓存,则只需要5ms,大大降低了访问延时,同时直接命中CDN缓存访问链路也极大缩短了,链路的访问质量显著提升。可见如果能快速命中缓存,对用户体验的提升非常明显,而CDN预热是一种非常有效的手段。

Serverless架构实现CDN预热实践分析.png

Serverless架构有什么好处

  • 按照CNCF对Serverless计算的定义,Serverless架构是指采用FaaS(函数即服务)和BaaS(后端服务)服务来解决问题的一种设计。这个架构免去了服务器运维,具有更高扩展性和安全性,成本也更低。
  • 在CDN预热方面,我们使用serverless架构,实现CDN预热的自动化和智能化,原先需要开发大量的代码、部署多个服务来实现CDN预热,现在完全无需管理服务器,比如操作系统的安全补丁、故障升级和高可用都无需用户考虑了。这种架构下资源变成了弹性扩展,不需做容量规划,按需付费也降低使用成本。在安全性方面,用户看不到服务器,也不需要通过SSH登录,DDoS攻击也交给云厂商解决了。
  • 在架构方面变得更简单了,用户自动化提交预热脚本后,在MNS里面形成消息队列,消息队列自动化触发函数计算,对需要预热的资源进行预热,整个过程完全以运维自动化的方式执行。

架构.png

Serverless实现CDN预热的思路

  • 首先,我们要寻找什么适合预热,前面介绍过热点资源大文件需要预热,另外如果是小文件,访问热度非常高的内容,一出来就会被访问,而且回源时间也很短,这种资源往往本身命中就很高了,所以不需要预热。另一类非常冷的资源,基本没有用户访问,从节约成本的角度,这种资源做预热收益率太低也可以不考虑。所以访问热度介于两者之间的,或者有区域性质的内容,比如短视频平台的本地视频、新闻内容APP的本地新闻,直播平台的附近直播,这些资源传播需要一定时间,可以通过预热提前推送到CDN L2节点,加速资源访问效率。因此在函数计算中,我们可以编写函数通过函数工作流定时调度执性函数去找出这样的资源,添加到预热URL列表中。
  • 其次,还要寻找什么时间适合预热,我们需要分析CDN的计费模式,如大客户一般采用95峰值计费的方式,即以5分钟记录一个带宽点,全月的值从大到小排列,去除前5%的峰值,取第95%的这个点作为实际计费带宽。为了更好利用带宽,预热的时间最好选择在波谷位置,这样做到削峰填谷,降低带宽使用成本。在Serverless架构下,我们使用函数计算编写业务逻辑,可以有效控制预热时间。
  • 当我们对预热的内容和时间有了精准的控制后,自动化执行脚本,把需要预热的URL推送到MNS作为缓存队列,这样也避免了预热URL过多的情况下,分批提交导致预热效率过低的问题。消息队列自动化触发函数计算执行预热任务。函数计算中的执行代码参考如下:
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcdn.request.v20180510.RefreshObjectCachesRequest import RefreshObjectCachesRequest
from aliyunsdkcdn.request.v20180510.PushObjectCacheRequest import PushObjectCacheRequest
from aliyunsdkcdn.request.v20180510.DescribeRefreshTasksRequest import DescribeRefreshTasksRequest
from aliyunsdkcdn.request.v20180510.DescribeRefreshQuotaRequest import DescribeRefreshQuotaRequest
def handler(event, context):
  id = 'LTA*********nRkRaYb7'
  secret = 'YJuNY*************rdeKLnl'
  client = AcsClient(id, secret, 'cn-shenzhen')
  obj = json.loads(event)
  doRefresh(obj['urls'], obj['type'], obj['objectType'], obj['area'], client)
  return 'hello world'
def doRefresh(lists,types,objectType,area,client):
    try:
      if types == 'clear':
        taskID = 'RefreshTaskId'
        request = RefreshObjectCachesRequest()
        if objectType:
          request.set_ObjectType(objectType)
      elif types == 'push':
        taskID = 'PushTaskId'
        request = PushObjectCacheRequest()
        if area:
          request.set_Area(area)
      taskreq = DescribeRefreshTasksRequest()
      request.set_accept_format('json')
      request.set_ObjectPath(lists)
      response = json.loads(client.do_action_with_exception(request))
      print(response)
    
      while True:
        count = 0
        taskreq.set_accept_format('json')
        taskreq.set_TaskId(int(response[taskID]))
        taskresp = json.loads(client.do_action_with_exception(taskreq))
        print("[" + response[taskID] + "]" + "is doing... ...")
        for t in taskresp['Tasks']['CDNTask']:
          if t['Status'] != 'Complete':
            count += 1
        if count == 0:
          break
        else:
          continue
        time.sleep(5)
    except Exception as e:
      sys.exit("[Error]" + str(e))

总结

CDN预热场景非常适合Serverless架构实现,比如内容和预热时间选择的自动化、消息队列的缓存及监听、自动化触发函数执行URL预热等有效帮助客户业务提升缓存命中率、提高运维效率、降低带宽使用成本,提升用户体验。
本文篇幅有限,更多的具体实现及实操参考最佳实践:Serverless架构实现CDN预热

二维码.png

相关文章
|
8月前
|
边缘计算 缓存 双11
阿里云渠道商:什么时候应该使用阿里云 CDN 预热?
阿里云CDN预热可将资源提前分发至边缘节点,降低首字节时间50%以上,减轻源站压力。适用于大促活动、大文件发布、定期更新、突发流量及APP资源更新等场景,提升访问速度与稳定性。首次访问求快用预热,内容更新生效用刷新。
|
12月前
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
471 0
|
9月前
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
577 5
|
9月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
8月前
|
缓存 边缘计算 双11
阿里云渠道商:适合使用CDN 预热的场景有哪些?
本文介绍CDN预热功能在大型活动、大文件分发、周期性更新等场景中的应用。通过提前将资源推送至边缘节点,可显著降低首字节时间、减轻源站压力,提升访问效率与系统稳定性。
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
1291 69
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
2854 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
1028 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析

相关产品

  • 函数计算