Разработка
Одна строчка кода, которая стоила $8,000
Это привело к 9 миллионам загрузок файлов и более чем 2 петабайтам трафика на Google Cloud.
TLDR
Из-за ошибки приложение screen.studio (запись скринкастов для iOS и macOS) постоянно загружало файл автообновления, каждые 5 минут, для каждого пользователя. Файл обновления имеет размер около 250 МБ. Это привело к 9 миллионам загрузок файлов и более чем 2 петабайтам (2 000 000 гигабайт) трафика на Google Cloud.
![]()
Этот скриншот сначала может показаться не таким страшным, но взгляните на его масштаб. Больше месяца мы генерировали по меньшей мере 100 мегабит (в секунду!) и, временами, почти 1 гигабит трафика (каждую секунду!).
Этот баг был до боли простым и глупым.
Screen Studio — это десктопное приложение. Это значит, что нам нужен какой-то механизм автообновления, чтобы пользователи могли легко получать последнюю версию приложения.
Приложение проверяет наличие обновления каждые 5 минут или когда пользователь активирует приложение.
Обычно, когда приложение обнаруживает обновление, оно загружает его и останавливает интервал в 5 минут, пока пользователь не установит его и не перезапустит.
Трагический рефакторинг
Проблема с автообновлением заключалась в том, что оно предлагало пользователю обновить приложение, как только оно станет доступным. Это приводило к появлению всплывающего окна во время записи экрана, что, очевидно, вызывало неприятные ощущения, поскольку прерывало запись, которую делал пользователь.
Во время рефакторинга я забыл добавить код для остановки 5-минутного интервала после того, как файл новой версии стал доступен и загружен.
Это означало, что приложение загружало один и тот же файл размером 250 МБ снова и снова, каждые 5 минут.
Трагический контекст
Оказалось, что у тысяч наших пользователей приложение работало в фоновом режиме, хотя они не пользовались им и не проверяли его в течение нескольких недель (!). Это означало, что у тысяч пользователей постоянно работал модуль автообновления, который загружал файл новой версии (250 МБ) снова и снова каждые 5 минут.
Математика
Давайте проведем небольшие вычисления.
- Делать что-то каждые 5 минут означает делать это примерно 288 раз в день.
- Файл обновления составляет около 250 МБ, что означает 72 ГБ загрузок на пользователя ежедневно.
- Такая ситуация наблюдалась в течение месяца, прежде чем мы заметили ее.
- В любой момент в фоновом режиме у нас работало не менее тысячи таких приложений.
- 250 МБ * 288 загрузок в день * 30 дней * 1000 пользователей:
Это означает, что это было примерно:
- 2 000 000 гигабайт,
- или 2 000 терабайт
- или 2 петабайта трафика.
Серия плохих ошибок
У нас не было оповещения о расходах на Google Cloud. До того как возникла эта ситуация, мы платили не более 300 долларов в месяц.
Мы также не проверяли ситуацию регулярно, так как она просто работала.
Мы заметили это, когда моя кредитная карта начала блокировать транзакцию из-за лимитов, которые я на нее установил (повезло мне!).
![]()
Последствия для пользователей
Это было плохо не только для нас, но и для некоторых пользователей.
Как уже упоминалось, приложение генерировало очень много трафика. Это означает, что их компьютеры потребляли сетевой трафик на их домашнем маршрутизаторе и у их интернет-провайдера.
У одного из наших пользователей, который жил в своем доме, интернет-провайдер расторг контракт из-за огромного трафика, скачанного в течение месяца. Это стало большой проблемой, поскольку поблизости не было другого интернет-провайдера.
Мы решили взять на себя ответственность и предложили покрыть все расходы, связанные с этой ситуацией.
К счастью, это не понадобилось, так как человек смог разобраться в ситуации с провайдером без больших проблем.
Тем не менее, это был ужасный опыт для того человека и для меня. Как дизайнер, я ценю опыт, который созданный мной продукт доставляет пользователям. И это был даже не плохой опыт — фактически он был вредоносным.
Резюме
- Постоянно устанавливайте предупреждения для вашего облака.
- Очень тщательно пишите код автообновления.
- Вообще, тщательно пишите любой код, который потенциально может генерировать затраты.
- Добавьте специальные сигналы, которые вы можете изменить на своем сервере и которые будут понятны приложению, например, принудительное обновление, которое будет установлено без запроса пользователя.
- Регулярно проверяйте свое облако.
-
Разработка1 неделя назадДаем ИИ видеть SwiftUI: Xcode Preview MCP на практике — проблемы и надежды
-
Новости2 недели назадВидео и подкасты о мобильной разработке 2026.39
-
Новости3 недели назадВидео и подкасты о мобильной разработке 2026.38
-
Новости1 неделя назадВидео и подкасты о мобильной разработке 2026.40
