Skip to content

Instantly share code, notes, and snippets.

@melfa
Last active March 5, 2024 12:38
Show Gist options
  • Save melfa/8df19e80db74940f1798439af74da96d to your computer and use it in GitHub Desktop.
Save melfa/8df19e80db74940f1798439af74da96d to your computer and use it in GitHub Desktop.
Теоретический минимум mid backend

Цель

Нужно иметь представление о полном цикле обработки HTTP-запроса, начиная от набор URL в адресной строке браузера, заканчивая запросом БД и чтением данных с диска. Потому что можно пользоваться абстракциями пока всё хорошо и ресурсов хватает, но как только наступает факап — нужно понимать как это всё устроено и где могло сломаться.

Применимо к backend программистам в стеке NodeJS, Linux, PostgreSQL, Redis.

По факту, сюда включены вещи которые я знаю и меня раздражает что их кто-то не знает. Сюда не включены вещи, которые я знаю, но они мне ни разу не пригодились (типа нормальной формы в реляционных БД, прочитал однажды ну и ладно). Сюда не включено то что относится к программированию вообще (ООП, паттерны, …), потому что это отдельная тема и нужна не только backend.

Нужно понимать на среднем уровне

NodeJS

  • Event loop
  • V8 lazy parsing
  • виды garbage collectors, анализ дампов памяти
  • использование встроенного в NodeJS дебаггера через IDE

Понимание причины ошибок при открытии страницы в браузере

  • ошибка DNS
    • типы записей в DNS
    • протокол DNS
    • nslookup, dig, whois
  • недоступность сервера на физическом уровне
    • утилита ping, протокол ICMP
  • недоступность сервера на сетевом уровне
    • telnet
    • механизм работы сокетов, порты

Экосистема linux

  • 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

  • асинхронная модель 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

  • пакет попадает в сетевую карту
  • сетевая карта помещает пакет в буфер памяти и генерирует прерывание
  • сетевой процесс 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment