Как устроены большие сервисы — и как строить их с нейросетями
Базовая грамотность архитектора на одной странице. Разобрано на твоём маркетплейсе: что в нём уже есть, чего нет и в каком порядке это достраивать.
Как читать
Правило этой школы: каждое утверждение помечено, откуда оно. Мнение нейросети фактом не считается — в том числе моё.
Новые слова выделены жирным, рядом в скобках — английский термин: под ним это слово живёт в документации и в ответах нейросети. Все термины собраны в словаре.
1С чего начинается архитектура
Архитектура — это не схема из квадратиков. Это список решений, которые дорого менять потом: где лежат данные, что случится при отказе, как ходят деньги, от кого мы зависим. Кнопку можно перекрасить за час. Способ хранения заказов меняют месяцами.
Архитектор не рисует систему, которая «выдержит всё». Он отвечает на четыре вопроса — цифрами.
- Что сломается первым? У любой системы есть самое узкое место (bottleneck). Его надо знать заранее, а не узнать из жалобы.
- При какой цифре? «Когда вырастем» — не ответ. «При 40 запросах в секунду к одной копии сервера» — ответ.
- Сколько стоит поломка? Витрина лежит час — потеряны продажи за час. Потеряны деньги покупателя или база заказов — потеряно доверие, это дороже на порядки.
- Что самое дешёвое можно сделать сейчас, чтобы поломка стала переносимой?
Не строят «на вырост». Строят так, чтобы потолок был известен, измерен и у него был заранее записанный триггер замены — цифра, при которой деталь меняют.
Второе, что отличает профессионала: он знает, что бесплатных решений нет. Каждый новый механизм — кэш, очередь, копия базы — это ещё одна деталь, которая может сломаться и которую надо обслуживать. Поэтому хороший архитектор добавляет детали неохотно и только под цифру.
2Прикидка на салфетке
Первый навык — быстро перевести бизнес-цель в нагрузку. Нагрузку меряют в запросах в секунду (RPS) и всегда считают пик, а не среднее: система падает в пике.
Цель «300 000 покупок в месяц». Допущения грубые, важен порядок величин.
| Шаг | Расчёт | Итог |
|---|---|---|
| Заказы | 300 000 в месяц | ≈ 10 000 в день |
| Запись заказа | 10 000 / 86 400 секунд, пик ×10 | 1–2 заказа в секунду в пике |
| Визиты | покупает 1,5 % зашедших | ≈ 670 000 визитов в день |
| Просмотры | 8 страниц на визит | ≈ 5,3 млн в день, ≈ 60 в секунду |
| Запросы к серверу | пик ×4, по 4 запроса на страницу | ≈ 1 000 запросов чтения в секунду в пике |
Посмотри на две жирные цифры. Заказов — один-два в секунду. Запросов чтения — тысяча. Разница в 500–1 000 раз. Из неё следует всё остальное.
3Две задачи: чтение и деньги
Тонкая полоска справа — деньги и заказы.
Чтение: каталог, поиск, карточка
Почти вся нагрузка. Важна пропускная способность. Лечится кэшем, сетью доставки, копиями сервера, поисковым движком.
Ошибка стоит дёшево: страница открылась на секунду позже.
Деньги и заказы
Доли процента нагрузки. Одной базы хватает на годы. Важна не скорость, а невозможность ошибки: не списать дважды, не продать то, чего нет, не потерять платёж.
Ошибка стоит дорого.
Большинство провалов «высоконагруженных» проектов — от того, что эти две задачи путают: усложняют деньги ради скорости, которой там не нужно, и забывают про кэш там, где нагрузка настоящая.
4Путь одного запроса
Человек открыл карточку товара. Вот через что проходит его запрос в большой системе. Практика отрасли
| Слой | Как растёт | Что мешает расти |
|---|---|---|
| 1. Сеть доставки | Сама — это арендованная услуга | Страницы с личными данными кэшировать нельзя. Поэтому витрину делают одинаковой для всех, а личное подгружают отдельно |
| 2–3. Приложение | Добавлением копий, почти линейно | Копия не должна ничего помнить о человеке между запросами |
| 4. Быстрая память | Разделением по ролям | Когда в одном экземпляре лежит и то, что терять нельзя (очереди), и то, что можно (кэш) |
| 5. Фон | Числом работников | Задача должна переносить повтор: её могут доставить дважды |
| 6. База | Труднее всего | Здесь живёт состояние, его нельзя просто «скопировать» |
| 7. Спецхранилища | Каждое по-своему | Данные надо держать в согласии с базой |
5Три рычага. Других нет
Когда системе не хватает мощности, способов ровно три, и применяют их в таком порядке.
- Не делать работу. Ответ, который считали минуту назад, отдать готовым. Это кэш. Самый дешёвый рычаг: хороший кэш снимает 80–95 % нагрузки чтения.
- Делать работу дешевле. Найти, на что уходит время одного запроса, и убрать лишнее: лишний поход в базу, тяжёлый расчёт, отсутствующий индекс.
- Добавить работников. Поставить больше одинаковых копий сервера.
Ошибка новичка — начинать с третьего: купить десять серверов, чтобы десять раз выполнять работу, которую можно было не делать вовсе.
Третий рычаг бывает двух видов. Вверх (vertical scaling) — машина мощнее: просто, но у железа есть потолок. Вширь (horizontal scaling) — больше машин: потолка почти нет, но система должна это уметь.
6Состояние — главное слово
Состояние (state) — всё, что система обязана помнить: заказы, остатки, кто вошёл, что лежит в корзине.
Представь магазин. Кассиры ничего не помнят сами — всё записано в одной общей книге. Нужен ещё кассир — ставишь, и он сразу работает: любой кассир обслужит любого покупателя. Это копия приложения без состояния (stateless). А книга одна. Её нельзя просто размножить: если две книги разойдутся, непонятно, какой верить. Это база данных.
Всё, что не хранит состояние, масштабируется деньгами. Всё, что хранит, — инженерией. Архитектор всю жизнь занят одним: выдавливает состояние из слоёв, где оно не нужно, и бережёт те немногие места, где оно обязано быть.
Приложение умеет работать несколькими копиями (число копий — настройка) и не хранит ничего своего; перезапуск по одной копии без ошибок проверен замером команды на двух копиях. Это главный задел под рост, и он сделан. По документам
7Кэш: рычаг номер один
Кэш (cache) — место, где лежит готовый ответ, чтобы не считать его заново. Кэшей несколько, они стоят слоями:
- в браузере и приложении — картинка, которую телефон уже скачал;
- в сети доставки — готовая страница каталога на сервере рядом с человеком;
- в быстрой памяти — результат тяжёлого запроса к базе;
- в самой базе — заранее посчитанные таблицы, например счётчики по дням.
Качество кэша меряют долей попаданий (cache hit rate): сколько запросов из ста получили готовый ответ. 90 % попаданий — значит, до сервера доходит каждый десятый запрос.
Цена кэша одна: ответ может устареть. Человек видит «в наличии», а товар купили минуту назад. С этим борются двумя способами: сроком жизни записи (TTL — «через 60 секунд спроси заново») и сбросом при изменении (invalidation — «товар изменился, выбрось старое»). Второе точнее и заметно сложнее.
Кэшировать можно
То, что одинаково для всех и может отстать на минуту: каталог, карточку, фото, список категорий.
Кэшировать нельзя
Остаток в момент оформления заказа, баланс, корзину, всё личное. Здесь нужен только свежий ответ из базы.
8База данных
База — это книга учёта, которая не врёт. Четыре слова, без которых её не понять:
- Транзакция (transaction) — несколько изменений как одно: либо записались все, либо ни одного. Списать остаток и создать заказ — одна транзакция. Не бывает «остаток списан, заказа нет».
- Индекс (index) — оглавление к таблице. С ним база находит строку сразу, без него читает всё подряд. Отсутствующий индекс — самая частая причина «вдруг стало медленно».
- Блокировка (lock) — пока один покупатель оформляет последнюю штуку, второй ждёт. Так не продают один товар дважды.
- Миграция (migration) — изменение устройства таблиц. На живой системе её делают в три шага: добавили новое, перевели на него код, убрали старое. Иначе во время выкатки одна версия кода не поймёт таблицы другой.
Лестница базы
Базу масштабируют последней, и ступени обычно идут в таком порядке. Каждая следующая заметно дороже предыдущей. Практика отрасли
| № | Что делают | Что это даёт и чем платят |
|---|---|---|
| 1 | Машина мощнее | Одна база на хорошем железе держит тысячи записей в секунду. Заказов у маркетплейса — 1–2 в секунду. Этой ступени хватает надолго |
| 2 | Посредник соединений (connection pooler) | Сотни копий приложения делят несколько десятков соединений с базой. Без него число копий упирается в лимит соединений |
| 3 | Читающие копии (read replica) | Чтение каталога уходит на копии, главная занята записью. Плата: копия отстаёт на доли секунды, и человек может не увидеть то, что сам только что записал |
| 4 | Вынести чужую работу | Поиск — в поисковый движок, отчёты — в отдельное хранилище, файлы — в объектное. База остаётся для заказов и денег |
| 5 | Нарезать большие таблицы по времени (partitioning) | Старые месяцы лежат отдельно и не мешают свежим; удаление старого — мгновенное |
| 6 | Разделить базу на части (sharding) | Последний шаг: когда одна главная копия не справляется с записью или закон требует хранить данные страны внутри страны |
9Очереди и фоновая работа
Человек нажал «оформить». Ему нужен ответ «заказ принят» за полсекунды. А письмо продавцу, уведомление, пересчёт статистики могут подождать. Такую работу кладут в очередь (queue), и её разбирают работники (workers) — отдельные процессы.
Очередь даёт три вещи: быстрый ответ человеку, сглаживание пиков (в распродажу очередь растёт, но ничего не падает) и повтор при сбое.
За это платят одним неприятным свойством. Сеть ненадёжна: работник мог выполнить задачу и не успеть об этом сообщить. Очередь не знает, сделано или нет, и отдаёт задачу ещё раз. Доставки «ровно один раз» в природе нет. Есть «хотя бы один раз» (at-least-once).
Любая задача должна быть идемпотентной (idempotent): выполнил второй раз — ничего не изменилось. «Списать 500 рублей» — опасно. «Списать 500 рублей по операции №123, если ещё не списано» — безопасно.
- Повтор с паузой (retry with backoff) — не получилось, пробуем через 1, 5, 30 секунд, а не долбим без остановки.
- Очередь неудачников (dead letter queue) — задача упала десять раз и уходит в отдельный список, который смотрит человек. Иначе она молча пропадёт.
- Таблица исходящих (outbox) — как не потерять событие. «Заказ создан» записывается в базу той же транзакцией, что и сам заказ, а отдельный процесс потом отправляет его дальше. Заказ записан — событие точно уйдёт. Не записан — точно не уйдёт.
Очередь, повтор и таблица исходящих сделаны. Слабое место: работник один, и не проверено, не задвоятся ли задачи по расписанию при двух. По документам
10Куб масштабирования и как делают большие
У инженеров есть стандартная модель: три оси, по которым система может расти.
Ось X — клоны
Одинаковые копии за балансировщиком. Дёшево, первая мера.
Ось Y — по функциям
Поиск, чат, обработка фото, платежи — отдельные службы. Нужно, когда части мешают друг другу или над ними работают разные команды.
Ось Z — по данным
Та же система в нескольких экземплярах: каждый обслуживает свою страну или группу клиентов. Экземпляр называют ячейкой (cell).
- Shopify — модульный монолит (один большой код) и ячейки: магазины разложены по изолированным группам, у каждой своя база. Авария одной группы не задевает остальные. Перед распродажами — учения под нагрузкой на боевой системе.
- Stack Overflow (вся сеть его сайтов) годами обслуживал больше миллиарда просмотров в месяц примерно с двух десятков собственных серверов: мощные машины, аккуратный кэш, быстрый код. Пример того, как далеко уводят рычаги 1 и 2.
- Облако Amazon — ячейки как принятая практика: у ячейки жёсткий потолок размера, растут числом ячеек.
- Alibaba — покупатель привязан к своему центру данных, почти вся его работа идёт там. Но общие данные, например остатки, остаются в центре. То, что должно быть одно на всех, не делят.
- Ozon, Wildberries — сотни и тысячи отдельных служб. Это ответ на сотни команд разработки, а не на число покупателей.
Отдельные службы (микросервисы) появляются из-за числа людей в разработке. Ячейки — из-за числа клиентов и требований стран. Нагрузку сами по себе микросервисы не лечат.
Тебе нужна ось X сейчас, точечно ось Y (она уже начата: приложение, работник, чат и обработчик видео — отдельные процессы) и ось Z — когда придёт вторая страна со своими требованиями к данным. Дробить монолит на службы не надо: это решение для ступени, до которой ещё несколько порядков роста.
11Расчёт: 30 000 человек одновременно
| Шаг | Расчёт | Итог |
|---|---|---|
| Просмотры | 30 000 человек, страница раз в 25 секунд | ≈ 1 200 страниц в секунду |
| Запросы | по 4 запроса на страницу | ≈ 4 800 в секунду |
| После кэша на входе | попадание 85–90 % | 500–700 доходит до приложения |
| Копии приложения | 20–25 запросов в секунду на копию | 20–35 копий, каждой своё ядро |
| Сборка страниц сайта | отдельный слой, тоже упирается в процессор | ещё несколько машин |
| Чат | соединение держат 10–30 % людей | 3 000–9 000 соединений, 2–4 копии чата |
| Заказы | 1–2 % людей покупают в течение часа | меньше 1 заказа в секунду — база не заметит |
Это около десятка машин, а не сотни. Без кэша на входе та же нагрузка потребовала бы в семь–десять раз больше копий приложения — вот цена первого рычага.
Замер команды на стенде: одна копия держит 20–25 запросов в секунду под смешанной нагрузкой и упирается в одно ядро процессора. Три копии на той же машине дают около 50, а не 75 — ядра общие. Линейный рост «копия = ещё 25» верен, только когда у копии есть своё свободное ядро. По документам
И ловушка: 35 копий по 10 соединений — это 350 соединений при лимите базы 100. Поэтому посредник соединений нужен вместе со второй машиной приложения, а не «когда-нибудь».
12Отказы и резервные копии
Всё ломается: диски, сети, хостеры, люди. Вопрос не «сломается ли», а «что будет, когда сломается».
- Единая точка отказа (single point of failure) — деталь, с отказом которой встаёт всё. Архитектор ищет такие детали и либо дублирует их, либо записывает как принятый риск.
- Допустимая потеря данных (RPO) — сколько минут работы можно потерять при аварии. Копия раз в сутки — значит, можно потерять сутки.
- Время восстановления (RTO) — через сколько система снова работает.
Взрослая система начинается с того, что эти две цифры записаны и проверены учением.
Три копии данных, на двух разных носителях, одна — в другом месте. Смысл в последнем пункте: копия на той же машине спасает от ошибочного удаления, но не от потери машины.
И второе правило: копия, которую не пробовали восстановить, — не копия. Типичная история о потере данных — «копии делались годами, а когда понадобились, не развернулись».
Копия базы делается каждую ночь; последняя — 14.11. Раз в месяц копия автоматически разворачивается в пробную базу; последняя проверка — 01.11, успешно. Это сделано лучше, чем у большинства небольших проектов. Измерено 14.11
Но журнал копий сам пишет: вывоз за пределы сервера пропущен. Скрипт умеет вывозить копии наружу в зашифрованном виде — площадка для этого не подключена. Измерено 14.11
Пропадёт сервер — сбой диска, блокировка или потеря аккаунта у хостера, взлом, ошибочное удаление — и вместе с базой пропадут все её копии. Никакая архитектура под миллионы не имеет значения, пока это так. И это самый дешёвый пункт из всего списка.
Следующие ступени после вывоза копий: восстановление на момент времени (PITR) — база пишет журнал всех изменений, и её можно вернуть на любую минуту, а не только на ночь; и горячая копия (standby) — вторая база на другой машине, которая повторяет главную и подхватывает работу при её отказе.
13Как не упасть целиком
Масштаб — это не только «больше». Это ещё и «чтобы отказ части не стал отказом всего».
- Обратное давление (backpressure). Перегруженная система должна честно отказывать части запросов — «попробуйте через 5 секунд», — а не принимать всё и умирать. Инструмент — лимит запросов (rate limit).
- Пределы времени (timeout). Каждый вызов наружу и в базу — с потолком ожидания. Иначе один зависший сосед вешает всех, кто его ждёт.
- Предохранитель (circuit breaker). Сосед не отвечает — перестаём его дёргать на минуту и сразу отдаём запасной ответ. Как автомат в электрощитке.
- Изоляция поломки. Упал поиск — каталог работает. Упал чат — заказы идут.
- Деградация (graceful degradation). Под перегрузкой система жертвует второстепенным — рекомендациями, счётчиками, — чтобы сохранить главное: оформление заказа.
Лимиты и лестница деградации с рубильниками есть. У приложения и чата пределы времени есть; у фонового работника на запросы к базе — нет. Главный нарушитель изоляции — общий экземпляр быстрой памяти: через него идут и очереди, и лимиты, и чат, и кэш. Его отказ задевает сразу несколько частей системы. По документам
14Выпуск изменений
Чаще всего систему ломает не нагрузка, а собственное обновление. Поэтому у выпуска своя механика.
- Стенд и бой (staging и production). Стенд — копия системы для проверок. Бой — то, чем пользуются люди. Они должны быть раздельными: иначе эксперимент ломает живое.
- Автосборка (CI). Робот, который на каждое изменение сам запускает проверки: типы, тесты, защитные правила. Её ценность в том, что это проверка, которая не зависит ни от чьего мнения.
- Маленькие шаги и откат (rollback). Чем меньше изменение, тем проще понять, что сломало, и вернуть как было. Способ отката придумывают до выкатки.
- Постепенная выкатка (canary). Новая версия сначала достаётся 1–5 % людей. Если ошибок не прибавилось — всем.
- Рубильник (feature flag). Код выложен, функция выключена. Включают настройкой, без новой выкатки — и так же выключают.
- Проверка на живом устройстве. Тест проверяет то, что придумал автор теста. Телефон в руках проверяет то, что есть на самом деле.
Автосборка красная: последняя зелёная — 21.09.2026. Проверки не запускаются вообще. Причина не в коде: не прошла оплата сервиса сборки или исчерпан лимит расходов. Почти два месяца изменения проверялись только вручную на ноутбуках исполнителей. Измерено 14.11
Стенд и бой — одна система. Рубильники есть. По документам
15Приборы: как видеть систему
Систему, которую не видно, нельзя ни чинить, ни растить. Сигналов три вида:
- Метрики (metrics) — цифры во времени: запросов в секунду, доля ошибок, загрузка процессора. Отвечают на вопрос «что происходит».
- Журналы (logs) — запись каждого события. Отвечают на вопрос «что именно случилось с этим запросом».
- Трассировка (tracing) — путь одного запроса по всем слоям с временем на каждом. Отвечает на вопрос «где тормозит».
Задержку смотрят не по среднему, а по «хвосту»: p95 — время, в которое укладываются 95 запросов из 100. Среднее 0,4 секунды может скрывать, что каждый двадцатый человек ждёт пять секунд.
Четыре главных сигнала (так учит Google): задержка, поток запросов, ошибки, насыщение — насколько близко к потолку.
Целевой уровень (SLO) — обещание цифрой: «99,9 % оформлений заказа проходят успешно». 99,9 % за месяц — это 43 минуты допустимого простоя. Эти минуты называют бюджетом ошибок: пока он не истрачен, можно быстро выпускать новое; истрачен — занимаемся только надёжностью.
Оповещение (alert) шлют только на то, что требует действия человека. Тревога, на которую не надо реагировать, учит не реагировать.
Приборы есть: страница «Рост» в админке (показы, клики, просмотры, заявки по дням), «пульс» приложения и проба из России на странице монитора, журнал копий. До 14.11 их никто не сводил вместе. Измерено 14.11
Графиков здоровья системы, целевых уровней и дежурства нет. По документам
16Деньги
Денежная часть устроена не как остальной код. Её цель — чтобы ошибку было невозможно сделать и невозможно скрыть.
- Суммы — целым числом копеек. Дробные числа компьютер хранит приближённо: у него 0,1 + 0,2 не равно 0,3. На миллионе операций копейки расползаются.
- Двойная запись (double-entry ledger). Каждая операция — две строки: откуда ушло и куда пришло. Сумма всех строк всегда ноль. Баланс не хранится числом, которое правят, — он считается из журнала.
- Журнал только на дозапись. Ошибку исправляют новой, обратной строкой. Стереть или поправить старую нельзя. Так устроены банки.
- Ключ идемпотентности (idempotency key). Связь плохая, человек нажал «оплатить» дважды. У обоих запросов один и тот же номер операции — сервер видит повтор и не списывает второй раз.
- Сверка (reconciliation). Каждый день сравнивать свой журнал с выпиской банка или платёжной службы. Сверка существует ровно для одного: поймать разницу между «мы думаем» и «на счёте есть». Сверка своих записей со своими же ничего не ловит.
- Цепочка с компенсацией (saga). Заказ — это резерв товара, списание денег, уведомление. Они живут в разных системах, одной транзакцией их не обернуть. Поэтому у каждого шага есть обратный: не прошло списание — снять резерв.
- Удержание (escrow). Деньги покупателя не уходят продавцу сразу, а лежат до подтверждения получения.
- Чарджбэк (chargeback). Банк покупателя может вернуть платёж по жалобе клиента — через недели после сделки. Это должен быть описанный процесс, а не сюрприз.
Главный вопрос в деньгах — не технический: кто по закону принимает деньги и что умеет платёжная служба — делить платёж между продавцом и площадкой, выдавать чеки, платить за границу. От ответа зависит, какой учёт вообще нужен.
Пункты 1–4 и удержание сделаны всерьёз и до первого платежа. Остатки под блокировкой: в прогоне на ноутбуке 400 попыток купить 60 штук — продано ровно 60. Сверка — пока своих записей со своими; выписка сама не загружается. Продукт в режиме «бета без оплаты», боевой платёжной службы в коде нет. По документам
До выбора платёжной службы денежную часть не развивать вовсе. Иначе продолжим строить под схему, которой может не быть.
17Защита
Защита — не отдельный этап в конце, а привычка задавать вопрос «а что, если это сделает злоумышленник?» к каждой функции.
- Модель угроз (threat model) — до кода: кто нападает, чего хочет, каким путём, чем закрыто. Дешевле, чем разбор после взлома.
- Вход и права — разные вещи. Вход (authentication) — «кто ты». Права (authorization) — «что тебе можно». Самая частая дыра в любых сервисах: человек вошёл честно, а потом открыл чужой заказ, подставив чужой номер.
- Минимальные права (least privilege). Каждый человек и каждая программа получают ровно столько доступа, сколько нужно для работы.
- Не доверяй входу. Всё, что пришло снаружи — форма, файл, ответ партнёра, уведомление от платёжной службы (webhook), — проверяется, как будто его прислал враг.
- Секреты — ключи и пароли — не лежат в коде и не попадают в журналы.
- Личные данные (PII): собирать меньше, хранить зашифрованно, в журналы не писать.
- «Четыре глаза» на деньги: один создаёт выплату, другой подтверждает.
- Лимиты на всё, что стоит денег: СМС, попытки входа, тяжёлые запросы.
- Второй фактор (2FA) для сотрудников и админки.
- Цепочка поставки (supply chain). В продукте сотни чужих библиотек; уязвимость в любой — твоя уязвимость. Их проверяют автоматически при сборке.
- Мошенничество — это не взлом. Накрутки, фальшивые заказы, сговор покупателя с продавцом идут через честные двери. Против них работают правила и наблюдение, а не замки.
Есть: модель угроз до кода, «четыре глаза» на деньги (на запуске — с временным исключением), защита от накрутки СМС. Несколько пунктов из списка выше в коде не найдены. Точный перечень — в карте школы, раздел 4.5: на открытую страницу я его намеренно не вынес. По документам
18Страны
Правило одно: страна должна быть настройкой, а не кодом. Настройкой становятся:
Деньги
Валюта, курс, налог, чек, способ оплаты.
Люди
Язык, часовой пояс, формат адреса и телефона.
Право
Документы, где обязаны лежать данные, кто продавец по закону.
Сейчас страна — это код. Списки стран — константы в программе. Базовая валюта — рубль, магазин может быть только в рублях или юанях. «Сутки по Москве» зашиты в нескольких местах. Адрес — плоский текст. Товар хранится на одном языке. Документы — один комплект. По документам
Переписывать сейчас не надо. Надо перестать добавлять новые привязки: каждая функция, написанная «под Россию», увеличивает цену будущего выхода. Где должны лежать данные граждан каждой страны — вопрос юристу, не нейросети, и он стоит уже сегодня.
19Из чего он состоит
Твой маркетплейс — модульный монолит: один код и одна выкатка, а внутри — модули с границами (корзина, заказы, платежи, доставка, промо). Для команды твоего размера это мировой стандарт. По документам
| Деталь | Что делает | На чём |
|---|---|---|
| Сайт и мобильное приложение | То, что видит человек | сайт собирается на сервере; приложение для iOS и Android |
| Приложение (API) | Принимает запросы, проверяет права, пишет в базу | Bun, Hono |
| База данных | Товары, заказы, деньги, люди | Postgres |
| Быстрая память | Очереди, лимиты, чат, кэш — всё в одном экземпляре | Redis |
| Фоновый работник | Уведомления, пересчёты, задачи по расписанию | BullMQ |
| Чат, обработчик видео | Отдельные процессы | — |
| Хранилище файлов | Фото товаров, документы продавцов | совместимое с S3 |
| Входной узел в России | Чтобы сервис открывался у российских пользователей | отдельный сервер |
| Монитор | Страница состояния, «пульс», проба из России | отдельный сервер |
Приложение, база, очереди и файлы работают на одной машине. По документам
20Что сделано по-взрослому
Это не комплимент, а опора: на этом можно строить, и этого не надо переделывать. По документам
| Что | Почему это правильно |
|---|---|
| Модульный монолит, а не микросервисы | Так начинал Shopify и живёт до сих пор |
| Двойная запись, копейки целым числом, журнал только на дозапись | Баланс нельзя «подправить», можно только добавить строку |
| Ключ идемпотентности на оформлении заказа | Повтор из-за плохой связи не создаёт второй заказ |
| Остатки под блокировкой и запрет отрицательного остатка в самой базе | Нельзя продать то, чего нет |
| Таблица исходящих событий | Уведомление не теряется и не уходит зря |
| Постраничная выдача по курсору | Не замедляется на глубине и на миллионах строк |
| Лестница деградации с рубильниками | Под перегрузкой жертвуем рекомендациями, а не заказом |
| Нагрузочные прогоны с разделом «что не проверялось» | Большинство команд своих потолков не знает вообще |
| Модель угроз до кода, «четыре глаза» на деньги (на запуске — с временным исключением) | Угрозы разбираются до инцидента, а не после |
| Единый интерфейс перевозчика | Нового логиста можно добавить, не переписывая заказы |
21Чего нет — в порядке «что ударит раньше»
Факты — из кода и документов проекта, порядок — мой. По документам Моя позиция
| № | Что | Когда ударит |
|---|---|---|
| 1 | Выживаемость. Одна машина на всё; копии базы не вывозятся за её пределы; нет сценария «сервера больше нет, поднимаемся с нуля» и учения с замером времени | В любой день, при любой нагрузке |
| 2 | Автоматическая проверка. Автосборка стоит с сентября | Уже сейчас: изменения проверяются только вручную |
| 3 | Деньги. Нет платёжной службы, сверки с выпиской, процесса чарджбэков; не решены комиссия и срок удержания | До включения оплаты |
| 4 | Потолок витрины. 20–25 запросов в секунду на копию; сеть доставки не раздаёт страницы и картинки; поиск средствами базы — граница около 100 000 товаров; одна база без читающей копии | При росте трафика |
| 5 | Страны. Страна зашита в код | При выходе за пределы России |
| 6 | Эксплуатация. Нет графиков, целевых уровней, дежурства; знание о системе — в файлах нейросетей | При первой серьёзной аварии |
Про поиск отдельно: каталог сейчас около 9 700 товаров, две недели назад было 344. До границы поиска в 100 000 ещё на порядок, но скорость роста каталога — сама по себе цифра, за которой стоит следить. Измерено 14.11
22Панель реальности: снимок 14.11.2026
Шесть цифр, ни одна из которых не мнение нейросети. Это первый снимок; дальше — раз в неделю. Одна цифра из шести пока не снята.
Автосборка. Последняя зелёная — 21.09. Измерено
Строк кода за неделю. На одну удалённую — 5,5 добавленных. Измерено
Разных адресов с телефонов за 13.11. За неделю не снято. Измерено
Заявок за неделю. За всё время — 16, от 12 покупателей. Измерено
Доступность из России. Прибор есть, цифра не снята.
Последняя проверка восстановления из копии, успешно. Измерено
Что говорят цифры
- Продукт ожил на этой неделе. Показы товаров: 08.11 — 44 в день, 11.11 — 335, 12.11 — 2 157, 13.11 — 8 396. За неделю: 11 189 показов → 244 клика → 333 просмотра карточки → 11 заявок. Учётных записей 75, из них 37 появились за семь дней. Что именно произошло 12–13.11, из цифр не видно.
- Масштаб — десятки людей. До «десятков тысяч одновременно» три порядка. Диск сервера занят на 39 %, копия базы весит 24 МБ. Нагрузка сейчас не ограничивает ничего.
- На одну удалённую строку кода — пять с половиной новых. Плюс за ту же неделю 13,5 тысячи строк тестов и 12,3 тысячи строк документов.
Адреса — не люди: один человек с телефона и из дома — два адреса, а запросы через российский входной узел могут сливаться в один. В 75 записях и 16 заявках есть команда и тесты; сколько — не измерено. День 13.11 в таблице ещё не закрыт, его цифры могут подрасти. Неделя — одна точка, по одной точке тренд не строят.
Одно чтение приборов подтвердило на живой системе то, что до этого было строкой в документах и принятым долгом: копии базы лежат рядом с базой. А рост каталога в 28 раз и первые живые заявки сделали этот долг опасным. Пока не посмотришь на прибор, долг остаётся строкой, которую никто не перечитывает.
23Главное противоречие и порядок шагов
Код опережает бизнес. Написаны банковский учёт, удержание, возвраты, споры — и не принят ни один настоящий платёж. Типовой провал здесь называется «строю собор до первой службы». Риск не в том, что система не выдержит 300 000 заказов. Риск в том, что первые 300 покажут: деньги ходят иначе, логист отвечает иначе, покупатель хочет иначе — и часть собора придётся перекладывать.
Сейчас правильная архитектурная работа — не масштабирование, а три вещи по порядку: (1) данные нельзя потерять; (2) первый настоящий рубль проходит весь путь от покупателя до продавца и сходится с выпиской банка; (3) новые функции перестают прибивать систему к одной стране.
Что меня переубедит: цифры живого трафика, близкие к потолку — сотни одновременных покупателей каждый день, — или договор с датой, требующий нагрузки, которой стенд не держит. Снимок 14.11 показал начало движения, но не это.
Лестница роста: что делать на какой цифре
| Ступень | Триггер | Что добавляется |
|---|---|---|
| 0. Бета — сейчас | — | Копии вне машины, восстановление на момент времени, учение по восстановлению, сеть доставки перед витриной, автосборка, панель цифр |
| 1. Первые деньги | включение оплаты | База на отдельной машине с горячей копией, сверка с выпиской, второй фактор сотрудникам, первые правила против мошенничества, целевые уровни и оповещения, дежурный |
| 2. Десятки тысяч заказов в месяц | копии загружены выше 60 %; поиск медленнее 300 мс; больше 100 000 товаров | Читающие копии базы, посредник соединений, поисковый движок, быстрая память по ролям, отчёты в отдельном хранилище, вторая платёжная служба и второй логист, страна как настройка |
| 3. Сотни тысяч заказов, несколько стран | вторая страна со своими требованиями к данным; команда больше 15–20 разработчиков | Ячейки по странам, шина событий, выделение горячих частей в службы, круглосуточное дежурство |
Ближайшие шаги
- Вывоз копий за пределы сервера. К росту отношения не имеет, но стоит первым: без него всё остальное строится на песке.
- Вернуть автосборку. Это счёт, а не разработка.
- Сеть доставки перед витриной и картинками. Код к этому готов. Сначала проверить, как выбранная сеть работает для покупателей в России.
- База на отдельной машине с горячей копией. И рост, и страховка. Срок — до включения оплаты.
- Профиль одного запроса: куда уходит процессор. Триггер не нужен — это дёшево.
- Дальше — только по триггерам из таблицы выше.
Чего делать не надо: дробить монолит на службы, ставить тяжёлую систему управления контейнерами ради пяти машин, делить базу.
24Как устроена твоя фабрика
Весь код пишут нейросети. Чтобы это работало, ты построил конвейер: у каждой задачи одна и та же дорога.
Пять принципов, на которых это держится:
- Три уровня риска. Правка текста не проходит тот же путь, что возврат денег. Уровень назначается до начала.
- Чистый контекст у проверяющего. Он не видит рассуждений автора и не заражается ими. Нейросеть, которой показали вывод, склонна его подтвердить.
- Сначала тест, потом код. Тест — это записанное требование, которое можно запустить.
- Память — в файлах. У нейросети нет памяти между разговорами. Всё, что должно пережить сессию, записывается.
- Один хозяин у задачи. Две нейросети не правят одно и то же одновременно.
25Что в ней работает и что нет
Система хорошо делает правильный код и почти не видит реальность. Она построена ловить ошибки в тексте — в постановке, коде, плане. А то, что реально ударило по продукту, лежало вне текста: приложение не открывалось в России, остановилась автосборка, копии лежат рядом с базой.
Вторая половина: у системы нет тормоза. Она производит код, тесты и правила быстрее, чем кто-либо способен их прочитать.
| Что | Цифра | Вывод |
|---|---|---|
| Проверка постановки до кода | серьёзные замечания в 18 прогонах из 20, около 3,5 на постановку | Работает. Самая окупаемая стадия |
| Проверка «сломай» на деньгах | серьёзные замечания в 3 прогонах из 5 | Работает |
| Повторные проверки после правок | 5 из 5 — ничего | Сокращены 19.10 по этим цифрам. Сработало ли — ещё не проверено |
| Инженер приёмки | 17 из 17 — ничего | С 19.10 поднимается только при серьёзных замечаниях. Эффект ещё не проверен |
| Производство кода | около 1 350 изменений в месяц; 206 тысяч строк кода и 161 тысяча строк тестов | Узкое место продукта — не код |
| Журнал решений | 5 164 пункта, 23 тысячи строк | Прочитать нельзя никому |
| Обязательное чтение перед работой | 4,2 МБ | Физически невыполнимо, выполняется выборочно и молча |
Цифры собраны 14.11.2026 по истории кода и файлам офиса.
Пять причин, по порядку тяжести
- Нет обратной связи от реальности. Почти все источники правды в контуре — мнение нейросети. Она описывает ожидаемое поведение продукта, а не фактическое, и отличить одно от другого нечем.
- Фабрика работает не на узкое место. Запуск денег держат договор с платёжной службой, ответ юриста и модель оплаты доставки. Ни одно из трёх — не код. Когда узкое место снаружи, а производство идёт внутри, растёт не продукт, а цена его содержания.
- Добавлять умеют все, убирать — никто. Каждый проверяющий получает вопрос «чего не хватает?». Нейросеть на него всегда находит ответ. Вопрос «что лишнее?» долго не задавал никто.
- Память переросла голову. Файлы памяти выросли до мегабайт. Читать их целиком невозможно — значит, читают кусками и не говорят об этом.
- Правила только копятся. После каждого сбоя появляется правило. Ни срока, ни цифры для отмены у правил нет.
26Свойства нейросети, которые надо знать
Это не лечится формулировкой запроса. Это свойства инструмента — их обходят устройством работы.
| Свойство | Как проявляется | Чем обходить |
|---|---|---|
| Памяти нет, кроме файлов | Каждый разговор начинается с нуля; файлы пухнут | Жёсткий потолок на обязательное чтение; старое — в архив |
| Склонность добавлять | План на тысячу строк при просьбе «просто» | Вопрос «что убрать» в каждой проверке; лимит объёма в постановке |
| Уверенный тон | «Готово» звучит одинаково, проверено или нет | «Сделано» принимается только с доказательством: вывод команды, номер сборки, снимок с телефона |
| Угодливость (sycophancy) | Попросил «пуленепробиваемо» — получил ещё слой брони, а не вопрос «а надо ли» | Спрашивать прямо: «что бы ты здесь не делал?», «где я ошибаюсь?» |
| Не видит мир | Сеть в России, магазин приложений, диск, неоплаченный счёт — вне поля зрения | Приборы и живой телефон |
| Выдумывает (hallucination) | Пересказ чужого отчёта вместо первоисточника: в первой версии этого курса так появилось пять ошибок | Требовать файл и строку; факт без источника — не факт |
| Одна модель проверяет себя | Совпадение мнений — не подтверждение: слепые зоны общие | Другой вопрос и чистый контекст; на деньгах — проверка, которая не нейросеть |
Ты единственный человек в контуре, и читать код ты не можешь. Поэтому контроль ты строил единственным доступным способом — добавлял ещё одну нейросеть, которая читает текст. Это ловушка: контроля становится больше, а знания о реальности — нет. Выход — приборы, которые ты читаешь сам, без посредника.
27Как ставить задачу
Сначала честно: твои запросы — не первая причина проблем. Размытую диктовку система исправляет сама. Но три привычки стоят дорого.
- «Без ограничений», «сколько нужно». Для модели это команда «максимум объёма». Нет точки остановки — будет больше помощников, файлов и страниц.
- Нет слов «не делать» и «готово». Пустоту нейросеть заполняет сама, и всегда в сторону «больше».
- Противоречивые сигналы. «Быстрее», «меньше кода» и «максимально надёжно» в одной задаче модель примиряет единственным способом — добавляет процесс.
Диктовать можно так же свободно. Но в конце — пять строк:
Результат: что я хочу держать в руках. Зачем: какое решение я приму на основе этого. Готово, когда: признак, по которому остановиться. Не делать: что вне задачи. Бюджет: объём ответа, время, сколько помощников.
Что у тебя сильное — сохрани. Ты разрешаешь спорить и требуешь честности. Записываешь решения с датой. Меняешь процесс в день сбоя. Так работают немногие.
28Десять вопросов и семь правил
Вопросы, которые профессионал задаёт к любой задаче
Их можно задавать нейросети дословно. Ответ «не знаю» или «не измерено» — нормальный ответ, с ним можно работать. Плохой ответ — уверенный и без цифры.
- Какую цифру пользователя или денег это двигает?Нет цифры — задача ждёт. Это и есть тормоз.
- Что здесь сломается первым и при какой цифре?Потолок должен быть назван числом.
- Что увидит человек, если эта часть упадёт?Изоляция и деградация.
- Что будет, если запрос придёт дважды?Идемпотентность.
- Где здесь состояние и кто его хозяин?Одна правда — в одном месте.
- Что здесь растёт без потолка?Таблицы, журналы, очереди, файлы.
- Каким прибором я увижу, что это работает в бою?Не «тесты зелёные», а цифра с живой системы.
- Как это откатить?Придумывается до выкатки.
- Что здесь можно не делать?Лучшая деталь — отсутствующая.
- Что привязывает нас к одной стране или одному поставщику?Цена будущего выхода.
Семь правил стройки с нейросетями
- Панель реальности раз в неделю. Шесть цифр на одной странице, ни одна — не мнение нейросети.
- Автосборка всегда зелёная. Красная автосборка — авария, а не фон.
- Живой телефон перед каждым выпуском. Два устройства, одно — в России.
- К каждой задаче — строка «какую цифру двигает».
- Потолок на обязательное чтение. Закрытое — в архив. Нейросеть должна успевать прочитать свои правила целиком.
- Правило — только с цифрой и сроком. Одно новое правило — одно старое на выход.
- Одна проверка без нейросети в каждой задаче: запуск, замер, телефон или запись из боевого журнала.
Чего не трогать: денежное ядро; проверку постановки до кода; проверку «сломай» на деньгах, входе и личных данных. У них единственных доказанная отдача.
29Словарь
Русское слово, английский термин, объяснение в одну строку. Начни печатать — список сузится.
30Что читать дальше
- Мартин Клеппман, «Высоконагруженные приложения» (Designing Data-Intensive Applications). Главная книга о данных: базы, копии, очереди, согласованность. Читать медленно, первую часть — обязательно.
- Google, «Site Reliability Engineering». Откуда взялись целевые уровни, бюджет ошибок и дежурство. Есть в открытом доступе.
- Майкл Нейгард, «Release It!». Истории аварий и приёмы против них: пределы времени, предохранители, изоляция.
- Мартин Эбботт, Майкл Фишер, «The Art of Scalability». Откуда куб масштабирования.
Не читай всё подряд. Бери главу под вопрос, который стоит на этой неделе.
Собрано 14.11.2026 из четырёх документов школы: карта и диагноз, урок о масштабировании, разбор системы разработки, панель реальности. Факты о продукте — из кода и документов проекта; пять из шести цифр панели сняты 14.11.2026 только чтением — с сервера, из сервиса сборки и из истории кода.
Страница закрыта от поисковиков. Адреса серверов, имена, доступы и точный перечень слабых мест защиты в неё намеренно не включены.