Site icon AppTractor

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

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 минут.

Математика

Давайте проведем небольшие вычисления.

Это означает, что это было примерно:

Серия плохих ошибок

У нас не было оповещения о расходах на Google Cloud. До того как возникла эта ситуация, мы платили не более 300 долларов в месяц.

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

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

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

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

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

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

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

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

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

Резюме

Источник

Exit mobile version