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

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 预热是源站将会主动将对应的资源缓存到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

相关文章
|
5天前
|
存储 SQL 监控
转转平台IM系统架构设计与实践(二):详细设计与实现
以转转IM架构为起点,介绍IM相关组件以及组件间的关系;以IM登陆和发消息的数据流转为跑道,介绍IM静态数据结构、登陆和发消息时的动态数据变化;以IM常见问题为风景,介绍保证IM实时性、可靠性、一致性的一般方案;以高可用、高并发为终点,介绍保证IM系统稳定及性能的小技巧。
20 6
|
25天前
|
存储 缓存 关系型数据库
社交软件红包技术解密(六):微信红包系统的存储层架构演进实践
微信红包本质是小额资金在用户帐户流转,有发、抢、拆三大步骤。在这个过程中对事务有高要求,所以订单最终要基于传统的RDBMS,这方面是它的强项,最终订单的存储使用互联网行业最通用的MySQL数据库。支持事务、成熟稳定,我们的团队在MySQL上有长期技术积累。但是传统数据库的扩展性有局限,需要通过架构解决。
65 18
|
1月前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
102 17
|
1月前
|
存储 消息中间件 小程序
转转平台IM系统架构设计与实践(一):整体架构设计
本文描述了转转IM为整个平台提供的支撑能力,给出了系统的整体架构设计,分析了系统架构的特性。
75 10
|
1月前
|
负载均衡 Serverless 持续交付
云端问道9期实践教学-省心省钱的云上Serverless高可用架构
详细介绍了云上Serverless高可用架构的一键部署流程
57 10
|
1月前
|
存储 人工智能 运维
面向AI的服务器计算软硬件架构实践和创新
阿里云在新一代通用计算服务器设计中,针对处理器核心数迅速增长(2024年超100核)、超多核心带来的业务和硬件挑战、网络IO与CPU性能增速不匹配、服务器物理机型复杂等问题,推出了磐久F系列通用计算服务器。该系列服务器采用单路设计减少爆炸半径,优化散热支持600瓦TDP,并实现CIPU节点比例灵活配比及部件模块化可插拔设计,提升运维效率和客户响应速度。此外,还介绍了面向AI的服务器架构挑战与软硬件结合创新,包括内存墙问题、板级工程能力挑战以及AI Infra 2.0服务器的开放架构特点。最后,探讨了大模型高效推理中的显存优化和量化压缩技术,旨在降低部署成本并提高系统效率。
|
2月前
|
运维 监控 安全
天财商龙:云上卓越架构治理实践
天财商龙成立于1998年,专注于为餐饮企业提供信息化解决方案,涵盖点餐、收银、供应链和会员系统等。自2013年起逐步实现业务上云,与阿里云合作至今已十年。通过采用阿里云的WA体系,公司在账号管理、安全保障、监控体系和成本管控等方面进行了全面优化,提升了业务稳定性与安全性,并实现了显著的成本节约。未来,公司将持续探索智能化和全球化发展,进一步提升餐饮行业的数字化水平。
|
4天前
|
开发者 CDN
阿里云CDN边缘脚本示例实现/?p123重定向/p/123.html
本文介绍了如何通过EdgeScript实现URL重定向,将`http://www.example.com/?p123`重定向到`http://www.example.com/p/123.html`。使用捕获请求URI中的参数并进行重写,具体代码和内置变量参考阿里云CDN开发者文档。示例代码展示了关键的实现步骤。
20 8
|
23天前
|
CDN
阿里云CDN收费标准,不同计费模式价格表(基础服务费和增值服务费用整理)
阿里云CDN的计费包括基础费用和增值费用。基础费用有三种计费方式:按流量、带宽峰值和月结95带宽峰值,默认按流量计费。增值服务如HTTPS、QUIC、WAF和实时日志等,使用才收费。详细价格和规则请参考阿里云官网。
84 12
|
23天前
|
CDN
阿里云CDN怎么收费?看这一篇就够了,CDN不同计费模式收费价格全解析
阿里云CDN的费用由基础费用和增值费用组成。基础费用有三种计费方式:按流量、按带宽峰值和月结95带宽峰值,默认为按流量计费,价格根据使用量阶梯递减。增值费用包括静态HTTPS请求、QUIC请求等,按实际使用量收费,不使用不收费。具体收费标准和详细规则可参考阿里云官方页面。

相关产品

  • 函数计算