Backend — серверная часть приложения: код, который принимает HTTP-запросы, проверяет данные и права, выполняет правила бизнеса, работает с базой данных и внешними сервисами и возвращает ответ. Пользователь его не видит и не может изменить, поэтому всё, от чего зависят деньги, доступы и сохранность данных, решается именно здесь. Минимальный backend — это процесс с API, база данных, конфигурация в переменных окружения и логи; по мере роста к нему добавляются кэш, очереди и фоновые обработчики.
После материала вы сможете
- перечислить обязанности backend — валидация, бизнес-логика, хранение, права, интеграции — и шаги обработки одного запроса
- решить, какую работу выполнять внутри запроса, а какую выносить в очередь и worker
- объяснить, почему HTTP не хранит состояние, где хранить сессии и почему не в памяти процесса
- выбрать стек для учебного проекта — Node.js, Java/Spring или Python — и обосновать выбор
Содержание
- Что делает сервер за один запрос
- Обязанности backend: валидация, логика, хранение, права, интеграции
- Синхронные запросы и фоновая работа
- Состояние: где его хранить и почему сервер «забывает»
- Логи, конфигурация и внешние сервисы
- Стеки: Node.js, Java/Spring, Python — чем отличаются
- Практика: схема backend для онлайн-записи и что дальше
Что делает сервер за один запрос
В уроке о том, как устроен сайт, backend был «кухней ресторана», а в уроке про HTTP и JSON мы разобрали, из чего состоят запрос и ответ. Здесь посмотрим, что происходит внутри сервера между ними. MDN описывает задачу серверного кода так: проверить присланные данные и сам запрос, сохранить или получить данные из базы и отправить клиенту нужный ответ. На практике один запрос «записаться на стрижку в пятницу в 15:00» проходит примерно такой путь:
Маршрутизация
Сервер смотрит на метод и путь — например,
POST /api/bookings— и выбирает функцию-обработчик. Обработчик (handler) — функция, которая отвечает за один тип запроса.Аутентификация
Кто прислал запрос? Сервер проверяет cookie сессии или токен и находит пользователя. Нет подтверждения — ответ 401.
Валидация
Пришли ли все поля, правильного ли они типа, не в прошлом ли дата. Ошибка во входных данных — ответ 400 с понятным описанием, а не падение сервера.
Бизнес-логика и права
Работает ли салон в это время, свободен ли мастер, может ли этот клиент записываться. Нарушено правило — 409 или 403.
Хранение
Запись сохраняется в базе данных — так, чтобы два одновременных запроса не заняли одно окно.
Ответ и след в логах
Клиент получает 201 и созданную запись, а в лог уходит строка о том, что произошло и сколько это заняло.
Обязанности backend: валидация, логика, хранение, права, интеграции
Серверный код, в отличие от кода в браузере, имеет полный доступ к операционной системе и может быть написан на любом языке — это MDN отмечает как главное различие клиентской и серверной разработки. Вместе с доступом сервер получает ответственность. Удобно разложить её на пять обязанностей — на примере сервиса онлайн-записи в салон.
Валидация
- Что это значит
- Не пускать дальше данные неверной формы и типа
- Пример: онлайн-запись
- Телефон в правильном формате, дата не в прошлом, услуга существует
Бизнес-логика
- Что это значит
- Правила предметной области, которые нельзя доверить клиенту
- Пример: онлайн-запись
- Длительность услуги, рабочие часы мастера, запрет двойной записи
Хранение
- Что это значит
- Надёжно записать и быстро найти данные
- Пример: онлайн-запись
- Клиенты, мастера, услуги и записи в базе данных
Права
- Что это значит
- Кто и что может видеть и менять
- Пример: онлайн-запись
- Клиент видит свои записи, мастер — своё расписание, администратор — всё
Интеграции
- Что это значит
- Обмен с внешними системами через их API
- Пример: онлайн-запись
- SMS или сообщение в мессенджер, онлайн-оплата предоплаты, календарь
Аутентификация и авторизация звучат похоже, но это разные шаги. Аутентификация отвечает на вопрос «кто это?», авторизация — «что ему можно?». Пользователь может быть успешно аутентифицирован и всё равно не иметь права отменить чужую запись. Обоим шагам в направлении посвящены отдельные уроки.
Синхронные запросы и фоновая работа
Не всё нужно делать, пока пользователь ждёт ответа. Сохранить запись — нужно: без этого нельзя сказать «вы записаны». А отправить SMS-напоминание, пересчитать отчёт или сжать загруженное фото можно чуть позже. Такую работу выносят в фоновые задачи (background jobs): обработчик запроса кладёт задание в очередь и сразу отвечает, а отдельный процесс-обработчик (worker) забирает задания из очереди и выполняет их.
Синхронно, внутри запроса
- Пользователь ждёт, пока всё закончится
- Результат нужен для ответа: создана ли запись, сколько стоит заказ
- Медленный внешний сервис замедляет и ваш ответ
- Сбой внешнего сервиса превращается в ошибку для пользователя
В фоне, через очередь
- Ответ уходит сразу, работа выполняется отдельным процессом
- Подходит для писем, SMS, отчётов, обработки файлов, вебхуков
- Задание можно повторить при сбое
- Нужно хранить статус задания и следить за очередью
Методология The Twelve-Factor App описывает это как разные типы процессов: HTTP-запросы обслуживает web-процесс, а долгие фоновые задачи — worker-процесс. Сама очередь — ещё один внешний сервис наравне с базой данных: брокер сообщений вроде RabbitMQ, хранилище Redis или таблица заданий в той же PostgreSQL. Что выбрать, зависит от объёма и требований к надёжности; подробно — в уроке о фоновых задачах.
Состояние: где его хранить и почему сервер «забывает»
HTTP по умолчанию не хранит состояние (stateless): каждый запрос для сервера — новый, он не помнит, что этот же браузер секунду назад вошёл в аккаунт. Чтобы «помнить» пользователя, сервер после входа выдаёт cookie с идентификатором сессии, браузер прикладывает его к каждому следующему запросу, а сервер по идентификатору находит данные сессии. Так этот механизм описывает MDN.
Ключевой вопрос — где лежат данные сессии и всё остальное, что нужно помнить между запросами. Соблазнительно положить их в переменную в памяти процесса: это работает на ноутбуке и ломается в продакшене. Twelve-Factor App требует, чтобы процессы приложения были stateless и ничего не делили между собой, а всё, что должно сохраниться, лежало во внешнем хранилище. Причина простая: перезапуск при деплое стирает память процесса, а при нескольких копиях сервера следующий запрос может попасть в другую копию.
Память процесса
- Что там уместно
- Кэш на время одного запроса, справочник, который можно пересобрать
- Чего ждать
- Пропадёт при перезапуске; у каждой копии сервера своя
База данных
- Что там уместно
- Пользователи, записи, заказы — всё, что нельзя потерять
- Чего ждать
- Надёжно, с транзакциями и резервными копиями
Хранилище с истечением срока (Redis, Memcached)
- Что там уместно
- Сессии, кэш, счётчики лимитов
- Чего ждать
- Быстро, данные живут заданное время; Twelve-Factor App прямо советует его для сессий
Cookie в браузере
- Что там уместно
- Идентификатор сессии, настройки интерфейса
- Чего ждать
- Пользователь может прочитать и изменить значение — не храните там права и цены
Логи, конфигурация и внешние сервисы
Пользователь не видит backend, но и разработчик видит его только через логи. Лог — поток событий: «запрос пришёл», «запись создана», «SMS-сервис ответил ошибкой». Twelve-Factor App советует приложению не управлять файлами логов, а писать события в стандартный вывод (stdout) по одному на строку; собирать, хранить и искать их — задача окружения: хостинга, контейнерной платформы, системы сбора логов.
- Пишите в лог метод, путь, код ответа, длительность и идентификатор запроса — по ним ищут проблему
- Ошибки логируйте со стеком вызовов на сервере, а клиенту отдавайте короткое сообщение без внутренних деталей
- Никогда не пишите в лог пароли, токены, номера карт и полные персональные данные
- Настройки, которые меняются между окружениями — адрес базы, ключи сервисов, — храните в переменных окружения, а не в коде
Последний пункт — тоже из Twelve-Factor App: конфигурация отделена от кода, и проверка простая — код можно было бы в любой момент открыть публично, не раскрыв ни одного ключа. Там же база данных, очередь, почтовый сервис и кэш названы подключаемыми ресурсами (backing services): приложение обращается к ним по адресу из конфигурации и не знает, локальные они или облачные. Заменить одну базу на другую — значит поменять переменную, а не код.
- 01КлиентыСайт, мобильное приложение, админка, внешние системы с вебхуками
- 02API-процессМаршруты, аутентификация, валидация, бизнес-логика, ответы и логи
- 03WorkerФоновые задания из очереди: напоминания, отчёты, обработка файлов
- 04Подключаемые ресурсыБаза данных, хранилище сессий и очереди, почта и SMS, файловое хранилище
Стеки: Node.js, Java/Spring, Python — чем отличаются
Все обязанности из этого урока одинаковы в любом стеке — меняются язык, инструменты и то, сколько фреймворк делает за вас. MDN замечает, что серверную часть почти никогда не пишут без фреймворка: он берёт на себя маршрутизацию, разбор запросов, сессии, доступ к базе. Фреймворки бывают «всё включено», как Django, и минималистичные, как Express или Flask, где недостающее подключается отдельными библиотеками.
JavaScript / TypeScript на Node.js
- Фреймворки
- Express — минимальный; NestJS — со структурой модулей
- Сильные стороны
- Один язык с фронтендом, асинхронная модель для большого числа одновременных запросов
- Что учесть
- Express почти ничего не диктует: структуру, валидацию и работу с базой выбираете сами
Java / Kotlin
- Фреймворки
- Spring Boot
- Сильные стороны
- Строгая типизация, зрелая экосистема, встроенные сервер, безопасность, метрики и health checks
- Что учесть
- Больше понятий и конфигурации на старте, нужен JDK
Python
- Фреймворки
- FastAPI — для API; Django — «всё включено» с ORM и админкой
- Сильные стороны
- Быстрый старт; FastAPI строит валидацию и документацию OpenAPI на подсказках типов
- Что учесть
- Для тяжёлых вычислений и большого числа запросов важно правильно выбрать модель выполнения
Для учебного проекта выбирайте стек по тому, что вы уже знаете. Пишете фронтенд на JavaScript — начните с Node.js: не нужно учить второй язык одновременно с серверными понятиями. Учите Python — FastAPI даст рабочий API с документацией в несколько десятков строк. Целитесь в крупные компании и банковскую разработку — смотрите на Java и Spring Boot. По нашему опыту, переход между стеками даётся легко, если понятны сами обязанности backend: маршрут, валидация, логика, хранение, права.
Практика: схема backend для онлайн-записи и что дальше
Соберите всё вместе на одном сервисе. Салону нужен сайт, где клиент выбирает услугу, мастера и время; администратор видит расписание; клиенту за день до визита приходит напоминание. Прежде чем писать код, нарисуйте backend на бумаге — так вы увидите, какие части нужны и где хранится каждое состояние.
Дальше направление идёт от инструментов к архитектуре. Сначала — Node.js: модули, npm и первый HTTP-сервер без фреймворка. Затем Express: CRUD-API с валидацией и единым форматом ошибок. Параллельные ветки — Java со Spring Boot и Python с FastAPI или Django. После них — аутентификация, авторизация, фоновые задачи, тестирование backend и слои backend-приложения. Для работы с хранением понадобится направление «Базы данных».
- Могу перечислить шаги обработки одного запроса: маршрут, вход, валидация, логика, хранение, ответ, лог
- Понимаю, почему проверки на клиенте не заменяют проверки на сервере
- Знаю, какую работу выносить в очередь и почему задание должно переживать повтор
- Объясню, почему сессии не хранят в памяти процесса
- Знаю, что пишут в лог и чего туда писать нельзя
- Выбрал стек для учебного проекта и могу объяснить почему