Ваше приложение на ИИ попало в подборку. Переживёт ли оно наплыв трафика?

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

Представьте хорошую версию плохого дня. Вы выложили своё приложение на ИИ в сообществе, где состоите, или кто-то с большой аудиторией попробовал его и поделился, или оно попало на главную страницу форума, куда вы его даже не отправляли. Внезапно привычный ручеёк посетителей превращается в поток. Тысяча человек, и все кликают по сайту в один и тот же час.

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

Хорошая новость: пережить всплеск трафика — это в основном про горстку скучных решений, которые можно принять до того, как всплеск случится. Не нужно быть инженером. Нужно знать, на чём не стоит экономить.

Что на самом деле ломается, когда трафик подскакивает

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

База данных перегружается. Каждый раз, когда кто-то открывает страницу, ваше приложение обычно задаёт базе данных вопрос: «какие данные у этого пользователя?» Один человек спрашивает — это пустяк. Тысяча человек, задающих один и тот же вопрос за одну минуту, накапливаются быстрее, чем база успевает отвечать, и у всех страница начинает еле ползти.

Что-то за пределами вашего приложения тормозит. Большинство приложений на ИИ опираются на сторонние сервисы — отправку почты, обработку платежей, обращение к модели ИИ. Эти сервисы часто ограничивают, как быстро к ним можно обращаться. При обычном трафике вы этого предела никогда не замечаете. При всплеске приложение в него упирается — и вдруг любое действие, затрагивающее этот сервис, зависает.

Приложение снова и снова делает одну и ту же тяжёлую работу. Если ваша главная страница каждый раз при заходе выполняет тяжёлый расчёт — берёт список, ранжирует его, форматирует, — это нормально для десяти посетителей и убийственно для тысячи. Эта работа всегда была расточительной. Низкий трафик просто это скрывал.

Обратите внимание на закономерность: ничего из этого не новые баги. Всплеск ничего не сломал. Он выявил слабые места, которые уже были и тихо сидели под низким трафиком.

Самое дешёвое решение: кэшируйте то, что не меняется

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

Ваша главная страница, скорее всего, выглядит одинаково для всех 1000 человек, которые на неё заходят. Так зачем просить базу данных пересобирать её 1000 раз? Соберите её один раз, сохраните результат на несколько минут и отдавайте эту сохранённую копию всем. Вы только что превратили тысячу затратных обращений к базе в одно.

Так и скажите своему ИИ-конструктору: «Кэшируй главную страницу и публичный список товаров на пять минут, чтобы мы не обращались к базе данных на каждом заходе». Всё, что одинаково для всех и не обязано быть актуальным до секунды, — страница с ценами, публичный каталог, индекс блога — кандидат на кэширование. Персональные вещи (личный дашборд пользователя, его настройки аккаунта) так же кэшировать нельзя, но во время всплеска это обычно небольшая доля трафика. Большинство людей смотрят на одни и те же несколько публичных страниц.

Не заставляйте людей ждать того, что может произойти позже

Вот ошибка, которую легко допустить и легко исправить. Допустим, кто-то регистрируется, и приложение отправляет ему приветственное письмо. Если приложение заставляет пользователя ждать на странице регистрации, пока письмо полностью отправится, то медленный почтовый сервис делает медленной и саму регистрацию — ровно в тот момент, когда регистрируется больше всего людей.

Решение — позволить медленным вещам происходить в фоне. Человек мгновенно видит «Готово, вы в деле!», а письмо уходит парой секунд позже, и никто его не ждёт. Итог тот же, но посетитель не смотрит на крутящийся индикатор, пока почтовый сервер за три компании отсюда не спеша делает своё дело.

Попросите конструктор: «Отправляй приветственное письмо в фоне, чтобы регистрация его не дожидалась». Та же логика применима ко всему, что не обязано завершиться, прежде чем человек сможет двигаться дальше, — генерация отчёта, синхронизация с другим инструментом, отправка уведомления. Если результат не нужен пользователю прямо сейчас, не заставляйте его ждать.

Имейте план на случай «слишком много людей»

Иногда всплеск оказывается больше всего, к чему вы готовились, и честный ход — деградировать изящно, а не рушиться. Медленное приложение, которое всё ещё работает, лучше сломанного.

Несколько простых вариантов этого:

  • Дружелюбное сообщение об ожидании. Если что-то действительно перегружено, надпись «Сейчас у нас очень много посетителей — подождите немного» гораздо лучше пустого экрана или сырой ошибки. Загруженное приложение людям простительно. Сломанное — нет.
  • Временно отключите самую тяжёлую функцию. Если одна функция самая затратная — скажем, генерация на ИИ, которая стоит реальных денег и времени за каждый клик, — вы можете спрятать её на время наплыва и оставить остальное приложение быстрым. Большинство посетителей во время всплеска и так просто просматривают, а не используют вашу самую требовательную функцию.
  • Знайте, откуда берётся ваш счёт. Если приложение обращается к платной модели ИИ при каждом заходе, тысяча посетителей может обернуться не только медленной страницей, но и неожиданным счётом. Зная, какие действия стоят денег, вы сможете заранее решить, что ограничить.

Тридцатиминутная генеральная репетиция

Чтобы найти слабые места, не нужны навороченные инструменты. Нужно несколько друзей и полчаса.

Попросите пять-шесть человек открыть приложение в один и тот же момент и пару минут активно по нему кликать — зарегистрироваться, использовать главную функцию, загрузить нагруженные страницы. Это грубо, но быстро вытаскивает очевидные проблемы наружу. Если приложение уже ощущается вялым под шестью людьми, тысяча его раздавит. Если оно остаётся бодрым, вы хотя бы прошли минимальную планку.

Пока они кликают, следите, какая страница ощущается самой медленной. Эта медленная страница — ровно то место, где настоящий всплеск трафика ударит больнее всего, и именно её стоит кэшировать или упрощать в первую очередь. Вы не пытаетесь сымитировать тысячу пользователей. Вы пытаетесь найти ту одну страницу, которой уже тяжело при шести.

Настоящая цель

Сделать приложение бесконечно неуязвимым нельзя, да и не нужно. Цель не в том, чтобы безупречно выдержать десять тысяч человек в первый же вирусный момент. Цель — не опозориться перед той парой сотен, что наконец пришла, — позаботиться о том, чтобы люди, которых вы так старались привлечь, получили работающее приложение, а не крутящееся колёсико.

Кэшируйте страницы, которые не меняются. Уносите медленные вещи в фон. Имейте план на случай «слишком много людей». Проведите генеральную репетицию с пятью друзьями, прежде чем она вам понадобится. Ничего из этого не требует писать код самому — нужно лишь знать, о чём попросить свой ИИ-конструктор.

И тогда, когда придёт ваш момент, вы сможете им насладиться, а не лихорадочно его отлаживать. Так что вот вопрос, над которым стоит подумать на этой неделе: если завтра придёт тысяча человек, какая страница сломается первой — и знаете ли вы это уже сейчас?