Connect with us

Разработка

Одна строчка кода, которая стоила $8,000

Это привело к 9 миллионам загрузок файлов и более чем 2 петабайтам трафика на Google Cloud.

Фото аватара

Опубликовано

/

     
     

TLDR

Из-за ошибки приложение screen.studio (запись скринкастов для iOS и macOS) постоянно загружало файл автообновления, каждые 5 минут, для каждого пользователя. Файл обновления имеет размер около 250 МБ. Это привело к 9 миллионам загрузок файлов и более чем 2 петабайтам (2 000 000 гигабайт) трафика на Google Cloud.

Одна строчка кода, которая стоила $8,000

Этот скриншот сначала может показаться не таким страшным, но взгляните на его масштаб. Больше месяца мы генерировали по меньшей мере 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 долларов в месяц.

Мы также не проверяли ситуацию регулярно, так как она просто работала.

Мы заметили это, когда моя кредитная карта начала блокировать транзакцию из-за лимитов, которые я на нее установил (повезло мне!).

Одна строчка кода, которая стоила $8,000

Последствия для пользователей

Это было плохо не только для нас, но и для некоторых пользователей.

Как уже упоминалось, приложение генерировало очень много трафика. Это означает, что их компьютеры потребляли сетевой трафик на их домашнем маршрутизаторе и у их интернет-провайдера.

У одного из наших пользователей, который жил в своем доме, интернет-провайдер расторг контракт из-за огромного трафика, скачанного в течение месяца. Это стало большой проблемой, поскольку поблизости не было другого интернет-провайдера.

Мы решили взять на себя ответственность и предложили покрыть все расходы, связанные с этой ситуацией.

К счастью, это не понадобилось, так как человек смог разобраться в ситуации с провайдером без больших проблем.

Тем не менее, это был ужасный опыт для того человека и для меня. Как дизайнер, я ценю опыт, который созданный мной продукт доставляет пользователям. И это был даже не плохой опыт — фактически он был вредоносным.

Резюме

  • Постоянно устанавливайте предупреждения для вашего облака.
  • Очень тщательно пишите код автообновления.
  • Вообще, тщательно пишите любой код, который потенциально может генерировать затраты.
  • Добавьте специальные сигналы, которые вы можете изменить на своем сервере и которые будут понятны приложению, например, принудительное обновление, которое будет установлено без запроса пользователя.
  • Регулярно проверяйте свое облако.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Наши партнеры:

LEGALBET

Мобильные приложения для ставок на спорт
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: