Наша почта:
В Москве:
РФ (звонок бесплатный):
Как грабли растут вместе с компанией
{ Основатель и руководитель консалтинговой компании в fournines.ru }
Владимир Федорков

Видео доклада

Презентация спикера

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

Как выглядят грабли сбоку

Если построить график, где по горизонтали — количество запросов в секунду (в тысячах), а по вертикали — latency, картина будет одинаковой почти для любой системы. Пример ниже снят на одной машине с 48 ядрами, но принципиально ничего не меняется, если машин несколько, если есть кластер или даже много кластеров. График тот же, отличаются только цифры.

Пока система не упирается в ядра, всё работает быстро: нагрузка распределяется по ядрам и по нодам кластера. Затем latency — время ответа на запрос пользователя — начинает расти. Сначала потихоньку, потом сильнее, потом ещё сильнее — до момента, когда с точки зрения пользователя система перестаёт работать вообще. Формально она отвечает, но отвечает так долго, что смысла в этом уже нет.

Одновременно растёт и пропускная способность: какое-то время система продолжает обрабатывать всё больше запросов в секунду, несмотря на растущую latency. А потом этот запас заканчивается.
Отсюда две ключевые точки, характерные для любого продакшена:
  • Точка насыщения
    момент, когда входящие запросы обрабатываются уже за счёт увеличивающейся latency;
  • Точка отказа
    момент, когда с точки зрения пользователя сервис перестал работать.

Что находится внутри «квадратика»

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

Воркер — это не абстракция, а HTTP-сервер и код на Go, PHP или Rust. Под ним — операционная система, база данных и десятки компонентов, которые в рамках одного доклада даже перечислить нельзя. И всё это исполняется на конкретных ресурсах: CPU, RAM, диск, сеть.

Внутри каждого ресурса — свой мир. Ядра, hyper-threading, context switching, NUMA-архитектура. В дисковой подсистеме — RAID с батарейкой и без, SSD, NVMe, а где-то до сих пор и шпиндели. Сеть — отдельная дисциплина со своей глубиной.

Все эти зависимости перекликаются между собой и периодически мешают друг другу работать. Задача получается совсем нетривиальной — поэтому и нужен мониторинг.

Три уровня мониторинга

Мониторинг нужен для того, чтобы понять, в какой момент начинаются проблемы — желательно до того, как они начнутся. Условно он делится на три уровня.
Инфраструктурный.
С него всегда всё начинается: команда эксплуатации умеет мониторить инфраструктуру, шаблонов множество, развернуть легко. Логика простая: если CPU не взорвался и место не закончилось — наверное, всё нормально.
Сервисные метрики.
Ими всё заканчивается, потому что делаются они в последний момент: это сложно и на первый взгляд никому не нужно.
Бизнесовые метрики.
По идее, именно с них всё должно начинаться — они самые важные. На практике они появляются тогда, когда продакшен уже падает и бизнес видит, что теряет деньги.
Здесь напрашивается аналогия с бухгалтерией: сначала проводим транзакции, а в конце месяца смотрим, что получилось. Продакшен очень часто работает ровно так же — сначала делаем, потом смотрим.
Отдельно стоит выделить два инструмента:
  • End-to-end тесты
    показывают, проходят ли вообще единичные транзакции. Если транзакция не прошла в end-to-end тесте — продакшена, скорее всего, уже нет.
  • Метрика ошибок как показатель качества.
    End-to-end тест раз в секунду может проходить успешно, но за ту же секунду из ста реальных запросов девяносто девять могут упасть. Об этом хотелось бы знать.

Стадии развития продукта

Нагрузка не приходит сразу. Продукт проходит через несколько стадий: MVP → начальный рост → масштабирование → сокращение и оптимизация → следующий виток (новый MVP) или вывод сервиса из эксплуатации.
MVP
Быстрый старт, простой прототип, тестовая группа пользователей. Интересна ли на этом этапе стабильность? Разумеется, нет: если MVP упал — ничего страшного.
Но бывают исключения. Известен случай, когда команда сделала MVP, показала бизнесу, получила одобрение — и на две недели пропала обратная связь. MVP выключили. Через пять минут позвонил бизнес: «У нас ничего не работает». Оказалось, прототип поставили в продакшен как есть — сырым, без мониторинга — и пользователи уже вовсю им пользовались. Так делать не стоит.
Существует и отдельный класс MVP для нагруженных проектов, где кластеризация и масштабирование закладываются сразу. Но это уже другая история.
Начальный рост
Появляются пользователи, которых никто не звал. Вместе с ними появляется требование к доступности: пользователь хочет получить сервис, когда придёт.
И появляется эксплуатация — люди, ответственные за работу чужого кода на чужом железе. Ничего из этого не их, ничего из этого они не делали, но отвечают за это они. Обычно это один человек, реже — команда, если компания растёт быстро.
На горизонте начинают маячить нефункциональные требования: сколько пользователей нужно обслужить в единицу времени, не упав при этом, и как быстро отдавать страницы. Если сервис обслуживает сто пользователей в секунду, но первый байт приходит через две минуты, такой сервис никому не нужен — разве что это специфический сервис отчётов.
Есть и третья метрика: сколько можно полежать. Две минуты обычно может позволить себе любой. А вот десять минут — уже далеко не все: заметит бизнес, заметят пользователи, начнутся жалобы. Круг замыкается.

Масштабирование
Пользователей всё больше, данные растут, релизы новой функциональности летят пачками — компания растёт. Падение продакшена в этот момент становится очень дорогим, потому что бизнес хочет денег. ИТ существует не само по себе: бизнес платит зарплату и ставит задачи именно ради заработка.
Как понять, что этап масштабирования наступил? Формально — нефункциональные требования начинают превалировать над функциональными. Практический критерий проще: если релиз сломал продакшен, его никто не откатывает — его идут дебажить прямо на проде. Смотрят, что упало, что не упало, докручивают на месте. Если так происходит — нагрузка уже есть.
Нагрузка ли виновата?
Важно отличать проблемы роста от проблем компании как таковой. Есть несколько маркеров:
  • Количество инцидентов и его рост.
    Если падения происходят каждую пятницу — дело, скорее всего, не в нагрузке, а в привычке выкатывать релиз в пятницу.
  • Потерянные деньги и репутация.
    Если репутация летит вниз, а всех это устраивает, проблема не в нагрузке, а в том, как с ней работают.
  • Количество не высыпающихся инженеров — на протяжении года.
    Оговорка про год существенна: когда компания растёт, руководству нужно время, чтобы нанять людей. Нельзя выйти на рынок и мгновенно закрыть три команды. Если в компании из пятидесяти человек нанять сразу ещё пятьдесят, работа встанет полностью. Поэтому какое-то время приходится не высыпаться — это, к сожалению, нормальная история. Ненормально, когда это длится годами.
Сокращение и оптимизация
Задача снижения стоимости и резки косты — актуальная повестка буквально сегодня, и не только в России. Денег мало, работать нужно в ограниченных ресурсах.
По сути это те же самые проблемы роста, только наоборот: нужно запихнуть нагрузку в те рамки, которые можно позволить себе финансово. Финансы — это не только железо, но и софт: его тоже приходится оптимизировать и переделывать.
В благословенные годы с нулевых по 2016–2017 большинство проблем решались деньгами: закупить железо, поставить в продакшен, продакшен вырастал — и оптимизации становились неинтересны. Фреймворк на пять гигабайт ради одной странички? Ничего страшного, интернет быстрый. Сейчас это перестаёт работать: задача — уложить работающий продакшен в заданный объём финансирования. Это хорошая инженерная задача.
Проблема в том, что цена изменений велика:
  • Меньший запас по нагрузке.
    Кластер из двадцати нод при потере одной ноды теряет одну двадцатую мощности. Кластер из двух нод — половину.
  • Меньший запас по устойчивости.
    Если кластер обрезается вдвое, вдвое падает и устойчивость. Иногда кластер сокращают до единственного экземпляра — и получают single point of failure со всеми последствиями.
План работ при даунсайзе принципиально такой же, как при росте нагрузки. Главное — заранее посчитать риски: посмотреть метрики, определить требуемый уровень отказоустойчивости, оценить бюджет и варианты. И помнить про классический треугольник: дёшево, быстро, качественно — выбрать можно не всё.

Инженерная культура

Инженерная культура — вещь эфемерная, но именно она определяет, во что превратится продакшен под нагрузкой. Её признаки:
  • решаются задачи, которые нужно решать, и не решаются те, которые решать не нужно;
  • вещи называются своими именами: если упали — значит упали, а не «наблюдался отрицательный рост положительного количества инцидентов»;
  • гипотезы обосновываются технически и проверяются технически — а не выдвигаются наугад с последующей выкаткой в продакшен;
  • решения имеют понятные инженерные метрики.
Казалось бы, куда проще. Но на практике мешают личные стремления, вступающие в конфликт с целями компании:
  • вместо того, что работает, выбирается хайповая технология — «интересно попробовать за счёт работодателя»;
  • резюме прокачивается вместо решения задачи, потому что работу искать через год, а работодатель подождёт;
  • позиция «за такую зарплату хорошо, если я не буду вредить» — вопрос, зачем при таком отношении вообще работать в этом месте.
Всё это менеджмент должен видеть и убирать. Хуже, когда проблема в самом менеджменте: «у меня KPI, закрываем глаза, фигачим, а в следующем квартале разберёмся». Или когда за счёт компании решаются личные проблемы — человек получает метлу и двух помощников и начинает показывать, как делаются дела.

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

Почему стабильность — задача бизнеса

Даже когда бизнес чётко понимает, чего хочет, он может нанять яркого менеджера — обычно знакомого или человека, который где-то себя проявил. Здесь работает известный эффект: выбирают не тех, у кого всё работает (это скучные люди), а тех, кто героически преодолевает трудности. О таких пишут книги и посты, хотя достаточно было сразу сделать так, чтобы всё работало.

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

Позитивный пример из практики. Небольшая компания спросила: «А может, нам нужен Kubernetes?» Ответ был примерно такой: конечно, нужен. Причём собственный, а не managed — значит, сразу отдельная команда на поддержку, ФОТ ×2. Функционально он не нужен, зато технология хайповая: следующие два года — сплошные KPI и победы, продакшен за это время слегка деградирует, и года через два, возможно, вернётся к исходной точке. Kubernetes изначально делался Google под собственные задачи, и далеко не все компании такие же большие, как Google. Некоторые компании не имеют даже трёх дата-центров. С двумя дата-центрами справится любой — сложность начинается на тридцати. Компания подумала и решила: пока справляемся без Kubernetes. С адекватными людьми приятно работать.

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

Нагрузка — не самая большая проблема

Когда компания растёт, идёт активный найм, и существующие связи рвутся.
Люди, которые несколько лет пилили в надежде на повышение, его не получают: на новый уровень проблематики берут человека, компетентного именно в этом уровне. А каждый следующий этап — это по факту новая компания с новыми проблемами. Отсюда уходы и разочарования.
Ломаются коммуникации. Если на этапе MVP или раннего роста три-четыре человека решали любой вопрос за чашкой кофе, то при десяти командах за чашкой кофе можно только выпить кофе. Нужны другие коммуникации — старые не работают, качество проседает.
Смена парадигмы компании сама по себе становится проблемой. Люди стремились к поставленным целям, достигли их — а потом всё поменялось, и возникает ощущение, что старались зря. Не зря: компания просто прошла очередной уровень, и теперь нужно решать другие задачи. Раньше писали красивые пользовательские сценарии — теперь важнее не упасть. Фокус сместился, ценности изменились, и это рождает разочарование. Результат — текучка. Приходят новые люди, смотрят на код предшественников и говорят, что с этим работать невозможно. А тем, для кого система была родной, она уже не нужна — они ушли.
Финал
У ИТ должна быть стратегия. Если есть ИТ и нет стратегии — есть проблемы. Стратегия «мы сейчас пойдём и всё хорошо сделаем» не работает. Нужно понимать, как будет расти продакшен, как компания будет работать со стабильностью и какие решения в каком направлении принимать.
Стратегию должны знать не только в бизнесе, но и люди в командах. Разработка стратегии — задача CTO. Если CTO в большой компании сидит и пишет код, он, скорее всего, занимается не своим делом.
Стратегия может меняться. Ландшафт меняется буквально за ночь, и это нормально — это даёт новые возможности. Но изменения нужно объяснять сотрудникам. Не нужно изобретать заново. Никто не первый, кто строит ИТ-компанию, работает с нагрузками или делает сложную систему. Если речь не о научно-практических решениях, а об инженерных — дорожка проторена. Значит: планировать, планировать и ещё раз планировать.
В Москве:
РФ (звонок бесплатный):
Наша почта:
GetNet
Остались вопросы?
Группа компаний VoxLink © 2011-2026