2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

从锁机制、负载饱和到 CDN 故障: Canva 宕机事故复盘

作者:Renato Losio

  • 2025-03-07
    北京
  • 本文字数:1682 字

    阅读完需:约 6 分钟

从锁机制、负载饱和到 CDN 故障: Canva 宕机事故复盘

Canva 工程团队最近发布了对去年 11 月宕机事件的事后分析报告,详细说明了 API 网关故障的情况以及在这次事件中汲取的教训。Canva 的首席技术官 Brendan Humphreys 承认:


“2024 年 11 月 12 日,Canva 遭遇了一次严重的宕机事故,影响了 canva.com 的正常访问。从 UTC 时间上午 9 点 08 分至大约 10 点,canva.com 都无法访问。此次事故是由我们的 API 网关集群故障导致的,多个因素共同作用引发了这一故障,包括 Canva 编辑器的一次软件部署、锁机制问题,以及我们的内容分发网络(CDN)提供商 Cloudflare 的网络问题。”


Canva 的编辑器是一个单页应用程序,每天会多次部署。客户端设备通过 Cloudflare 的分层缓存系统获取新资源。然而,CDN 提供商内部的一个路由问题扰乱了两个区域之间的流量。因此,当资源在 CDN 上可用时,所有客户端同时开始下载。这导致了流量的突然激增,超过 27 万个待处理请求同时进行。Humphreys 解释道:


“通常情况下,错误数量增加会使我们的金丝雀测试系统中止部署。但在这次事件中,由于请求没有完成,所以没有记录到错误。结果,超过 27 万用户对 JavaScript 文件的请求都在同一缓存流中等待。”



图注:Canva API 网关架构,来源:Canva 工程博客


爱彼迎(Airbnb)的软件工程师 Lorin Hochstein,同时也是《冲浪复杂性》(Surfing Complexity)博客的作者,将这次宕机事件描述为一个关于负载饱和和系统弹性的故事。Hochstein 强调:


“这次事件并非由新版本代码中的漏洞引发,甚至也不是由该版本代码中某些意外的突发行为导致的。虽然这次事件是由一次部署引发的,但与前一版本的代码变更并无关联。实际上,是客户端下载新版本后出现的系统行为导致了宕机。”


突然间,所有等待中的设备同时加载新的对象面板,导致 API 网关每秒收到超过 150 万个请求,流量激增幅度约为典型峰值负载的三倍。这股巨大的流量浪潮使负载均衡器变成了 “过载均衡器”,将原本健康的节点拖垮。Hochstein 补充道:


“这是一个典型的正反馈循环例子:出现故障的任务越多,健康节点接收的流量就越大,这些任务也就越有可能出现故障。”


由于自动缩放机制未能跟上流量变化,API 网关任务因内存耗尽开始出现故障,最终导致整个系统完全崩溃。为解决这一问题,Canva 团队试图手动增加容量,同时降低节点负载,但效果参差不齐。当在 CDN 层完全阻断流量后,情况才终于得到缓解。Humphreys 详细说道:


“UTC 时间上午 9 点 29 分,我们在 Cloudflare 上添加了一条临时防火墙规则,在 CDN 层阻断了所有流量。这阻止了任何流量到达 API 网关,使新任务能够启动,而不会被涌入的请求压垮。随后,我们将 canva.com 重定向到状态页面,以便让用户清楚地了解我们正在遭遇故障。”


接着 Canva 的工程师们逐步增加流量,大约 20 分钟后完全恢复了服务。在 HackerNews 热门讨论帖中,John Nagle 评论道:


“这个问题类似于电力公司所说的‘负载吸收’。停电后恢复供电时,许多设备在启动时会消耗更多电力。(……)因此,恢复电网供电要分区进行,而不是一次性全部恢复。”


虽然系统最初满足了所有功能需求,但自动化系统却加剧了问题的严重性。Hochstein 指出:


“这就需要事故响应人员调整系统行为,改变其运行方式,使系统恢复到正常状态。(……)这是系统弹性的一个经典案例,即在系统进入非设计运行状态时,采取行动重新配置其行为。”


Humphreys 在领英(LinkedIn)上总结道:


“在 Cloudflare 能力出众且乐于助人的合作伙伴协作下,我们花了一些时间才弄清楚事件全貌。(……)这是一个引人入胜的故事,涉及数据包丢失、缓存动态变化、流量激增、线程争用和任务余量等问题。”


为最大程度降低未来发生类似事件的可能性,该团队着重改进了事故响应流程,包括制定流量阻断和恢复的操作手册,以及增强 API 网关的弹性。


关于作者


Renato Losio,Renato 作为云架构师、技术主管和云服务专家,拥有丰富的经验。目前,他居住在柏林,担任首席云架构师开展远程工作。他主要感兴趣的领域包括云服务和关系型数据库。他是 InfoQ 的编辑,也是经过认证的 AWS Data Hero。


原文链接:


https://www.infoq.com/news/2025/02/canva-incident-report/

2025-03-07 15:0010225

评论

发布
暂无评论

golang 面试总结

yuexin_tech

golang 面试

火遍网络的KPI异常检测到底什么梗?

乌龟哥哥

2月月更

人手一个数字人还有多远?百度吴甜做客央视《对话》

百度大脑

优秀程序员的30种思维--行为准则篇(11/100)

hackstoic

你在央视春晚抢红包,京东云却在后台玩起了“剧本杀”

脑极体

Web Components 系列(二)—— 关于 Custom Elements

编程三昧

前端 组件化 2月月更

渗透测试之中间件漏洞复现

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

云效x钉钉:让研发工作更简单

阿里云云效

阿里云 云原生 钉钉 研发 云钉一体

关于大数据计算框架Flink内存管理的原理与实现总结 | 社区征文

张浩_house

大数据 flink 新春征文

如何用建木CI导入导出Redis数据

Jianmu

DevOps CI/CD Redis 数据结构

第八节:SpringBoot指定配置文件配置三

入门小站

Java

sql 学习笔记

孙青

第1章:初识数据库与MySQL----数据库基本概念

乌龟哥哥

MySQL 2月月更

Lazada D11 体验升级技术实践

阿里巴巴终端技术

ios android 客户端开发 移动端 体验优化

Moviepy+OpenCV-python结合进行音视频剪辑处理 | 社区征文

老猿Python

音视频 Moviepy 数字图像处理 新春征文 OpenCV-Python

奥运吉祥物——冰墩墩太难抢了,Python给你画一个

王小王-123

Python

王者荣耀商城异地多活架构设计

swallowluo

架构实战营 #架构实战营 「架构实战营」

读 Go 源码,可以试试这个工具

AlwaysBeta

Go golang 源码 源码解析 Go 语言

Go 语言入门很简单:技巧和窍门(Tips and Tricks)

宇宙之一粟

Go 语言 2月月更

面向推理训练一体化的 MNN 工作台

阿里巴巴终端技术

端智能

一文读懂 Serverless 的起源、发展和落地实践

Serverless Devs

2月月更

网易传媒Go语言探索

月读

golang 开源治理

恒源云(GPUSHARE)_社区大佬的论文小记(Flooding-X)

恒源云

深度学习 计算机视觉

辩论这件事,其实不止奇葩说

小鲸数据

零代码技能平台技术实践探索

OPPO小布助手

人工智能 低代码 零代码 智能助手 对话系统

推荐系统基础结构总结 | 社区征文

张浩_house

推荐系统 大数据开发 新春征文

监控治理有效性评价体系

焦振清

监控治理 评价体系

卷起来了!软件开发正在越来越快……

飞算JavaAI开发助手

金融云原生漫谈(七)|云原生时代:从传统运维到智能运维的进阶之路

York

容器 云原生 金融科技 智能运维

在线IEEE浮点二进制计算器工具

入门小站

工具

JVM进阶(十二):JAVA 可视化分析工具

No Silver Bullet

JVM 监控工具 2月月更

从锁机制、负载饱和到 CDN 故障: Canva 宕机事故复盘_AI&大模型_InfoQ精选文章