一行代码是如何造成 $8,000 损失的

由于一个简单的 Bug,Screen Studio 应用产生了超过 2PB 的网络流量。

profile photo Adam Pietrasiak

TLDR (太长不看版)

由于一个 Bug,我们的屏幕录像应用 - screen.studio,不停地重复下载自动更新文件,每 5 分钟对每个用户执行一次。更新文件大约 250MB。这导致 900 万次文件下载和超过 2PB (2,000,000 GB) 的 Google Cloud 流量。

Image without caption

这张截图乍一看可能并不吓人,但请注意它的规模。在一个多月的时间里,我们产生了至少 100Mb/s(每秒!)的流量,有时甚至接近 1GB/s 的流量(每秒!)。

这个 Bug 非常简单,而且很愚蠢。

Screen Studio 是一个 macOS 屏幕录像工具。它是一个桌面应用,这意味着我们需要一些自动更新程序,以便用户可以轻松安装最新的应用版本。

应用每 5 分钟检查一次更新,或者在用户激活应用时检查。

通常,当应用检测到更新时,它会下载更新,并停止 5 分钟的间隔,直到用户安装并重启应用。

悲剧性的重构

我们遇到的自动更新程序的问题是,它会在更新可用时立即提示用户更新应用。这导致在用户录制屏幕时出现弹窗,这显然提供了糟糕的体验,因为它会中断用户的录制。

在重构时,我忘记添加在新的版本文件可用并下载后停止 5 分钟间隔的代码。

这意味着 应用会一遍又一遍地下载相同的 250MB 文件,每 5 分钟一次。

悲剧背景 - 应用在后台运行数周

事实证明,成千上万的用户在后台运行该应用,即使他们没有使用或检查它 数周(!)。这意味着成千上万的用户一直在运行自动更新程序,并一遍又一遍地下载新版本文件 (250MB),每 5 分钟一次。

数学计算

让我们做一些简单的数学计算。

Image without caption

这意味着大约是:

一系列糟糕的错误

我们没有在 Google Cloud 上设置成本警报。 在发生这种情况之前,我们每月最多支付 300 美元。

我们也没有定期检查情况,因为它只是在工作。

我们注意到它是因为我的信用卡开始阻止交易,因为我对其设置了限制(幸运的是!)。

Image without caption

对用户的影响

这不仅对我们不利,甚至对某些用户来说更糟。

如前所述,该应用产生了如此多的流量。 这意味着是他们的机器在他们的家庭路由器和他们的互联网提供商上产生网络流量。

我们的一位住在房子里的用户,由于一个月内产生了巨大的流量,他们的互联网提供商取消了他们的合同。 这是非常成问题的,因为周围没有其他互联网提供商可用。

我们决定承担责任,并承担与这种情况相关的所有费用。

幸运的是,没有必要,因为这个人可以解决与提供商的问题,而没有更大的问题。

然而,这对那个人和我来说都是非常糟糕的经历。 作为一名设计师,我重视我创建的产品为用户提供的体验。 而这甚至不是一次糟糕的经历; 实际上是有害的。

总结