Разработка
Одна строчка кода, которая стоила $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 месяц назад
Lua – идеальный встраиваемый язык
-
Новости1 месяц назад
Poolside, занимающийся ИИ-программированием, привлек $500 млн
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.40
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.41