一行代码的代价:$8000 —— Screen Studio 的惨痛教训
一行代码是如何造成 $8,000 损失的
由于一个简单的 Bug,Screen Studio 应用产生了超过 2PB 的网络流量。
Adam Pietrasiak
TLDR (太长不看版)
由于一个 Bug,我们的屏幕录像应用 - screen.studio,不停地重复下载自动更新文件,每 5 分钟对每个用户执行一次。更新文件大约 250MB。这导致 900 万次文件下载和超过 2PB (2,000,000 GB) 的 Google Cloud 流量。
这张截图乍一看可能并不吓人,但请注意它的规模。在一个多月的时间里,我们产生了至少 100Mb/s(每秒!)的流量,有时甚至接近 1GB/s 的流量(每秒!)。
这个 Bug 非常简单,而且很愚蠢。
Screen Studio 是一个 macOS 屏幕录像工具。它是一个桌面应用,这意味着我们需要一些自动更新程序,以便用户可以轻松安装最新的应用版本。
应用每 5 分钟检查一次更新,或者在用户激活应用时检查。
通常,当应用检测到更新时,它会下载更新,并停止 5 分钟的间隔,直到用户安装并重启应用。
悲剧性的重构
我们遇到的自动更新程序的问题是,它会在更新可用时立即提示用户更新应用。这导致在用户录制屏幕时出现弹窗,这显然提供了糟糕的体验,因为它会中断用户的录制。
在重构时,我忘记添加在新的版本文件可用并下载后停止 5 分钟间隔的代码。
这意味着 应用会一遍又一遍地下载相同的 250MB 文件,每 5 分钟一次。
悲剧背景 - 应用在后台运行数周
事实证明,成千上万的用户在后台运行该应用,即使他们没有使用或检查它 数周(!)。这意味着成千上万的用户一直在运行自动更新程序,并一遍又一遍地下载新版本文件 (250MB),每 5 分钟一次。
数学计算
让我们做一些简单的数学计算。
-
每 5 分钟做一次意味着每天大约做 288 次。
-
更新文件约为 250 MB,这意味着 每个用户每天下载 72 GB。
-
我们遇到的这种情况持续了 一个多月才注意到。
-
我们至少有 一千个这样的应用实例 在任何时候都在后台运行。
-
250 MB * 每天 288 次下载 * 30 天 * 1000 用户:
这意味着大约是:
-
2 000 000 GB
-
或 2 000 TB
-
或 2 PB 的流量。
一系列糟糕的错误
我们没有在 Google Cloud 上设置成本警报。 在发生这种情况之前,我们每月最多支付 300 美元。
我们也没有定期检查情况,因为它只是在工作。
我们注意到它是因为我的信用卡开始阻止交易,因为我对其设置了限制(幸运的是!)。
对用户的影响
这不仅对我们不利,甚至对某些用户来说更糟。
如前所述,该应用产生了如此多的流量。 这意味着是他们的机器在他们的家庭路由器和他们的互联网提供商上产生网络流量。
我们的一位住在房子里的用户,由于一个月内产生了巨大的流量,他们的互联网提供商取消了他们的合同。 这是非常成问题的,因为周围没有其他互联网提供商可用。
我们决定承担责任,并承担与这种情况相关的所有费用。
幸运的是,没有必要,因为这个人可以解决与提供商的问题,而没有更大的问题。
然而,这对那个人和我来说都是非常糟糕的经历。 作为一名设计师,我重视我创建的产品为用户提供的体验。 而这甚至不是一次糟糕的经历; 实际上是有害的。
总结
-
始终在您的 Cloud 上 设置警报。
-
非常小心地编写您的自动更新程序代码。
-
实际上,小心编写任何可能产生费用的代码。
-
添加您可以在服务器上更改的特殊信号,该应用将理解这些信号,例如 强制更新,它将在不询问用户的情况下安装。
-
定期检查您的 Cloud。