Backend Typescript 1.0.0 Help

Backend

Что такое серверная разработка

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

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

  • Сервер — «источник истины»: хранит и валидирует состояние, управляет побочными эффектами (отправка писем, списание средств, очереди задач).

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

Какие задачи решает сервер

  • Транспорт: принятие соединений, парсинг протокола (HTTP/2, HTTP/3, gRPC, GraphQL-over-HTTP, WebSocket), формирование ответов.

  • Бизнес-логика: правила, валидация, расчёты, агрегирование данных.

  • Доступ к данным: чтение/запись в базы данных, кэши, файловые и объектные хранилища.

  • Интеграции: взаимодействие с внешними сервисами (платёжки, почта, сторонние API).

  • Безопасность: аутентификация, авторизация, шифрование, аудит.

  • Надёжность: обработка ошибок, ретраи, идемпотентность, очереди, дедупликация.

  • Масштабирование: горизонтальное и вертикальное, балансировка, разделение нагрузки, очереди и стримы.

  • Наблюдаемость: логи, метрики, трассировки, алёрты.

  • Операции: конфигурация, миграции схемы данных, деплой, откаты.

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

Любой протокол сводится к последовательности шагов: принять запрос, проверить, преобразовать, выполнить действие, вернуть ответ и записать следы.

  • Приём: чтение заголовков, тела, ограничение размеров и времени.

  • Аутентификация: установление личности (токен, ключ, сертификат).

  • Авторизация: проверка прав на конкретное действие и ресурс.

  • Валидация: проверка формата и семантики входных данных.

  • Бизнес-операция: вызов доменных служб, транзакции, взаимодействие с БД и очередями.

  • Формирование ответа: правильный статус/код ошибки, заголовки, сериализация.

  • Наблюдаемость: лог, метрики, трассировка с корреляционным ID.

Состояние: статeless vs stateful

Stateless сервер не хранит сессию между запросами — все данные приходят в каждом запросе. Stateful сервер хранит часть состояния (сессии, подписки, сокеты).

  • Stateless проще масштабировать и балансировать: любой узел может обработать любой запрос.

  • Stateful нужен для длительных соединений, очередей, игр, realtime; требует прилипания сессий или внешнего хранилища состояния.

Модель исполнения: конкурентность и ввод-вывод

Серверы в основном связаны с ожиданием ввода-вывода (I/O). Существует два подхода: асинхронный неблокирующий (event loop, реактивные потоки) и многопоточный (thread-per-request, пул потоков).

  • Асинхронный стиль масштабируется при большом числе параллельных I/O-операций.

  • Потоки проще для CPU-связанной логики, но дороже по памяти и переключениям контекста.

Данные и хранение

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

  • Реляционные БД: строгие схемы, транзакции, JOIN; хороши для критичных инвариантов.

  • NoSQL: документо- и ключ-значение хранилища для больших объёмов и гибких схем.

  • Кэш: Redis/Memcached для низкой задержки чтения горячих данных.

  • Очереди/стримы: брокеры сообщений для асинхронной обработки и интеграций.

  • Файлы/объекты: блобы в объектных хранилищах, CDN для раздачи.

Проектирование интерфейсов (API)

API — контракт между сервером и потребителями (веб, мобильные клиенты, другие сервисы).

  • Ясные ресурсы и операции: предсказуемые пути, семантика методов, коды статуса.

  • Стабильные схемы: версионирование, обратная совместимость, депрекейшн-план.

  • Ошибки: единый формат, коды, поля code, message, details.

  • Пагинация/фильтры: limit/offset или курсоры; предсказуемые ответы.

Безопасность по умолчанию

  • Аутентификация: токены, mTLS, ключи; минимальный набор прав по принципу наименьших привилегий.

  • Авторизация: роли/политики (RBAC/ABAC); проверка на каждом действии.

  • Валидация: типы, длины, форматы, допустимые диапазоны.

  • Защита транспорта: HTTPS/TLS, HSTS, современные шифры.

  • Секреты: хранилища секретов, ротация ключей, минимизация экспозиции.

  • Входные лимиты: ограничение размеров тела, rate limiting, captcha для публичных форм.

  • Журналы аудита: кто, что, когда и откуда сделал с чувствительными объектами.

Надёжность: ошибки, ретраи, идемпотентность

Сбои — норма в распределённых системах. Сервер обязан корректно их переживать.

  • Классификация ошибок: клиентские (4xx) vs серверные (5xx); временные vs постоянные.

  • Ретраи: экспоненциальная задержка, джиттер; только для идемпотентных или с ключами Idempotency-Key.

  • Компенсации: саги и обратные действия при частичных отказах.

  • Очереди: повторная обработка, dead-letter очереди, лимиты попыток.

Производительность и масштабирование

  • Кэширование: результаты запросов, агрегаты, метаданные; стратегия инвалидации.

  • Пулы соединений: к БД и внешним сервисам; таймауты и лимиты.

  • Профилирование: горячие точки CPU/I-O, медленные запросы, индексы.

  • Горизонтальное масштабирование: несколько экземпляров за балансировщиком.

  • Разделение нагрузки: очереди, шедулеры, бэкграунд-джобы.

Наблюдаемость: логи, метрики, трассировки

Нельзя управлять тем, чего не видишь.

  • Логи: структурированные, с уровнями (info/warn/error), кореляционными ID, полями запроса/ответа.

  • Метрики: счётчики, таймеры, гистограммы (RPS, p95, ошибки, использование памяти/CPU).

  • Трассировки: распределённые спаны между сервисами, контекст передаётся заголовками.

  • Алёрты: SLO/SLA, пороги и уведомления, дашборды.

Конфигурация и миграции

  • Конфиги из окружения: без хардкода; валидация при старте.

  • Миграции БД: версионирование схемы, идемпотентные апдейты, откаты.

  • Фичефлаги: поэтапный rollout, A/B-тесты, тёмные релизы.

Тестирование и качество

  • Юнит-тесты: проверяют чистые функции/правила домена.

  • Интеграционные: взаимодействие слоёв, БД, очереди.

  • E2E: полный путь запроса; контракты с внешними API (consumer-driven contracts).

  • Нагрузочные: производительность и деградации под давлением.

  • Безопасность: статический анализ, fuzzing, негативные сценарии.

Организация кода без привязки к фреймворку

Структура следует от домена и потоков данных. Модули должны быть слабо связаны и иметь чёткие интерфейсы.

Краткий чек-лист начинающего бэкенд-разработчика

  • Понимай жизненный цикл запроса и расставляй обязательные «рамки»: аутентификация → авторизация → валидация → бизнес-операция → ответ → следы.

  • Проектируй API как контракт: стабильность, ошибки, версия, пагинация.

  • Думай о данных: транзакции, индексы, миграции, резервные копии.

  • Закладывай надёжность: ретраи, идемпотентность, очереди, таймауты, лимиты.

  • Масштабируй осознанно: измеряй, кэшируй, разделяй нагрузку.

  • Делай систему наблюдаемой: логи, метрики, трассировки и алёрты.

  • Автоматизируй тесты и деплой; береги секреты.

Last modified: 01 October 2025