open atlas

backend

Архитектура бэкенда

Как сервер обрабатывает запрос от начала до конца — и как сделать его надёжным: фоновые задачи, безопасные повторы и аккуратная остановка.

9 юнитов·81 уроков·~50 ч

Начать трек
00

С нуля

Перед senior-материалом: что вообще такое бэкенд и горстка слов, которые остальной трек считает уже знакомыми.
01

Жизненный цикл запроса

Как HTTP-запрос проходит через reverse proxy, стек middleware, обработчик и pipeline ответа — и где скрывается задержка на каждом этапе.
02

Middleware и внедрение зависимостей

Цепочки middleware перехватывают cross-cutting concerns; DI-контейнеры соединяют сервисы при запуске — вместе они определяют что выполняется, в каком порядке и с какими издержками.
03

Асинхронный vs блокирующий I/O

Блокирующий I/O удерживает поток на каждое соединение; async/non-blocking использует event loop для мультиплексирования тысяч операций на нескольких потоках.
04

Пулинг соединений и потоков

Пулы амортизируют дорогое создание ресурсов между многими запросами — размер пула, таймаут ожидания и политика вытеснения определяют, получите ли вы пропускную способность или каскадные таймауты.
05

Идемпотентность и retry: превращаем at-least-once в effectively-once

Idempotency keys, server-side dedupe, exponential backoff с jitter, thundering herd и как outbox + inbox закрывают dual-write разрыв.
06

Circuit breakers и bulkheads

Circuit breakers предотвращают каскадные сбои, быстро отказывая вызовам к деградировавшей зависимости; bulkheads изолируют домены отказов, чтобы один медленный сервис не исчерпал весь бюджет потоков/соединений.
07

Graceful shutdown и дрейнирование

Graceful shutdown прекращает принимать новую работу, дрейнирует in-flight запросы, закрывает соединения в правильном порядке и сигнализирует оркестратору — ошибка здесь приводит к потере запросов при каждом деплое.
08

Собираем воедино: бэкенд для продакшена

Lifecycle, middleware, async I/O, пулы, идемпотентность, circuit breakers и graceful shutdown складываются в продакшн-бэкенд, способный обрабатывать частичные сбои без потери данных и каскадных аварий.

Проекты по этому треку

Guided-проекты, которые закрепляют изученное здесь.

◆ Проекты

Очередь задач at-least-once

Собери долговечную очередь задач на Postgres с visibility timeout и идемпотентными консьюмерами, чтобы упавший воркер не терял задачу.

◆ Проекты

Фильтр Блума

Собери пространственно-эффективное вероятностное множество, отвечающее на запросы членства за O(1) с настраиваемой вероятностью ложных срабатываний, — и разберись, почему ложных отрицаний в нём быть не может принципиально.

◆ Проекты

Прерыватель цепи

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

◆ Проекты

Кольцо consistent hashing

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

◆ Проекты

Сервис фич-флагов

Собери небольшой сервис флагов с правилами таргетинга, процентными раскатками и типизированным SDK, который вычисляет флаги на клиенте из закешированного набора правил.

◆ Проекты

Конкурентный сервис ингеста на Go

Собери конкурентный воркер ингеста/фан-аута на Go — а затем эксплуатируй его: ограничь работу, примени backpressure, сделай вызовы downstream устойчивыми к отказам, выкати в минимальном контейнере и разбери инцидент с утечкой горутин, пока он не съел твою память.

◆ Проекты

Сервис RAG с опорой на источники

Демо RAG, отвечающее по корпусу, собирается легко; сервис RAG, которому ты доверишь живых пользователей, — нет. Сложность не в поиске, а в опоре на источники: заставить модель говорить только то, что подтверждает найденный текст, прикреплять цитаты, которые читатель может проверить, и доказать на eval-наборе, что ответы не уплывают в уверенную выдумку. Ты соберёшь весь цикл — нарезка, эмбеддинги, хранилище, retrieval top-k, опора, цитаты, оценка — и нащупаешь, где именно он течёт.

◆ Проекты

Идемпотентный ETL-конвейер

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

◆ Проекты

Планировщик задач

Планировщик задач cron + backoff с доставкой at-least-once, идемпотентными обработчиками и visibility timeout — чтобы ни одна задача не терялась молча, даже при краше воркера на середине выполнения.

◆ Проекты

LRU-кэш

Собери LRU-кэш с вытеснением за O(1) на связке хешмапы и двусвязного списка — та самая задача, которая показывает, почему вытеснение из кэша сложнее, чем кажется.

◆ Проекты

Мини-CRUD API

Собери свой первый настоящий бэкенд: крошечный HTTP API, который создаёт, читает, обновляет и удаляет заметки — на SQLite, чтобы данные пережили перезапуск. Ты пройдёшь путь от сервера в одну строку с «hello» до небольшого сервиса, который проверяет ввод и хранит строки, — честно, шаг за шагом.

◆ Проекты

Nest-сервис в продакшен-форме

NestJS вознаграждает за структуру и наказывает за её отсутствие. Собери сервис так, как его выкатила бы команда: feature-модули с настоящими границами, DTO, валидирующие на краю, guards и interceptors, которые держат сквозные заботы, типизированный config, в котором не опечатаешься, и e2e-набор, поднимающий всё приложение целиком. Это и есть разница между «знаю декораторы Nest» и «понимаю, зачем они существуют».

◆ Проекты

Мини OAuth 2.0 + PKCE логин

Реализуй поток authorization-code + PKCE целиком против реального провайдера, чтобы понять каждый редирект и токен, а не доверять библиотеке.

◆ Проекты

Загрузка через presigned URL

Прямая загрузка в хранилище через presigned URL с ограничениями размера и content-type и webhook завершения, проверяющим, что объект действительно прибыл, — чтобы API-сервер никогда не касался байт файлов.

◆ Проекты

Асинхронный Python-сервис: собрать и эксплуатировать

Собери асинхронный FastAPI-сервис приёма, который валидирует, прогоняет через пайплайн и выдерживает нагрузку, — а потом эксплуатируй его: упакуй, контейнеризуй с корректным поведением PID-1 и разберись с инцидентом, когда проглоченный CancelledError тихо протекает задачами, пока event loop не начинает голодать.

◆ Проекты

Распределённый rate limiter

Собери token-bucket лимитер, который держится поперёк многих инстансов приложения за счёт счётчика в Redis, а не в памяти процесса.

◆ Проекты

Типобезопасный SDK для API

Собери клиент, которому другие инженеры действительно будут доверять: типизированный SDK поверх настоящего HTTP API, где неправильное поле, пропущенный вариант и ответ, соврамший о своей форме, ловит компилятор — а не падение в проде. Ты смоделируешь домен через размеченные объединения и дженерики, проверишь каждый ответ на границе и дашь выводу типов донести точные типы до места вызова, не оставив ни одного `any`, которым прикрывают дыры.

◆ Проекты

URL-сокращатель под нагрузкой

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

◆ Проекты

Краш-устойчивое key-value хранилище с WAL

Собери крошечное дисковое KV-хранилище, которое переживает kill -9 на середине записи, дописывая в write-ahead log до изменения основного файла.

Следующий трек

API

Как программы общаются друг с другом по сети — основные стили (REST, GraphQL, gRPC) и как спроектировать такой интерфейс, чтобы им было удобно пользоваться и при изменениях.