Нужно иметь представление о полном цикле обработки HTTP-запроса, начиная от набор URL в адресной строке браузера, заканчивая запросом БД и чтением данных с диска. Потому что можно пользоваться абстракциями пока всё хорошо и ресурсов хватает, но как только наступает факап — нужно понимать как это всё устроено и где могло сломаться.
Применимо к backend программистам в стеке NodeJS, Linux, PostgreSQL, Redis.
По факту, сюда включены вещи которые я знаю и меня раздражает что их кто-то не знает. Сюда не включены вещи, которые я знаю, но они мне ни разу не пригодились (типа нормальной формы в реляционных БД, прочитал однажды ну и ладно). Сюда не включено то что относится к программированию вообще (ООП, паттерны, …), потому что это отдельная тема и нужна не только backend.
- Event loop
- V8 lazy parsing
- виды garbage collectors, анализ дампов памяти
- использование встроенного в NodeJS дебаггера через IDE
- ошибка DNS
- типы записей в DNS
- протокол DNS
- nslookup, dig, whois
- недоступность сервера на физическом уровне
- утилита ping, протокол ICMP
- недоступность сервера на сетевом уровне
- telnet
- механизм работы сокетов, порты
- init, initd (скрипты, команды start, stop, restart, reload), systemd, supervisor
- организация конфигов в /etc, include конфигов /etc/nginx/sites-enabled
- организация логов в /var/log, ротация логов
- базовые команды ls, ln, echo, cat, tail, less, ps, telnet, netstat
- полезные команды grep, awk, sed, find, …
- отвязка от терминала nohup, screen
- перенаправление потоков из файла, в файл
- уровни сигналов kill, обработка сигналов в процессе, статусы процессов, треды
- прокинуть порт наружу ngrok
- количество потоков (ядер), сколько нужно запускать процессов nginx, nodejs, чтобы утилизировать CPU
- как посмотреть загрузку всех ядер CPU
- метрики system, user, wait, что означает высокое значение этих метрик
- context switches, порог значения
- как посмотреть сколько памяти на сервере, сколько памяти потребляет nodejs
- память виртуальная, резидентная, разделяемая
- кэш файловой системы, какие ещё кэши в linux
- ограничения файловой системы, пропускная способность в мегабайтах/сек и в количестве операций чтения/записи
- ограничения сетевой системы, пропускная способность в мегабитах/сек и количестве пакетов/сек
- лимиты ОС: ulimit, sysctl, максимальное количество открытых файлов (а сокеты это файловые дескрипторы)
- многопроцессная модель PostgreSQL, асинхронная модель Redis
- как происходит обработка SQL запроса
- сокет между клиентом и БД
- стадии парсинга
- системные словари со схемой БД
- что-нибудь про оптимизацию PostgreSQL, пересчёт плана оптимизации во время анализа БД
- как используются индексы (хоть пару видов рассмотреть)
- как хранятся данные на диске (column-oriented storage для прикола)
- какие буферы памяти есть в PostgreSQL: workmem, shared mem, для чего используется, как посмотреть в explain analyze когда не хватает
- как работают транзакции, вложенные транзакции PostgreSQL, уровни изоляции транзакций, dead lock
- где кэшируем: память, диск, key-value storage (memcahed, redis и его расширенный API)
- что кэшируем: объекты БД, наборы данных backend, полностью HTML страницы
- стратегия инвалидации: по времени, по изменению связанных данных (тегам)
Этот раздел я включил на тот случай, если кому-то придёт в голову обрабатывать 10k+ объектов в NodeJS, а не в БД.
- Оценка сложности алгоритма
- Виды структур данных: массив, список, сет, hashmap, …, как они реализованы, почему реализация структуры данных важно на больших объёмах
- Виды сортировок, сложность и требования по памяти
- асинхронная модель nginx
- понятия worker, server, location, upstream, proxy_pass, cache
- как написать минимальный конфиг прокидывающий запросы к nodejs, раздающий статику
- балансировка upstream’ов
- как настроить кэширование:
- прописать http-заголовки для кэширования браузером
- настроить собственное кэширование в памяти nginx, cache lock
- уровни модели OSI
- как пакеты протокола прикладного уровня HTTP упаковываются в пакеты протокола транспортного TCP, потом передаются фреймами физического уровня Ethernet, Wi-Fi
- как устроен роутинг пакетов на уровне TCP, как пакет вообще попадает от компьютера с браузером к серверу с NodeJS
- как устроен протокол HTTP, HTTP/2
- пакет попадает в сетевую карту
- сетевая карта помещает пакет в буфер памяти и генерирует прерывание
- сетевой процесс linux читает пакет из буфера и обрабатывает
- что означает высокое использование CPU процессом ksoftirqd
- Nginx <=> NodeJS
- NodeJS <=> Redis
- NodeJS <=> PostgreSQL
- CDN — внешнее распределённое хранилище файлов as a service (Amazon S3), nginx с кэшем (cdnnow)
- хранилища, БД:
- key-value storage (Redis, Memcached), распределённые (etcd)
- распределённые файловые хранилища (GlusterFS)
- документо-ориентированные БД (MongoDB)
- граф-ориентированные БД
- объектно-ориентированные БД
- in-memory БД (в том числе Redis)