Backend.
Важные вопросы и детали

Шпаргалка по серверной разработке: от HTTP до Kubernetes

Основы Backend разработки

Backend — серверная часть приложения. Пользователь его не видит, но именно он отвечает за бизнес-логику, работу с БД, аутентификацию и обработку запросов.

💻 Клиент(браузер / app) HTTP Request JSON Response 🖥 Сервербизнес-логикаauth / API 🗄 БДMySQL/MongoDB

Классическая архитектура: клиент ↔ сервер ↔ база данных

Frontend vs Backend

ХарактеристикаFrontendBackend
Что делаетИнтерфейс пользователяБизнес-логика
Где работаетБраузер (клиент)Сервер
ЯзыкиHTML, CSS, JS (React…)Java, Python, Node.js, Go…
ЦельUI/UXФункциональность, безопасность, данные
ВзаимодействиеНапрямую с пользователемНеявно (через API)

Что происходит при вводе URL?

1. URLвведён 2. DNS→ IP 3. HTTPзапрос 4. Обработкана сервере 5. ОтветHTML/JSON 6. Рендербраузером

Популярные технологии

HTTP, HTTPS и веб-коммуникация

HTTP — протокол прикладного уровня для связи клиента и сервера. Работает по модели «запрос → ответ» и является stateless.

HTTPS добавляет шифрование SSL/TLS. Порт 443 (у HTTP — 80). Защищает от перехвата и подмены данных.

HTTP методы

МетодНазначениеIdempotentSafe
GETПолучить данные✅✅
POSTСоздать ресурс❌❌
PUTОбновить целиком✅❌
PATCHОбновить частично❌❌
DELETEУдалить✅❌

Коды состояний

КодЗначениеПримеры
1xxИнформационный100 Continue
2xxУспех200, 201, 204
3xxПеренаправление301, 302, 304
4xxОшибка клиента400, 401, 403, 404
5xxОшибка сервера500, 502, 503

Важные заголовки

Stateless vs Stateful

HTTP не запоминает состояние между запросами. Для «памяти» используют cookies, сессии или JWT токены.

REST API и веб-сервисы

API — набор правил для общения программ. REST — архитектурный стиль построения таких интерфейсов: stateless, resource-based URLs, стандартные HTTP методы, JSON формат.

6 принципов REST

  1. Client-Server — разделение ответственности
  2. Statelessness — нет состояния между запросами
  3. Cacheability — ответы можно кешировать
  4. Uniform Interface — единый интерфейс
  5. Layered System — многослойность
  6. Code on Demand (опционально)

REST vs SOAP

RESTSOAP
ТипАрхит. стильПротокол
ДанныеJSONXML
СкоростьБыстрееМедленнее
СложностьПростаяВысокая
StateStatelessStateful

JSON vs XML

JSONXML
ВесЛёгкийМногословный
ЧитаемостьОтличнаяСредняя
Типы данныхМассивы, объектыОграниченные
ИспользованиеREST APILegacy, SOAP
Идемпотентность: GET, PUT, DELETE идемпотентны (несколько вызовов = один результат). POST — нет (каждый вызов создаёт новый ресурс).

Java и основы ООП

JVM, JRE и JDK

JDK(Development Tools) JRE(Libraries + JVM) JVM(Executes bytecode)

Вложенность: JDK ⊃ JRE JVM

ООП концепции

class Animal { void sound() { System.out.println("Animal sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Bark!"); } }

Interface vs Abstract Class

InterfaceAbstract Class
АбстракцияПолнаяЧастичная
МетодыТолько abstract (+default/static с Java 8)Abstract + concrete
Переменныеpublic static finalЛюбые
Multiple inheritance✅ Да❌ Нет
НазначениеКонтрактОбщий код

Collections Framework

ИнтерфейсРеализацииОсобенности
ListArrayList, LinkedListУпорядоченный, дубликаты OK
SetHashSet, TreeSetБез дубликатов
MapHashMap, TreeMapПары key→value
QueuePriorityQueue, LinkedListFIFO / приоритет

Spring Framework и Spring Boot

Spring Framework — open-source фреймворк для enterprise Java: IoC, DI, AOP, модульная архитектура. Spring Boot — надстройка с автоконфигурацией, встроенным Tomcat и starter-зависимостями (convention over configuration).

IoC и Dependency Injection

Контейнер Spring внедряет зависимости извне вместо самостоятельного создания объектами. Снижает связанность, упрощает тестирование.

Spring Container(IoC)управляет бинами injects Service@Autowired repo uses Repo@Repository

Ключевые аннотации

АннотацияНазначениеСлой
@ComponentОбщий биномЛюбой
@ServiceБизнес-логикаService layer
@RepositoryДоступ к даннымDAO layer
@ControllerMVC контроллер (view)Web layer
@RestController= @Controller + @ResponseBodyREST API
@ConfigurationКонфигурационный классJava config
@BeanРучное объявление бинаВнутри @Configuration

Как запускается Spring Boot

main() method SpringApplication.run() Auto-configuration Application Context Scan Components Start Embedded Server ✅ Ready!

Создание REST API на Spring Boot

@RestController = @Controller + @ResponseBody. Первый возвращает HTML-view, второй — сразу JSON/XML данные.

Маппинг запросов

АннотацияHTTP МетодПример пути
@GetMappingGET/api/users/{id}
@PostMappingPOST/api/users
@PutMappingPUT/api/users/{id}
@PatchMappingPATCH/api/users/{id}/email
@DeleteMappingDELETE/api/users/{id}

Path Variable vs Request Param

// Из URL path: /users/42 @GetMapping("/users/{id}") public ResponseEntity<User> getUser(@PathVariable long id) { ... } // Из query string: /users?name=Ayush&age=25 @GetMapping("/users") public ResponseEntity<List<User>> getUsers( @RequestParam String name, @RequestParam int age) { ... }

DTO паттерн

Entity содержит все поля включая внутренние. DTO скрывает лишнее и валидирует входные данные.

Entity (User) @Id private Long id;private String name;private String email;private String password; ← скрыт! convert DTO (UserDTO) private String name;private String email;без id, без password ✅

Валидация

public class UserDTO { @NotEmpty private String name; @Email private String email; @Min(18) private int age; }

Глобальная обработка исключений

@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handle(Exception ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("Error: " + ex.getMessage()); } }

Базы данных и SQL

SQL vs NoSQL

ХарактеристикаSQL (реляционные)NoSQL (нереляционные)
МодельТаблицы, строки, столбцыДокументы, KV, графы, колонки
СхемаФиксированнаяГибкая (schema-less)
ЗапросыSQLРазные (JSON-like, API)
МасштабированиеВертикальноеГоризонтальное
ACIDДаCAP (eventual consistency)
ПримерыMySQL, PostgreSQL, OracleMongoDB, Cassandra, Redis, DynamoDB

Ключи и связи

Student PK │ id │ name │ dept_id │ 1 │ Ayush │ 101 │ 2 │ Rohan │ 102 │ 3 │ Neha │ 101FK ↑ dept_id Foreign Key Department PK │ id │ dept_name │ 101 │ CSE │ 102 │ IT

Связь через Foreign Key: каждый студент ссылается на отдел

JOIN операции

ТипЧто возвращает
INNER JOINТолько совпадающие строки из обеих таблиц
LEFT JOINВсе из левой + совпадения из правой (NULL если нет)
RIGHT JOINВсе из правой + совпадения из левой
FULL OUTER JOINВсе из обеих таблиц
CROSS JOINДекартово произведение (все комбинации)

Нормализация

ACID свойства транзакций

A — Atomicity

Всё или ничего. Либо все операции выполнены, либо ни одной.

C — Consistency

Данные всегда переходят из одного валидного состояния в другое.

I — Isolation

Параллельные транзакции не влияют друг на друга.

D — Durability

После COMMIT изменения сохранятся даже при аварии.

Hibernate, JPA и ORM

ORM — отображение объектов Java в таблицы БД. JPA — спецификация (интерфейс), Hibernate — реализация.

JPAHibernate
ТипСпецификация (API)Реализация JPA
АвторJakarta EEOpen source проект
Query LanguageJPQLHQL (надмножество JPQL)
CacheНе определёнL1 + L2 cache

Пример Entity + Repository

@Entity @Table(name = "students") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @ManyToOne @JoinColumn(name = "dept_id") private Department department; } public interface StudentRepository extends JpaRepository<Student, Long> { List<Student> findByName(String name); }

Связи между сущностями

One-to-One User 1:1 Address One-to-Many Dept 1:N Employee Many-to-One Employee N:1 Dept Many-to-Many Student join tbl Course N:M через промежуточную таблицу Аннотации связей: @OneToOne | @OneToMany(mappedBy="...") | @ManyToOne(fetch=LAZY) | @ManyToMany @JoinColumn(name="fk_col") | @JoinTable(name="student_course", joinColumns=..., inverseJoinColumns=...)
Проблема N+1: Загрузка списка из N сущностей выполняет N дополнительных запросов на связи. Решения: JOIN FETCH, @EntityGraph, batch fetching.

Аутентификация и безопасность

Аутентификация — «Кто ты?». Авторизация — «Что тебе разрешено?».

Session-based vs Token-based

Session-basedToken-based (JWT)
ХранениеНа сервереНа клиенте
StatefulnessStatefulStateless
МасштабируемостьСложнее (sticky sessions)Лучше
CSRFУязвимМенее уязвим
LogoutУдалить сессиюBlacklist / короткий TTL

Структура JWT

Headeralg: HS256, typ: JWT . Payload{ userId, role, exp } . SignatureHMACSHA256(h.p, secret)

JWT = Base64Url(Header) . Base64Url(Payload) . Signature

Хеширование паролей

Password + Salt BCrypt /Argon2 Hash →в БД

Распространённые угрозы

УгрозаОписаниеЗащита
SQL InjectionВнедрение вредоносного SQLPreparedStatement, ORM
XSSВредоносные скрипты в страницахСанитизация вывода, CSP
CSRFПоддельные межсайтовые запросыCSRF токены, SameSite cookies
Brute ForceПеребор паролейRate limiting, lockout
MITMПерехват трафикаHTTPS, certificate pinning

Архитектура и системный дизайн

Монолит vs Микросервисы

Монолит Auth Orders Users Pay Inv ... Один деплой, одна БД Микросервисы Auth svc Order svc User svc Pay svc Inv svc Notif svc Независимый деплой, своя БД у каждого Когда что выбирать: • Монолит: малые/средние проекты, быстрая разработка, одна команда • Микросервисы: большие системы, много команд, разная нагрузка, независимое масштабирование

HLD vs LLD

High Level Design (HLD)

Общая картина: компоненты, их взаимодействие, потоки данных. Отвечает на вопрос «что система делает».

Low Level Design (LLD)

Детали: классы, методы, схемы БД, API контракты. Отвечает на вопрос «как система реализована».

Load Balancing

Clients Load BalancerRound Robin / Least Conn / IP Hash Server 1 Server 2 Server 3

Кеширование, Redis и производительность

Кеширование — хранение часто используемых данных в быстром доступе (RAM), чтобы не обращаться к медленной БД каждый раз.

Flow Cache-Aside

Client CheckCache HIT ✓ Return cached MISS ✗ Fetch from DB Store in cache+TTL

Redis basics

Redis — in-memory key-value хранилище. Строки, списки, множества, хэши, sorted sets. Кеширование, сессии, rate limiting, очереди.

КомандаОписаниеПример
SET / GETЗаписать / прочитатьSET user:1:name "Ayush"
DELУдалить ключDEL user:1
EXPIREУстановить TTL (сек)EXPIRE session:abc 3600
HSET / HGETHash поляHSET user:1 email "a@b.com"
LPUSH / LRANGEСписок слева / диапазонLPUSH tasks "send_email"
SADD / SMEMBERSSet операцииSADD online_users "ayush"
ZADD / ZRANGESorted set (лидерборды)ZADD lb 100 "player1"

Redis vs Memcached

RedisMemcached
Структуры данныхString, List, Set, Hash, Sorted Set…Только String
PersistenceRDB + AOFНет
РепликацияДаНет
Pub/SubДаНет
ПроизводительностьВысокаяОчень высокая (проще)

Инвалидация кеша

Асинхронная обработка и messaging

Асинхронная обработка позволяет выполнять длительные задачи в фоне, не блокируя основной поток пользователя.

Sync vs Async

СинхроннаяАсинхронная
ВыполнениеЖдёт завершенияНе ждёт
ОтветМедленнееБыстрее (ACK мгновенно)
РесурсыБлокирует потокНеблокирующая
ПримерREST вызовMessage Queue, Event-driven

Message Queue архитектура

Producer(Service A) Send msg Message Broker RabbitMQ / Kafka / SQS Consume Consumer(Service B)

Kafka vs RabbitMQ

KafkaRabbitMQ
ТипDistributed streaming platformTraditional message broker
МодельTopics → Partitions → Consumer GroupsExchanges → Queues → Bindings
ThroughputОчень высокий (млн msg/sec)Высокий, но ниже Kafka
RetentionСохраняет историю (days/weeks)Удаляет после consumption
Use caseEvent sourcing, log aggregation, analyticsTask queues, microservice comm

Архитектура Kafka

Producerpublishes Kafka Cluster Topic: orders P0 P1 P2 P3 Topic: events P0 P1 P2 Consumer Group 1 Consumer 1 Consumer 2 Consumer Group 2 Consumer 3 Consumer 4

Каждая partition читается только одним consumer'ом внутри группы

Best practices: делайте потребителей идемпотентными, используйте DLQ для failed messages, отслеживайте lag очереди, обеспечивайте at-least-once или exactly-once delivery.

Docker, Kubernetes и DevOps

CI/CD Pipeline

CodeDeveloper BuildJenkins/GHA TestUnit+Integration DeployDocker/K8s MonitorPrometheus/Grafana

Docker основы

Docker упаковывает приложение со всеми зависимостями в контейнер — изолированный, переносимый юнит.

# Dockerfile FROM openjdk:17-slim WORKDIR /app COPY target/my-app.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
КомандаДействие
docker build -t myapp .Собрать образ
docker run -d -p 8080:8080 myappЗапустить контейнер
docker psСписок запущенных
docker logs <container>Логи контейнера
docker-compose upMulti-service стек

Kubernetes архитектура

Control Plane («мозг кластера») kube-apiserverвход для всех etcdпамять schedulerвыбирает узел controller mgrследит за состоянием controller manager следит, чтобы факт совпадал с желаемым управляет управляет Worker Node 1 Pod Acontainer Pod Bcontainer Pod Csidecar kubelet · kube-proxy · runtime (агенты, которые выполняют команды) Worker Node 2 Pod Dreplica Pod Eдругое Pod Fapp kubelet · kube-proxy · runtime (агенты, которые выполняют команды)

Control plane принимает решения, worker nodes исполняют поды

Основные объекты K8s

ОбъектНазначение
PodМинимальная единица (1+ контейнера)
DeploymentУправляет replicas подов, rolling updates
ServiceСтабильный network endpoint для группы подов
ConfigMapНеконфиденциальные конфиги
SecretКонфиденциальные данные (base64)
IngressHTTP routing извне кластера
NamespaceЛогическая изоляция ресурсов
HelmPackage manager для K8s приложений

Способы установки K8s

Мониторинг, логирование и Observability

Observability — способность понять внутреннее состояние системы по её внешним выходным сигналам. Три столпа: метрики, логи, трейсы.

Три столпа Observability

Metrics (Метрики)

Числовые данные во времени: CPU usage, memory, request rate, latency, error count. Агрегируются, дешёвые в хранении.

Logs (Логи)

Текстовые события с timestamp: ошибки, warnings, debug info. Детализированные, дорогие в объёме.

Traces (Трейсы)

Сквозная трассировка запроса через микросервисы. Показывают где bottleneck, как распределена задержка.

Prometheus + Grafana

Prometheus — time-series database для сбора и хранения метрик. Pull-модель: сам ходит по endpoints /metrics. Grafana — визуализация дашбордов поверх Prometheus/Loki/Elasticsearch.

App/metrics pull PrometheusTSDB + PromQLalerts rules GrafanaDashboardsvisualization Alertmanagernotifications

Ключевые RED-методология метрик

МетрикаЧто измеряетПример PromQL
RateRequests per secondrate(http_requests_total[5m])
ErrorsError rate (%)sum(rate(errors_total[5m])) / sum(rate(requests_total[5m]))
DurationLatency percentileshistogram_quantile(0.95, http_request_duration_seconds_bucket)

ELK Stack (Elasticsearch, Logstash, Kibana)

Популярный стек для централизованного логирования:

Альтернатива: Loki (графана) — более легковесный, индексирует только labels не содержимое логов. Экономит ресурсы.

Distributed Tracing

В микросервисной архитектуре один пользовательский запрос проходит через десятки сервисов. Трейсинг восстанавливает полную картину:

ИнструментОсобенности
JaegerOpenTelemetry native, CNCF graduated project
ZipkinЛёгкий, простой deployment
TempoGrafana Labs, интеграция с Loki/Grafana
OpenTelemetryVendor-neutral SDK/API/spec для metrics/logs/traces

Health Checks в K8s

Тип probeНазначениеКогда использовать
livenessProbeRestart container if failsПриложение зависло / deadlock
readinessProbeRemove from Service endpointsЕщё не готов принимать traffic (warmup, migration)
startupProbeDelay liveness/readiness checksМедленно стартующие приложения (>60s init)
# Пример health check в Deployment YAML spec: containers: - name: api image: my-api:latest livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 5 periodSeconds: 5

Logging best practices

Сценарные задачи и System Design

Типовые задачи проектирования систем и ключевые моменты для каждой:

URL Shortener (bit.ly)

Chat Application (WhatsApp)

E-commerce Backend (Amazon)

Notification System

Rate Limiter

Вопросы и ответы

Ниже собраны вопросы из всех разделов с краткими ответами.

Основы Backend

Что такое backend разработка?

Ответ: Серверная часть приложения, отвечающая за бизнес-логику, работу с БД, аутентификацию и API.

Пользователь не видит бэкенд напрямую, но именно он обеспечивает всю функциональность.

Чем отличается frontend от backend?

Ответ:

  • Frontend — клиентская часть (браузер), отвечает за UI/UX, использует HTML/CSS/JS.
  • Backend — серверная часть, отвечает за логику, данные, безопасность, использует Java/Python/Node.js.
Что происходит при вводе URL в браузере?

Ответ:

  1. DNS-запрос для получения IP-адреса
  2. Установка TCP соединения
  3. Отправка HTTP-запроса на сервер
  4. Сервер обрабатывает запрос (бизнес-логика + обращение к БД)
  5. Возврат HTTP-ответа (HTML/JSON)
  6. Браузер рендерит страницу
Каковы обязанности backend разработчика?

Ответ:

  • Проектирование серверной логики
  • Создание и поддержка REST API
  • Работа с базами данных (SQL/NoSQL)
  • Реализация аутентификации и авторизации
  • Настройка серверов и деплой
  • Обеспечение безопасности приложения
  • Оптимизация производительности и масштабируемости
  • Работа с инструментами DevOps и облачными платформами

HTTP и HTTPS

Разница между HTTP и HTTPS?

Ответ: HTTPS = HTTP + TLS/SSL шифрование.

  • HTTP передаёт данные открытым текстом (порт 80)
  • HTTPS шифрует весь трафик (порт 443), защищая от перехвата и подмены
В чём разница между PUT и PATCH?

Ответ:

  • PUT заменяет ресурс целиком (идемпотентен)
  • PATCH обновляет только указанные поля

Пример: PUT меняет весь объект User, PATCH меняет только email.

Что такое stateless протокол?

Ответ: Сервер не хранит информацию о предыдущих запросах клиента. Каждый запрос должен содержать всю необходимую информацию самостоятельно.

Для поддержания «памяти» используются cookies, sessions или JWT токены.

REST API

Назовите принципы REST.

Ответ:

  1. Client-Server
  2. Statelessness
  3. Cacheability
  4. Uniform Interface
  5. Layered System
  6. Code on Demand (опционально)
REST vs SOAP — когда что использовать?

Ответ:

  • REST — для современных веб/мобильных приложений (легковесный, JSON, HTTP-native)
  • SOAP — для enterprise интеграций, где нужны строгие контракты (WSDL), WS-Security, транзакльности
Как версионировать API?

Ответ: Три основных подхода:

  1. URI versioning: /api/v1/users
  2. Header versioning: Accept: application/vnd.api.v1+json
  3. Query param: /api/users?version=1

Java

Разница между интерфейсом и абстрактным классом?

Ответ:

  • Интерфейс — чистый контракт (до Java 8 только abstract методы), поддерживает multiple inheritance. Определяет «что делать».
  • Абстрактный класс — может иметь concrete методы, поля, конструкторы, но single inheritance. Предоставляет «общую основу».
ArrayList vs LinkedList?

Ответ:

  • ArrayList — динамический массив: O(1) random access, O(n) insert/delete в середине
  • LinkedList — двусвязный список: O(n) access, O(1) insert/delete на краях

Для большинства случаев ArrayList быстрее из-за locality of reference.

HashMap vs HashSet?

Ответ:

  • HashMap хранит пары key→value
  • HashSet хранит только уникальные элементы (внутренне использует HashMap с dummy value)

Оба обеспечивают O(1) средний поиск.

Spring Framework

Что такое Dependency Injection и типы DI?

Ответ: Техника передачи зависимостей объекту извне вместо самостоятельного создания.

Типы:

  1. Constructor injection (рекомендуется — неизменяемость, обязательность)
  2. Setter injection (для опциональных зависимостей)
  3. Field injection (@Autowired — проще, но хуже тестируемость)
Разница между @Component, @Service и @Repository?

Ответ: Все три являются стереотипами @Component.

  • @Service маркирует бизнес-слой
  • @Repository — DAO слой (добавляет translation of persistence exceptions)

Функционально одинаковы, семантически различаются для читаемости и AOP.

Как Spring Boot стартует приложение?

Ответ: Последовательность запуска:

  1. main() вызывается
  2. SpringApplication.run()
  3. Автоконфигурация (читает META-INF/spring.factories)
  4. Создание ApplicationContext
  5. Сканирование @Component/@Configuration
  6. Регистрация бинов
  7. Старт embedded server (Tomcat/Jetty/Netty)
  8. Приложение готово

REST на Spring Boot

Зачем нужны DTO?

Ответ: DTO отделяют внешнюю форму данных от внутренней модели. Позволяют:

  • Скрыть чувствительные поля (password)
  • Контролировать сериализацию
  • Избежать lazy loading проблем
  • Валидировать вход отдельно от entity
Как глобально обрабатывать исключения?

Ответ: Через @RestControllerAdvice + @ExceptionHandler.

Один класс перехватывает все исключения и возвращает единообразный error response с нужным HTTP статусом и сообщением.

Базы данных

Объясните 1NF, 2NF, 3NF.

Ответ:

  • 1NF: атомарные значения, нет повторяющихся групп
  • 2NF: 1NF + каждый неключевой атрибут полностью зависит от всего первичного ключа (нет partial dependency)
  • 3NF: 2NF + нет transitive dependency (неключевые атрибуты не зависят друг от друга)
Когда создавать индекс?

Ответ: Когда столбец часто используется в WHERE, JOIN, ORDER BY.

Индекс ускоряет чтение, но замедляет запись (INSERT/UPDATE/DELETE). Не индексируйте низкокардинальные столбцы (пол, boolean).

Что такое ACID?

Ответ: Свойства транзакций:

  • Atomicity — вся транзакция или ничего
  • Consistency — данные всегда в валидном состоянии
  • Isolation — параллельные транзакции не мешают друг другу
  • Durability — после commit данные переживают crash

Hibernate и JPA

Что такое проблема N+1 и как решить?

Ответ: Загружаем список из N сущностей, каждая имеет lazy связь → Hibernate делает 1 запрос на список + N запросов на связи.

Решения:

  • JOIN FETCH в JPQL
  • @EntityGraph
  • Batch fetching
  • EAGER fetch (осторожно!)
EAGER vs LAZY loading?

Ответ:

  • EAGER — связанные данные грузятся сразу вместе с родителем
  • LAZY — грузятся при первом обращении к getter

По умолчанию: @ManyToOne/@OneToOne = EAGER, @OneToMany/@ManyToMany = LAZY. Рекомендуется LAZY + явный fetch когда нужно.

Безопасность

Как работает JWT?

Ответ: JWT состоит из трёх base64url частей:

  1. Header — алгоритм подписи
  2. Payload — claims (userId, role, exp)
  3. Signature — подпись секретом

Сервер проверяет подпись при каждом запросе. Токен самодостаточен — сервер не хранит сессии.

Как защититься от SQL Injection?

Ответ:

  • Никогда не конкатенировать пользовательский ввод в SQL
  • Использовать PreparedStatement / параметризованные запросы
  • В JPA/Hibernate это сделано автоматически через JPQL/Criteria API
  • Input validation, least privilege DB accounts
Session-based vs Token-based authentication?

Ответ:

  • Session: сервер хранит состояние, клиент получает session ID в cookie. Масштабирование сложнее (sticky sessions).
  • Token (JWT): сервер ничего не хранит, токен содержит все claims. Лучше для микросервисов и SPA, но logout требует blacklist или короткого TTL.

Архитектура

Монолит vs микросервисы — плюсы и минусы?

Ответ:

Монолит:

  • ✅ Прост в разработке/деплое, одна кодовая база, легко дебажить
  • ❌ Сложно масштабировать части независимо, technology lock-in

Микросервисы:

  • ✅ Независимый деплой, tech diversity, fault isolation
  • ❌ Distributed complexity, network overhead, data consistency challenges
Vertical vs Horizontal scaling?

Ответ:

  • Vertical (scale up): добавить CPU/RAM одному серверу. Просто, но есть предел и single point of failure.
  • Horizontal (scale out): добавить больше серверов за load balancer. Практически бесконечно масштабируемо, но сложнее в управлении.

Кеширование

Стратегии кеширования?

Ответ:

  • Cache-aside (lazy loading): приложение проверяет кеш → miss → fetch DB → store cache
  • Write-through: пишет и в кеш и в DB одновременно
  • Write-behind: пишет в кеш, DB обновляется асинхронно
  • Read-through: кеш-слой сам загружает из DB
Redis vs Memcached?

Ответ:

  • Redis: богатые структуры данных (lists, sets, hashes, sorted sets), persistence (RDB/AOF), replication, pub/sub, transactions
  • Memcached: только simple key-value, нет persistence, но чуть быстрее для простых кейсов

Redis универсальнее.

Асинхронная обработка

Kafka vs RabbitMQ — когда что?

Ответ:

  • Kafka: high-throughput event streaming, retention истории, replay, log aggregation, real-time analytics
  • RabbitMQ: traditional task queues, complex routing (exchanges/bindings), lower throughput but richer delivery semantics, simpler setup
Что такое Dead Letter Queue (DLQ)?

Ответ: Специальная очередь для сообщений, которые не удалось обработать после N retry.

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

DevOps и деплой

Контейнер vs виртуальная машина?

Ответ:

  • VM эмулирует целое железо + guest OS (тяжёлая, минуты старта)
  • Контейнер разделяет host kernel, изолирует только process space (лёгкий, секунды старта)

Docker container ≈ процесс с своей файловой системой и networking.

Blue-green deployment vs rolling update?

Ответ:

  • Blue-green: две идентичные среды, traffic переключается atomically с blue на green. Instant rollback. Дороже (2x ресурсы).
  • Rolling update: постепенно заменяет старые pod'ы новыми (K8s default). Дешевле, но slower rollback.
Основные компоненты control plane Kubernetes?

Ответ:

  • kube-apiserver — единственная точка входа
  • etcd — распределённое KV хранилище состояния
  • kube-scheduler — выбирает node для пода
  • kube-controller-manager — контроллеры (deployment, replica, endpoint и др.)
  • cloud-controller-manager — интеграция с cloud provider

Monitoring & Observability

Что такое RED methodology?

Ответ: Подход к мониторингу микросервисов:

  • Rate — количество запросов в секунду
  • Errors — доля ошибочных ответов
  • Duration — время обработки (percentiles p50/p95/p99)

Эти три метрики дают быстрый взгляд на здоровье сервиса.

Чем отличаются liveness, readiness и startup probes?

Ответ:

  • livenessProbe — если fail, kubelet перезапускает контейнер (deadlock/hang detection)
  • readinessProbe — если fail, pod убирается из Service endpoints (ещё не готов обслуживать)
  • startupProbe — временно отключает остальные probes пока приложение медленно инициализируется (>60s)
Зачем нужен correlation ID в логах?

Ответ: Уникальный идентификатор, присваиваемый каждому запросу на входе и пробрасываемый через все микросервисы.

Позволяет собрать всю цепочку событий одного запроса в ELK/Loki несмотря на распределённую природу системы.

Prometheus pull vs push модель?

Ответ:

  • Pull (default): Prometheus сам ходит по targets каждые N секунд. Лучше для долгоживущих сервисов,自动 discovery.
  • Push (via Pushgateway): приложение само отправляет метрики. Нужно для ephemeral jobs (batch/cron), которые живут меньше scrape interval.
Что такое OpenTelemetry?

Ответ: Vendor-neutral стандарт CNCF для instrumentation applications.

  • Единый API/SDK для generation of traces, metrics, logs
  • Collector component для processing/exporting telemetry
  • Поддержка многих backend'ов (Jaeger, Zipkin, Prometheus, OTLP)

Появился как merge Opencensus + OpenTracing.