Буткемп Node.js Оставить заявку

Программа буткемпа Node.js по неделям

20 учебных недель, которые поток проходит за 12 календарных: обычно по две за календарную неделю. Все недели строят один сервис, backend проката инструментов: от импорта каталога и HTTP API до оплаты без двойных списаний, очередей, Kafka, аналитики на ClickHouse, нагрузочных замеров и защиты проекта.

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

Календарь потока

Календарь потока: даты встреч, учебные недели программы и темы
ДатыНеделиЧто изучаем на проекте
с 6 февраля0Подготовка до старта: рабочее место, Git, Docker, основы SQL
13-14 февраля1-2Как устроен Node.js: цикл событий, потоки, ошибки. HTTP API на Fastify
21 и 23 февраля3-4PostgreSQL: модель данных, транзакции, миграции. NestJS
27-28 февраля5-6Вход и права доступа. Оплата без двойных списаний
6-7 марта7-8Redis и кэш. RabbitMQ и Outbox: события без потерь
13-14 марта9-10Сбои внешних сервисов. Выделение отдельного сервиса
20-21 марта11-12PostgreSQL глубже: поиск, JSONB, планы запросов. Тарифы и подписки для SaaS
27-28 мартаЗапасная неделя без новой темы: долги, исправления по ревью, консультации
3-4 апреля13-14Kafka: журнал событий, сбои и повторное чтение
10-11 апреля15-16ClickHouse: событийные таблицы, корректные отчёты и сверка
17-18 апреля17Нагрузка и system design: измерения, метрики, логи и трассировка запросов
24-25 апреля18-19Резервные копии и восстановление, безопасность релиза, итоговая доработка
5 и 6 мая20Защита проекта: встречи вечером после майских праздников, защиты по записи до 14 мая

Неделя 0. Подготовка

Терминал, Git, Docker и основы SQL на данных проката

Неделя подготовки до старта. На чтение уйдёт около 1 часа, на практику около 4 часов.

Задача недели

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

Чему научитесь

Вопросы собеседования

  1. Что происходит при git merge и при git rebase? Когда что выбирать?
  2. Как вы передаёте конфигурацию и секреты в сервис, запущенный в контейнере?
  3. Чем отличаются docker stop и docker kill?
  4. Что такое первичный и внешний ключ? Зачем ограничения в базе, если есть проверки в коде?
  5. Как найти записи без пары в связанной таблице?
  6. Что гарантирует транзакция и что произойдёт при ROLLBACK?
К списку недель

Неделя 1. Среда выполнения Node.js

Импорт каталога проката: потоки, проверка данных и понятные сообщения об ошибках

Встречи 13-14 февраля. На чтение уйдёт около 1,5 часа, на практику около 11 часов.

Задача недели

Пункт проката инструментов переезжает со старой учётной системы на новый сервис. Старая система умеет только выгружать данные в файл JSONL, где каждая строка содержит одну позицию каталога.

Чему научитесь

Вопросы собеседования

  1. Опишите фазы цикла событий Node.js. В какой фазе выполняются колбэки setImmediate, а где колбэки промисов?
  2. Как найти в работающем сервисе код, который блокирует цикл событий?
  3. Что такое обратное давление в потоках и как оно проявляется в продакшене?
  4. Чем pipeline лучше цепочки .pipe()?
  5. Как безопасно заменить файл, который читают другие процессы? Какие у этого способа границы?
  6. Как хранить денежные суммы в JavaScript и почему не в number с дробной частью?
  7. Что должно происходить в Node.js-сервисе между получением SIGTERM и выходом?
  8. Чем проверка живости отличается от проверки готовности?
К списку недель

Неделя 2. HTTP API на Fastify

Каталог проката по HTTP: контракт, ошибки, OpenAPI и запуск в Docker

Встречи 13-14 февраля. На чтение уйдёт около 2 часов, на практику около 11,5 часа.

Задача недели

Каталог проката импортирован и проверен. Теперь его должны увидеть клиенты: команда фронтенда делает витрину, где клиент листает инструменты по 20 штук, выбирает категорию «Дрели» и открывает карточку с характеристиками и залогом.

Чему научитесь

Вопросы собеседования

  1. Чем отличаются безопасные и идемпотентные методы HTTP? Приведите примеры.
  2. Как вы спроектируете постраничную выдачу для списка из миллиона записей?
  3. Как сообщать об ошибках в REST API, чтобы клиент мог их обработать?
  4. Как связать ответ об ошибке, который видит пользователь, с записью в логе?
  5. Как поддерживать документацию API в соответствии с кодом?
  6. Что происходит с процессом Node.js в контейнере после docker stop?
  7. Как уменьшить время пересборки образа Docker для Node.js-сервиса?
  8. Чем проверка живости отличается от проверки готовности, и что будет, если их перепутать?
К списку недель

Неделя 3. PostgreSQL: каталог и брони

Как не выдать одну дрель двум клиентам: транзакции, блокировки, ограничения и миграции

Встречи 21 и 23 февраля. На чтение уйдёт около 2,5 часа, на практику около 13 часов.

Задача недели

В пункте две одинаковые дрели Bosch GSB 13 RE с инвентарными номерами DR-001 и DR-002. Клиент выбирает даты на витрине и бронирует конкретный свободный экземпляр. Пока он оплачивает, дрель держится за ним 15 минут. Это временный резерв. Если клиент не оплатил, резерв истекает, и дрель снова свободна. Оплата появится в следующих методичках: сейчас бронь создаётся резервом, а подтверждённые брони приходят из начальных данных.

Чему научитесь

Вопросы собеседования

  1. Какие уровни изоляции есть в PostgreSQL, какой используется по умолчанию и какие аномалии он допускает?
  2. Как исключить двойное бронирование номера в гостинице? Сравните несколько решений.
  3. Что такое SQL-инъекция и как от неё защищаются? Можно ли передать параметром имя таблицы?
  4. Как работает пул соединений и как выбрать его размер?
  5. Чем пессимистическая блокировка отличается от оптимистической?
  6. Что такое взаимоблокировка, как PostgreSQL её обнаруживает и как её избежать?
  7. Как выкатывать миграции схемы без простоя сервиса?
  8. Как хранить в базе деньги, даты и моменты времени?
К списку недель

Неделя 4. NestJS: модули и жизненный цикл

Переносим сервис проката на NestJS: модули, внедрение зависимостей, ошибки и остановка

Встречи 21 и 23 февраля. На чтение уйдёт около 2 часов, на практику около 11,5 часа.

Задача недели

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

Чему научитесь

Вопросы собеседования

  1. Что такое внедрение зависимостей, и какую задачу решает контейнер?
  2. Как в NestJS внедрить реализацию интерфейса и почему нельзя просто указать тип параметра?
  3. Как устроена обработка ошибок в NestJS, и как привести все ошибки к одному формату?
  4. Опишите жизненный цикл приложения NestJS при остановке. Где освобождать ресурсы?
  5. Как перенести существующий HTTP API на другой фреймворк и доказать, что контракт не изменился?
  6. Как вы найдёте и устраните циклическую зависимость между модулями?
  7. Зачем многостадийная сборка образа для сервиса на TypeScript?
  8. Что должно быть готово в сервисе, прежде чем его можно выкладывать на платформу с автоматическими перезапусками?
К списку недель

Неделя 5. Пользователи и изоляция организаций

Вход по паролю, сессии и роли, и как не показать пользователю данные чужой организации

Встречи 27-28 февраля. На чтение уйдёт около 2,5 часа, на практику около 12 часов.

Задача недели

В организации demo работают три человека. Ольга, владелица, меняет цены, нанимает сотрудников и увольняет их. Сергей, сотрудник пункта, оформляет брони по телефону на клиентов, у которых нет учётной записи, и видит все брони пункта. Анна, клиентка, сама бронирует дрель из дома и видит только свои брони. По соседству работает прокат sever со своим владельцем Глебом.

Чему научитесь

Вопросы собеседования

  1. Как правильно хранить пароли? Чем bcrypt, scrypt и Argon2 отличаются от SHA-256?
  2. Сессии на сервере или JWT: когда что выбрать? Как отозвать JWT?
  3. Что такое CSRF и XSS, и какие атрибуты cookie от чего защищают?
  4. Что такое CORS и от чего он не защищает?
  5. Как устроить права в многоарендном сервисе так, чтобы пользователь одной организации не видел данные другой?
  6. Что такое IDOR? Как его найти тестами?
  7. Когда отвечать 401, когда 403, а когда 404?
  8. Что такое атака по времени, и где она возможна в сервисе входа?
К списку недель

Неделя 6. Оплата, выдача и возврат

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

Встречи 27-28 февраля. На чтение уйдёт около 2,5 часа, на практику около 13 часов.

Задача недели

Анна бронирует дрель DR-002 на два дня. Цена 450 ₽ в сутки, залог 5000 ₽, поэтому к оплате 2 × 450 + 5000 = 5900 ₽, в копейках 590000. Аренда и залог идут одним платежом, так что вернуть залог значит вернуть часть этого платежа.

Чему научитесь

Вопросы собеседования

  1. Как интегрироваться с платёжным провайдером, если ответ на создание платежа может потеряться?
  2. Что такое ключ идемпотентности? Где его хранить, сколько, и что делать с тем же ключом и другим телом?
  3. Как проверить подлинность webhook, и от каких атак защищает метка времени?
  4. Webhook пришёл дважды или раньше, чем вы сохранили ID объекта. Что делать?
  5. Почему нельзя хранить деньги во float, и как вы считаете возвраты по одному платежу?
  6. Что видит транзакция READ COMMITTED после ожидания блокировки строки? Чем это отличается на REPEATABLE READ?
  7. Что такое проблема двойной записи (dual write), и какие у неё решения?
  8. Как вы протестируете гонку «отмена против выдачи» так, чтобы тест ловил ошибку стабильно, а не через раз?
К списку недель

Неделя 7. Redis и кэш

Кэш каталога в памяти процесса и в Redis, ограничение попыток входа и работа сервиса, когда Redis недоступен

Встречи 6-7 марта. На чтение уйдёт около 2,5 часа, на практику около 11,5 часа.

Задача недели

Субботнее утро. Покупатели листают каталог проката: открывают карточки, переходят по страницам, смотрят, свободна ли дрель на выходные. Одни и те же популярные дрели и пилы открывают в десятки раз чаще остальных позиций. Сейчас каждый такой просмотр превращается в запрос к PostgreSQL, хотя ответ на него не менялся с прошлой недели.

Чему научитесь

Вопросы собеседования

  1. Как вы построите кэш перед базой, и как будете держать его согласованным с базой?
  2. Одна запись входит в тысячи закэшированных страниц. Как вы их инвалидируете?
  3. Что такое cache stampede, и какие способы борьбы с ним вы знаете?
  4. Чем кэш в памяти процесса отличается от Redis, и когда нужен каждый?
  5. Redis недоступен. Что делает ваш сервис, и как вы это проверили?
  6. Как сделать rate limiting для нескольких экземпляров сервиса? Сравните фиксированное окно, скользящее окно и token bucket.
  7. Как выбрать maxmemory-policy, и что будет, если не задать maxmemory?
  8. Как доказать, что кэш помогает? Какие метрики и какой замер вы покажете?
К списку недель

Неделя 8. RabbitMQ и Transactional Outbox

Событие о подтверждении брони доходит до клиента даже при сбоях: outbox, RabbitMQ, повторы и очередь недоставленных сообщений

Встречи 6-7 марта. На чтение уйдёт около 2,5 часа, на практику около 12,5 часа.

Задача недели

Суббота, утро. Анна оплачивает бронь дрели «Дрель ударная Bosch GSB 13 RE» на выходные. Провайдер платежей присылает уведомление об успешной оплате, сервис подтверждает бронь: это работа недели 6. Теперь Анна должна получить сообщение «Бронь подтверждена: Дрель ударная Bosch GSB 13 RE, с … до …». Отправляет его провайдер уведомлений, внешний сервис. Он бывает медленным, отвечает 503 или принимает запрос, а ответ теряется по дороге.

Чему научитесь

Вопросы собеседования

  1. Что такое Transactional Outbox, и какие альтернативы вы знаете?
  2. At-most-once, at-least-once, exactly-once: что реально достижимо при отправке SMS или письма?
  3. Как сделать потребителя сообщений идемпотентным?
  4. Чем подтверждения издателя отличаются от подтверждений потребителя, и зачем нужен флаг mandatory?
  5. Что такое DLQ, когда сообщение туда попадает, и как вы возвращаете сообщения в работу?
  6. Classic- и quorum-очереди RabbitMQ: чем отличаются и когда что выбрать?
  7. Как гарантировать порядок обработки событий одного агрегата?
  8. Как мониторить outbox и очереди: какие метрики и на что ставить оповещения?
К списку недель

Неделя 9. Сбои внешних сервисов и сверка платежей

Что делать, когда платёжный провайдер молчит или отказывает: таймауты, повторы, Circuit Breaker и сверка платежей

Встречи 13-14 марта. На чтение уйдёт около 2,5 часа, на практику около 13 часов.

Задача недели

Суббота, утро. Анна оплачивает дрель на выходные. Сервис отправляет платёж провайдеру, а тот пять секунд молчит. С кодом недели 6 Анна получает 502, то есть «ошибка», хотя платёж у провайдера, возможно, уже создан. Если приложение Анны не повторит запрос с тем же ключом, платёж так и останется без исхода: кроме Анны, его никто не доведёт.

Чему научитесь

Вопросы собеседования

  1. Чем отличаются таймаут, отказ и «не обработано» при вызове платёжного API, и как вы обрабатываете каждый?
  2. Как устроены экспоненциальная пауза и разброс, и зачем они нужны?
  3. Что такое Circuit Breaker, какие у него состояния и параметры?
  4. Как вы сверяете состояние платежей с провайдером?
  5. Что делать с вебхуком, который пришёл поздно или дважды?
  6. Как гарантировать, что возвраты не превысят платёж при параллельных запросах?
  7. Как хранить и сравнивать время с учётом часовых поясов в PostgreSQL?
  8. Как фоновой задаче работать в нескольких экземплярах сервиса без двойной обработки?
К списку недель

Неделя 10. Отдельный сервис уведомлений

Уведомления уходят в отдельный сервис со своей базой, а события меняются так, чтобы не сломать получателей

Встречи 13-14 марта. На чтение уйдёт около 2,5 часа, на практику около 11,5 часа.

Задача недели

Пятница, вечер. Ольга хочет поменять текст уведомления: клиенты возвращают вещи к закрытию пункта, а не к 10:00, и в понедельник у Сергея три задачи return_overdue. Срок возврата в тексте нужен давно, но уведомления живут в процессе ядра. Чтобы поменять одну строку текста, нужно выкатить весь сервис проката, а он прямо сейчас принимает оплаты. Любая ошибка в коде уведомлений, которая роняет процесс, роняет и приём оплат.

Чему научитесь

Вопросы собеседования

  1. Как вы решаете, какой модуль выделять в отдельный сервис, и какие у этого издержки?
  2. Как изолировать данные сервисов, если у вас одна установка PostgreSQL?
  3. Как менять схему базы без простоя, когда старая и новая версии работают одновременно?
  4. Как менять контракт события, чтобы не сломать потребителей?
  5. Что такое correlation ID, чем он отличается от request ID и как его передавать между сервисами через брокер?
  6. Как в Node.js добавить контекст запроса в каждую строку журнала?
  7. Как убедиться, что падение сервиса уведомлений не мешает основному сценарию?
  8. Что вы пишете в ADR и зачем?
К списку недель

Неделя 11. PostgreSQL: поиск по каталогу

Быстрый поиск по каталогу в PostgreSQL: планы запросов, индексы, JSONB и полнотекстовый поиск на русском

Встречи 20-21 марта. На чтение уйдёт около 2,5 часа, на практику около 12 часов.

Задача недели

Прокат вырос. У небольших организаций сотни позиций, у сетевой десятки тысяч, и все они в одной базе. Анна ищет «перфораторы hilti» на выходные. Каталог умеет фильтровать только по категории и отдаёт страницы по 20 позиций. Позиция называется «Перфоратор Hilti TE 30», и слово «перфораторы» её не находит. Свободна ли позиция в субботу, можно узнать, только открыв её карточку.

Чему научитесь

Вопросы собеседования

  1. Как вы ищете причину медленного запроса в PostgreSQL? Что смотрите в EXPLAIN (ANALYZE, BUFFERS)?
  2. Как выбрать порядок столбцов составного индекса?
  3. Чем плоха постраничная выдача через OFFSET и как сделать её по ключу?
  4. Как индексировать JSONB, и чем отличаются классы операторов GIN?
  5. Как устроен полнотекстовый поиск в PostgreSQL и чем он отличается от LIKE?
  6. Что такое частичный и покрывающий индекс, и когда их применять?
  7. Сколько стоит индекс и как понять, что он лишний?
  8. Когда вы вынесли бы поиск из PostgreSQL в отдельный движок и что это изменит?
К списку недель

Неделя 12. SaaS: тарифы, подписки и лимиты организаций

Сервис становится платным для прокатов: тарифы, ежемесячные списания без дублей, просрочка оплаты и лимиты

Встречи 20-21 марта. На чтение уйдёт около 2,5 часа, на практику около 12 часов.

Задача недели

Прокат вырос из одного пункта в сервис, которым пользуются разные прокаты. Организацию до сих пор заводит начальная загрузка, а платить за сервис нельзя: прокат Ольги в Москве, как и все остальные, работает бесплатно и без ограничений.

Чему научитесь

Вопросы собеседования

  1. Как устроить биллинг подписок, чтобы при нескольких экземплярах и сбоях не списать дважды?
  2. Как считать месячные периоды подписки, и что делать с 31-м числом и летним временем?
  3. Как гарантировать «не больше N» при одновременных запросах в PostgreSQL?
  4. Что делать, если платёжный провайдер не ответил на списание?
  5. Как тестировать код, который зависит от времени, без ожидания и без веток «если тест»?
  6. Как спроектировать состояния подписки, и что разрешать при неоплате?
  7. Как хранить тарифы и менять цены, не ломая действующие подписки?
  8. Чем SELECT … FOR UPDATE отличается от SERIALIZABLE, и когда что выбирать?
К списку недель

Неделя 13. Kafka как журнал событий

События аренды пишутся в Kafka, и сервис аналитики собирает по ним сводку для владельца

Встречи 3-4 апреля. На чтение уйдёт около 2,5 часа, на практику около 12 часов.

Задача недели

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

Чему научитесь

Вопросы собеседования

  1. Когда выбирать Kafka, а когда RabbitMQ? Можно ли использовать их вместе?
  2. Как гарантировать порядок событий одной сущности в Kafka?
  3. Как опубликовать событие в Kafka и записать изменение в базу так, чтобы не потерять ни одно из двух?
  4. Что такое consumer group и rebalance? Что происходит, когда копия падает?
  5. Когда фиксировать offset? Что такое at-least-once и exactly-once в Kafka и где кончается exactly-once?
  6. Как потребитель переживает дубли и события не по порядку?
  7. Что такое consumer lag, и как по нему понять, что потребитель отстаёт или стоит?
  8. Как изолировать сервисы в общем кластере Kafka?
К списку недель

Неделя 14. Kafka при сбоях и повторном чтении

Аналитика на Kafka не теряет и не удваивает события при сбоях, повторах и пересборке

Встречи 3-4 апреля. На чтение уйдёт около 2,5 часа, на практику около 13 часов.

Задача недели

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

Чему научитесь

Вопросы собеседования

  1. Что такое exactly-once в Kafka и где он кончается? Как добиться, чтобы событие меняло внешнюю базу один раз?
  2. Как сделать потребителя идемпотентным? Почему не по offset?
  3. Что такое poison message и что с ним делать? Чем DLQ в Kafka отличается от DLQ в RabbitMQ?
  4. Какие ошибки потребителя стоит повторять, а какие нет?
  5. Как пересобрать проекцию из Kafka, не мешая работающему потребителю?
  6. Что будет, если потребитель отстал больше, чем на срок хранения topic?
  7. Как часто снимать snapshot проекции и от чего это зависит?
К списку недель

Неделя 15. ClickHouse и событийные таблицы

События броней и денег загружаются в ClickHouse, и владелец получает первый отчёт по дням

Встречи 10-11 апреля. На чтение уйдёт около 2,5 часа, на практику около 12 часов.

Задача недели

Раз в неделю Ольга садится считать: сколько броней подтвердили и сколько отменили, сколько денег пришло и сколько ушло обратно клиентам. Сводка и активность недель 13-14 касаются броней, денег в них нет. Ольге нужен отчёт по дням за любой период до года: подтверждения и отмены броней, число и сумма принятых платежей, число и сумма прошедших возвратов. Сутки считаются по поясу её организации: оплата в половине первого ночи по её часам относится к новому дню, а не к вчерашнему по UTC.

Чему научитесь

Вопросы собеседования

  1. Чем OLAP-хранилище отличается от OLTP-базы? Когда ClickHouse не нужен?
  2. Как выбрать ORDER BY и PARTITION BY для таблицы MergeTree?
  3. Как ClickHouse обращается с дублями? Что такое ReplacingMergeTree и когда он схлопывает строки?
  4. Как переносить данные из Kafka в ClickHouse, не теряя событий при сбоях?
  5. Почему деньги не хранят во float, и что делать с 64-битными целыми в JavaScript?
  6. Как ограничить аналитические запросы на общем сервере?
  7. Как построить отчёт по дням для организаций в разных часовых поясах?
К списку недель

Неделя 16. Отчёты без расхождений и сверка

Отчёты в ClickHouse сходятся с базой сервиса, даже когда события приходят повторно или с опозданием

Встречи 10-11 апреля. На чтение уйдёт около 2,5 часа, на практику около 13 часов.

Задача недели

Отчёт недели 15 Ольга открывает каждую неделю. Теперь ей нужно больше. Она хочет знать, сколько экземпляров занято в каждый день следующего месяца и сколько броней на эти дни уже отменили. Это загрузка, и по ней Ольга решает, докупать ли дрели. Ещё ей нужны деньги в том виде, в каком их видит бухгалтер: аренда отдельно от залога, возвраты по видам (отмена, залог, оплата без брони, ручной возврат). Залог не выручка, его вернут.

Чему научитесь

Вопросы собеседования

  1. Как ClickHouse работает с изменяемыми данными? Когда использовать ReplacingMergeTree, когда FINAL, когда argMax и сколько это стоит?
  2. Что такое материализованное представление в ClickHouse и чем оно отличается от материализованного представления PostgreSQL?
  3. Как сделать так, чтобы повторная доставка событий не удваивала итоги аналитики?
  4. Что такое watermark и чем он отличается от lag потребителя?
  5. Как сверить аналитическое хранилище с базой источника и что делать с найденным?
  6. Почему отчёт по суткам нельзя строить на границе «полночь плюс 24 часа» и где ломается даже сама полночь?
  7. Что произойдёт с аналитикой, если потребитель Kafka простоял дольше срока хранения topic?
К списку недель

Неделя 17. System design и измерения

Выдержит ли сервис субботний наплыв клиентов: метрики, трассировка, нагрузочный тест в k6 и расчёт ёмкости

Встречи 17-18 апреля. На чтение уйдёт около 2,9 часа, на практику около 11,5 часа.

Задача недели

У сети проката «Нагрузка» двадцать тысяч позиций, тысячи броней за сезон и сотни клиентов субботним утром. Владелица сети Ольга спрашивает прямо: выдержит ли сервис субботу? А если нет, что покупать: сервер побольше, вторую копию, «микросервисы»? Ответ «должно хватить» её не устроит, ей нужны числа.

Чему научитесь

Вопросы собеседования

  1. Как вы зададите SLO для API и проверите, что сервис его держит?
  2. Почему p99 важнее среднего и как считать перцентили по нескольким копиям?
  3. Чем отличаются открытая и закрытая модели нагрузки и что такое coordinated omission?
  4. Как найти узкое место Node.js-сервиса под нагрузкой: процессор, event loop, пул или база?
  5. Как подобрать размер пула соединений с базой?
  6. Сервис перегружен: что он должен отвечать и как клиенты должны повторять?
  7. Почему нельзя масштабировать сервис, просто добавив копий, и что мешает копиям быть взаимозаменяемыми?
  8. Когда стоит делить монолит на сервисы, а когда нет?
  9. Как провести трассу через очередь сообщений и когда обработке нужен родитель, а когда ссылка на контекст сообщения?
  10. Запрос медленный у одного клиента из сотни: как вы найдёте его трассу и шаг, на котором он стоял?
К списку недель

Неделя 18. Резервные копии и безопасность выпуска

Резервные копии с проверкой восстановления, безопасная загрузка файлов и ссылок, права в базе и выпуск по тегу

Встречи 24-25 апреля. На чтение уйдёт около 2,5 часа, на практику около 12 часов.

Задача недели

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

Чему научитесь

Вопросы собеседования

  1. Как вы защитите загрузку файлов в веб-сервисе? Что изменится, если файлы отдаются с того же домена, что API?
  2. Что такое SSRF? Как устроить функцию «скачать по ссылке» в сервисе, который работает в облаке?
  3. Сервис ходит в базу суперпользователем. Как вы перейдёте на роль с минимальными правами без простоя?
  4. Как устроены копии вашего последнего проекта? Когда из них последний раз восстанавливались и сколько это заняло?
  5. Как поменять секрет, если старый ещё используется клиентами или провайдером?
  6. Что вы проверите в CI на теге выпуска, чего нет в CI ветки?
  7. Медленный клиент держит соединения сервиса на Node.js. Какие настройки и в каком месте вы поменяете?
К списку недель

Неделя 19. Итоговое изменение

Одно изменение от запроса владельца до выпуска: анализ, правило для двух таблиц, совместимый API и выкат без простоя

Встречи 24-25 апреля. На чтение уйдёт около 2 часов, на практику около 12,5 часа.

Задача недели

Владелец пишет в чат: «DR-002 сломалась, мастер заберёт её в понедельник на неделю. Сейчас её можно забронировать на эти дни. Сотрудник узнаёт о проблеме в день выдачи, когда клиент уже стоит у стойки. Сделайте так, чтобы дрель на ремонте не бронировали».

Чему научитесь

Вопросы собеседования

  1. Расскажите об изменении, которое вы провели в существующей системе. Как вы искали, что оно задевает?
  2. Два запроса проверяют разные таблицы и оба проходят, нарушая правило. Как это называется и как вы это исправите?
  3. Флаг в базе или вычисление при чтении: как вы выбираете?
  4. Как вы меняете API, которым пользуются мобильные приложения старых версий?
  5. Как выкатить изменение правила, если старые копии сервиса ещё отвечают?
  6. Как вы оцениваете задачу и что делаете, когда оценка не сошлась?
  7. Что вы проверяете в ревью чужого изменения в первую очередь?
К списку недель

Неделя 20. Выпуск и защита проекта

Выпуск проекта, защита перед наставником и подготовка к собеседованию

Встречи 5 и 6 мая. На чтение уйдёт около 2 часов, на практику около 9,5 часа.

Задача недели

Владелец проката получает от вас систему и задаёт три вопроса. Первый: «Если вы завтра уйдёте, кто-нибудь её поднимет?». Для этого нужны README с одной командой запуска, образец данных, схема того, какой процесс с кем связан, и инструкции на случай аварии: копия, восстановление, сверка. Всё это должно совпадать с кодом.

Чему научитесь

Вопросы собеседования

  1. Расскажите о проекте за две минуты. Что в нём было самым сложным?
  2. Расскажите о решении, которым вы гордитесь, и о том, которое переделали бы.
  3. Сервис стал отвечать медленно. Что вы сделаете в первые десять минут?
  4. Как найти, кто держит блокировку в PostgreSQL, и что с ним делать?
  5. Как связать журналы нескольких сервисов, чтобы найти путь одного запроса?
  6. Сколько соединений с базой нужно сервису на 1000 запросов в секунду? Как вы посчитаете?
  7. Спроектируйте сервис бронирования: требования, данные, процессы, узкие места.
  8. Как вы используете ИИ в работе и как проверяете его предложения?
  9. Чего вы пока не умеете и как собираетесь научиться?
К списку недель

Навыки, которые вы подтвердите на защите

После защиты вы получаете паспорт навыков. В нём перечислены умения, которые вы показали на своём проекте, и у каждого есть ссылка на тест, merge request или отчёт. Ниже все 25 навыков курса и недели, на которых их разбираем.

Навыки паспорта и недели программы
НавыкНедели
Рабочее место разработчика: Git, терминал, Docker и основы SQL0
Как работает Node.js: цикл событий, блокировки, промисы, отмена и таймауты1, 17
Потоки и обратное давление1
TypeScript на backend: проверка внешних данных и ошибки1, 2, 3, 4, 5, 18
HTTP API: контракт, коды ошибок, постраничная выдача, OpenAPI1, 2, 4, 19
NestJS: модули, внедрение зависимостей, запуск и остановка4
SQL, проектирование схемы и миграции PostgreSQL3, 11
Транзакции, блокировки и одновременные изменения данных3, 6, 12, 19, 20
Индексы, планы запросов, JSONB и полнотекстовый поиск11, 17
Вход, сессии, права ролей и изоляция организаций5, 18
Деньги без ошибок округления и без двойных списаний1, 6, 9, 12
Кэш, ограничение частоты запросов и работа без Redis7
Очереди сообщений: RabbitMQ, outbox и inbox, недоставленные сообщения8, 13
Сбои внешних сервисов: таймауты, повторы, Circuit Breaker, webhooks и сверка6, 9
Подписки SaaS: списания за период, лимиты тарифа и просрочка12
Выделение сервиса и контракты событий10
Наблюдаемость: журналы, метрики, correlation ID и трассировка10, 17, 20
Kafka: ключи, partitions, группы потребителей, offsets и повторное чтение13, 14, 15, 16
ClickHouse: таблицы, дубли, поздние события и сверка15, 16
Тестирование: модули, контракты, база данных, гонки и отказы1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
Docker, CI, выпуск и миграции2, 4, 18, 19
Безопасность приложения и восстановление из резервной копии18
Нагрузка и system design: SLO, ёмкость и компромиссы17, 20
Работа в команде: оценка задачи, merge request, ревью, отчёт об ошибке и разбор сбоя0, 19, 20
Работа с ИИ-ассистентом и проверка его предложений1, 20

Посмотрите методичку целиком

Так устроена каждая из 21 методички: теория, разобранные примеры, задание, типовые ошибки, самопроверка и вопросы собеседования. Методичка первой недели открыта полностью.

Текст программы собран из текущих версий методичек и обновляется вместе с ними.