Системы и протоколы: Unix, E2E, GraphQL, gRPC, очереди
На уровне Middle+ от тебя ждут понимания этажом ниже и этажом шире: что делает операционная система под твоим рантаймом, как сервисы разговаривают между собой за пределами REST, и как убедиться, что вся эта конструкция работает (E2E) и наблюдаема (метрики). Урок-обзор по шести темам: модель здесь, глубина по ссылкам.
Unix изнутри
Всё, что ты деплоишь, исполняется поверх Unix-подобной системы, и её устройство протекает в твою работу: контейнеры это не магия, а комбинация механизмов ядра.
Опорные понятия:
- Kernel против user space. Программы живут в user space и просят ядро о любом вводе-выводе через syscalls. Поэтому «много мелких чтений с диска» медленнее «одного большого».
- Процессы и потоки. Процесс владеет изолированной виртуальной
памятью, потоки делят память процесса.
forkплюсexecэто способ Unix запускать программы, и именно так твой шелл запускаетnode. - Виртуальная память. Каждый процесс видит собственное адресное
пространство, ядро отображает страницы на физическую память. Отсюда
swap, page fault и то, почему RSS в
topне равен «занятой памяти». - IPC. Пайпы, сокеты, разделяемая память, сигналы: способы
процессов общаться.
killне «убить», а «послать сигнал». - Демоны и init. Долгоживущие фоновые процессы под управлением
systemd: рестарты, зависимости, логи вjournald. - Namespaces и cgroups. Linux namespaces изолируют видимость, cgroups ограничивают ресурсы. Docker это оркестрация поверх этих двух механизмов плюс слоёная файловая система.
Классическая книга по теме: Робачевский, «Операционная система UNIX». Практическая сторона (сервер, systemd, мониторинг руками) в уроке Sysops и Linux.
E2E всерьёз
E2E-тест проверяет систему так, как её видит пользователь: браузер, настоящий бэкенд, настоящая база. За эту честность платим скоростью и хрупкостью, поэтому E2E-тестов мало и они покрывают только критические пути.
Что отличает зрелый E2E-набор:
- Управляемые данные. Seeds создают известное состояние базы перед тестом; тест не зависит от того, что оставил предыдущий.
- Page Object. Селекторы и действия страницы инкапсулированы в один класс: меняется вёрстка, меняется одно место, а не сорок тестов.
- Ожидания вместо sleep.
await expect(locator).toBeVisible()вместоsleep(3000): главный источник flaky-тестов это гонки со временем. - Параллельность. С изолированными данными тесты бегут в несколько воркеров; без изоляции параллельность превращает набор в лотерею.
- Отчёты. Allure или встроенный репортер Playwright с трейсами и скриншотами: упавший E2E без артефактов это загадка, а не сигнал.
Инструменты сегодня: Playwright как дефолт, Cypress как зрелая альтернатива. BDD и Gherkin встречаются там, где сценарии пишут вместе с аналитиками. Нагрузочное тестирование (k6, артиллерия запросов вместо кликов) это отдельная дисциплина с теми же принципами управляемых данных.
Глубина в уроках Что такое E2E, Проблемы E2E и Карантин и flaky.
GraphQL deep-dive
GraphQL переворачивает REST: не сервер решает форму ответа, а клиент запрашивает нужные поля. Схема типизирована, под каждым полем живёт resolver.
Цена гибкости: классическая проблема
N+1.
Запрос «посты с авторами» наивно выполнит один запрос за постами и по
одному за каждым автором.
DataLoader
собирает эти обращения в один WHERE id IN (...).
Когда GraphQL оправдан: много разных клиентов с разными потребностями (web, mobile, партнёры) поверх одних данных. Когда нет: один клиент, один бэкенд, команда без ресурса на схему, кеширование и контроль глубины запросов. Сравнение с REST и gRPC плюс кодогенерация в уроке GraphQL, gRPC и codegen.
дальше после входа
Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.
Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.