Когда особенности инфраструктуры замедляют выкат фич...
Этот кейс может быть полезен как продактам, так и разработчикам.
Мы попали в ситуацию, когда выкат изменений в веб приложение стоит нам реальных денег, из-за чего мы стали делать изменения реже и консолидировать их.
У нас более 2 миллионов страниц и порядка миллиона изображений, которые постоянно скачивают LLM боты. Ботов мы не блокируем, так как с ChatGPT и Perplexity уже начали приходить люди. Они нам нужны. Это новое SEO.
Контекст:
-
В день на сайт приходит от 600к до 1М запросов от ботов, которые скачивают от 15 до 30 гигабайт данных. Мы хостимся на Vercel. Каждый миллион запросов стоит нам 60 центов, каждый гигабайт данных - ещё 6 центов + есть стоимость времени исполнения функций, которые мы толком не можем рассчитать, но они стоят ещё дороже.
-
В настоящий момент это не так дорого, но с ростом будет хуже. Мы сейчас на 2% от предполагаемой загрузки. Умножаем цифры на 50 и получаются увеситые счета за инфраструктуру, измеряемые в тысячах долларов.
-
Перед сайтом мы поставили Cloudflare, который бесплатно кэширует все запросы. Мы настроили агрессивный кэш так, что изображения кэшируются на год, остальные страницы на 90 дней.
Это всё прекрасно для стабильной системы, но наша система находится в постоянной разработке. Мы ещё не закончили.
И вот в чём загвоздка.
-
Изменения в оформлении страниц (когда меняется HTML или CSS) требуют полной очистки всего кэша кроме изображений.
-
При полной очистке кэша, все запросы идут на нашу (платную) инфраструктуру пока кэш не выстроится заново.
-
Мы не можем очистить "всё кроме изображений" по той причине, что мы сделали структуру папок как удобно нам, а не как нужно для Cloudflare. Поэтому приходится чистить в том числе и изображения, а это больше половины платного трафика на Vercel.
Поэтому последний месяц или около того мы играем в кошки-мышки с кэшем, что поменяло наши процессы (не в лучшую сторону) и сильно замедлило роадмап.
-
Моё время почти на 100% посвящено оптимизации кэша. Я выпилил обработку изображений из сайта в отдельный проект и почти его запустил. На это ушло 3 дня. Теперь мы сможем очищать кэш веб аппки, не трогая картинки. Это убирает половину костов.
-
Я запилил точечное удаление кэша для конкретных файлов, когда меняются данные. Например, когда подкаст обновил картинку, мы точечно удаляем кэш для этого конкретного файла через Cloudflare API. Таким образом, нам не нужно чистить весь кэш.
-
Сейчас я делаю большие изменения на сайте, затрагивающие брендинг и оформление страниц. Это всё происходит в одном пулл реквесте, чтобы не чистить кэш по несколько раз после каждого выката нового фукнционала.
Последнее меня напрягает больше всего. В идеале нужно выкатывать изменения небольшими инкрементами, у нас же в последнем обновлении изменение тысяч строк кода. Это повышает риск того, что что-то сломается при выкате и придётся фиксить это в мыле ночью.
Я пока что не вижу пути изменения этого процесса. Мы и дальше будем консолидировать функционал, чтобы выкатывать большие изменения за раз и чистить кэш как можно реже.
Чем больше будет масштаб, тем больнее это всё будет происходить. Возможно, придётся менять инфраструктуру, делать промежуточные кэши (например хранить HTML контента отдельно от веб аппки), генерить страницы оффлайн при каждом деплое и т.п.
Работая в каком-нибудь Амазоне, это всё было бы нормой. В стартапе это ощущается как камень на шее, который тянет нас ко дну. Радует только то, что это никак не влияет на работу Арнаба по разработке мобильного приложения.