Основы Backend разработки
Backend — серверная часть приложения. Пользователь его не видит, но именно он отвечает за бизнес-логику, работу с БД, аутентификацию и обработку запросов.
Классическая архитектура: клиент ↔ сервер ↔ база данных
Frontend vs Backend
| Характеристика | Frontend | Backend |
|---|---|---|
| Что делает | Интерфейс пользователя | Бизнес-логика |
| Где работает | Браузер (клиент) | Сервер |
| Языки | HTML, CSS, JS (React…) | Java, Python, Node.js, Go… |
| Цель | UI/UX | Функциональность, безопасность, данные |
| Взаимодействие | Напрямую с пользователем | Неявно (через API) |
Что происходит при вводе URL?
Популярные технологии
- Языки: Java, Python, Node.js, PHP, Go
- Фреймворки: Spring Boot, Express.js, Django, Laravel
- Базы данных: MySQL, PostgreSQL, MongoDB, Redis
- API: REST, GraphQL
- DevOps: Docker, Kubernetes, AWS, CI/CD
- Инструменты: Git, Postman, Maven, Jenkins
HTTP, HTTPS и веб-коммуникация
HTTP — протокол прикладного уровня для связи клиента и сервера. Работает по модели «запрос → ответ» и является stateless.
HTTPS добавляет шифрование SSL/TLS. Порт 443 (у HTTP — 80). Защищает от перехвата и подмены данных.
HTTP методы
| Метод | Назначение | Idempotent | Safe |
|---|---|---|---|
| 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 |
Важные заголовки
Host— доменное имя сервераContent-Type— тип данных (application/json)Authorization— токен аутентификацииAccept— ожидаемый формат ответаCookie— данные сессииCache-Control— инструкции кеширования
Stateless vs Stateful
HTTP не запоминает состояние между запросами. Для «памяти» используют cookies, сессии или JWT токены.
REST API и веб-сервисы
API — набор правил для общения программ. REST — архитектурный стиль построения таких интерфейсов: stateless, resource-based URLs, стандартные HTTP методы, JSON формат.
6 принципов REST
- Client-Server — разделение ответственности
- Statelessness — нет состояния между запросами
- Cacheability — ответы можно кешировать
- Uniform Interface — единый интерфейс
- Layered System — многослойность
- Code on Demand (опционально)
REST vs SOAP
| REST | SOAP | |
|---|---|---|
| Тип | Архит. стиль | Протокол |
| Данные | JSON | XML |
| Скорость | Быстрее | Медленнее |
| Сложность | Простая | Высокая |
| State | Stateless | Stateful |
JSON vs XML
| JSON | XML | |
|---|---|---|
| Вес | Лёгкий | Многословный |
| Читаемость | Отличная | Средняя |
| Типы данных | Массивы, объекты | Ограниченные |
| Использование | REST API | Legacy, SOAP |
Java и основы ООП
JVM, JRE и JDK
Вложенность: JDK ⊃ JRE JVM
ООП концепции
- Инкапсуляция — объединение данных и методов в классе
- Абстракция — сокрытие деталей реализации
- Наследование — переиспользование кода через extends
- Полиморфизм — один метод, разное поведение (overriding)
Interface vs Abstract Class
| Interface | Abstract Class | |
|---|---|---|
| Абстракция | Полная | Частичная |
| Методы | Только abstract (+default/static с Java 8) | Abstract + concrete |
| Переменные | public static final | Любые |
| Multiple inheritance | ✅ Да | ❌ Нет |
| Назначение | Контракт | Общий код |
Collections Framework
| Интерфейс | Реализации | Особенности |
|---|---|---|
| List | ArrayList, LinkedList | Упорядоченный, дубликаты OK |
| Set | HashSet, TreeSet | Без дубликатов |
| Map | HashMap, TreeMap | Пары key→value |
| Queue | PriorityQueue, LinkedList | FIFO / приоритет |
Spring Framework и Spring Boot
Spring Framework — open-source фреймворк для enterprise Java: IoC, DI, AOP, модульная архитектура. Spring Boot — надстройка с автоконфигурацией, встроенным Tomcat и starter-зависимостями (convention over configuration).
IoC и Dependency Injection
Контейнер Spring внедряет зависимости извне вместо самостоятельного создания объектами. Снижает связанность, упрощает тестирование.
Ключевые аннотации
| Аннотация | Назначение | Слой |
|---|---|---|
@Component | Общий бином | Любой |
@Service | Бизнес-логика | Service layer |
@Repository | Доступ к данным | DAO layer |
@Controller | MVC контроллер (view) | Web layer |
@RestController | = @Controller + @ResponseBody | REST API |
@Configuration | Конфигурационный класс | Java config |
@Bean | Ручное объявление бина | Внутри @Configuration |
Как запускается Spring Boot
Создание REST API на Spring Boot
@RestController = @Controller + @ResponseBody. Первый возвращает HTML-view, второй — сразу JSON/XML данные.
Маппинг запросов
| Аннотация | HTTP Метод | Пример пути |
|---|---|---|
| @GetMapping | GET | /api/users/{id} |
| @PostMapping | POST | /api/users |
| @PutMapping | PUT | /api/users/{id} |
| @PatchMapping | PATCH | /api/users/{id}/email |
| @DeleteMapping | DELETE | /api/users/{id} |
Path Variable vs Request Param
DTO паттерн
Entity содержит все поля включая внутренние. DTO скрывает лишнее и валидирует входные данные.
Валидация
Глобальная обработка исключений
Базы данных и SQL
SQL vs NoSQL
| Характеристика | SQL (реляционные) | NoSQL (нереляционные) |
|---|---|---|
| Модель | Таблицы, строки, столбцы | Документы, KV, графы, колонки |
| Схема | Фиксированная | Гибкая (schema-less) |
| Запросы | SQL | Разные (JSON-like, API) |
| Масштабирование | Вертикальное | Горизонтальное |
| ACID | Да | CAP (eventual consistency) |
| Примеры | MySQL, PostgreSQL, Oracle | MongoDB, Cassandra, Redis, DynamoDB |
Ключи и связи
Связь через Foreign Key: каждый студент ссылается на отдел
JOIN операции
| Тип | Что возвращает |
|---|---|
| INNER JOIN | Только совпадающие строки из обеих таблиц |
| LEFT JOIN | Все из левой + совпадения из правой (NULL если нет) |
| RIGHT JOIN | Все из правой + совпадения из левой |
| FULL OUTER JOIN | Все из обеих таблиц |
| CROSS JOIN | Декартово произведение (все комбинации) |
Нормализация
- 1NF — атомарные значения, нет повторяющихся групп
- 2NF — 1NF + нет частичной зависимости от составного ключа
- 3NF — 2NF + нет транзитивных зависимостей
- BCNF — усиленная 3NF: каждый детерминант — кандидатный ключ
ACID свойства транзакций
A — Atomicity
Всё или ничего. Либо все операции выполнены, либо ни одной.
C — Consistency
Данные всегда переходят из одного валидного состояния в другое.
I — Isolation
Параллельные транзакции не влияют друг на друга.
D — Durability
После COMMIT изменения сохранятся даже при аварии.
Hibernate, JPA и ORM
ORM — отображение объектов Java в таблицы БД. JPA — спецификация (интерфейс), Hibernate — реализация.
| JPA | Hibernate | |
|---|---|---|
| Тип | Спецификация (API) | Реализация JPA |
| Автор | Jakarta EE | Open source проект |
| Query Language | JPQL | HQL (надмножество JPQL) |
| Cache | Не определён | L1 + L2 cache |
Пример Entity + Repository
Связи между сущностями
Аутентификация и безопасность
Аутентификация — «Кто ты?». Авторизация — «Что тебе разрешено?».
Session-based vs Token-based
| Session-based | Token-based (JWT) | |
|---|---|---|
| Хранение | На сервере | На клиенте |
| Statefulness | Stateful | Stateless |
| Масштабируемость | Сложнее (sticky sessions) | Лучше |
| CSRF | Уязвим | Менее уязвим |
| Logout | Удалить сессию | Blacklist / короткий TTL |
Структура JWT
JWT = Base64Url(Header) . Base64Url(Payload) . Signature
Хеширование паролей
Распространённые угрозы
| Угроза | Описание | Защита |
|---|---|---|
| SQL Injection | Внедрение вредоносного SQL | PreparedStatement, ORM |
| XSS | Вредоносные скрипты в страницах | Санитизация вывода, CSP |
| CSRF | Поддельные межсайтовые запросы | CSRF токены, SameSite cookies |
| Brute Force | Перебор паролей | Rate limiting, lockout |
| MITM | Перехват трафика | HTTPS, certificate pinning |
Архитектура и системный дизайн
Монолит vs Микросервисы
HLD vs LLD
High Level Design (HLD)
Общая картина: компоненты, их взаимодействие, потоки данных. Отвечает на вопрос «что система делает».
Low Level Design (LLD)
Детали: классы, методы, схемы БД, API контракты. Отвечает на вопрос «как система реализована».
Load Balancing
Кеширование, Redis и производительность
Кеширование — хранение часто используемых данных в быстром доступе (RAM), чтобы не обращаться к медленной БД каждый раз.
Flow Cache-Aside
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 / HGET | Hash поля | HSET user:1 email "a@b.com" |
| LPUSH / LRANGE | Список слева / диапазон | LPUSH tasks "send_email" |
| SADD / SMEMBERS | Set операции | SADD online_users "ayush" |
| ZADD / ZRANGE | Sorted set (лидерборды) | ZADD lb 100 "player1" |
Redis vs Memcached
| Redis | Memcached | |
|---|---|---|
| Структуры данных | String, List, Set, Hash, Sorted Set… | Только String |
| Persistence | RDB + AOF | Нет |
| Репликация | Да | Нет |
| Pub/Sub | Да | Нет |
| Производительность | Высокая | Очень высокая (проще) |
Инвалидация кеша
- TTL expiration — данные сами удаляются по таймеру
- Manual delete — явное удаление при обновлении
- Event-based — слушатель событий очищает кеш
- Versioning keys — user:1:v2 вместо user:1
Асинхронная обработка и messaging
Асинхронная обработка позволяет выполнять длительные задачи в фоне, не блокируя основной поток пользователя.
Sync vs Async
| Синхронная | Асинхронная | |
|---|---|---|
| Выполнение | Ждёт завершения | Не ждёт |
| Ответ | Медленнее | Быстрее (ACK мгновенно) |
| Ресурсы | Блокирует поток | Неблокирующая |
| Пример | REST вызов | Message Queue, Event-driven |
Message Queue архитектура
Kafka vs RabbitMQ
| Kafka | RabbitMQ | |
|---|---|---|
| Тип | Distributed streaming platform | Traditional message broker |
| Модель | Topics → Partitions → Consumer Groups | Exchanges → Queues → Bindings |
| Throughput | Очень высокий (млн msg/sec) | Высокий, но ниже Kafka |
| Retention | Сохраняет историю (days/weeks) | Удаляет после consumption |
| Use case | Event sourcing, log aggregation, analytics | Task queues, microservice comm |
Архитектура Kafka
Каждая partition читается только одним consumer'ом внутри группы
Docker, Kubernetes и DevOps
CI/CD Pipeline
Docker основы
Docker упаковывает приложение со всеми зависимостями в контейнер — изолированный, переносимый юнит.
| Команда | Действие |
|---|---|
| docker build -t myapp . | Собрать образ |
| docker run -d -p 8080:8080 myapp | Запустить контейнер |
| docker ps | Список запущенных |
| docker logs <container> | Логи контейнера |
| docker-compose up | Multi-service стек |
Kubernetes архитектура
Control plane принимает решения, worker nodes исполняют поды
Основные объекты K8s
| Объект | Назначение |
|---|---|
| Pod | Минимальная единица (1+ контейнера) |
| Deployment | Управляет replicas подов, rolling updates |
| Service | Стабильный network endpoint для группы подов |
| ConfigMap | Неконфиденциальные конфиги |
| Secret | Конфиденциальные данные (base64) |
| Ingress | HTTP routing извне кластера |
| Namespace | Логическая изоляция ресурсов |
| Helm | Package manager для K8s приложений |
Способы установки K8s
- kubeadm — официальный инструмент, вручную
- Kubespray — автоматизация через Ansible
- minikube / kind — лёгкие варианты для обучения
- Managed сервисы — EKS (AWS), GKE (Google), AKS (Azure)
Мониторинг, логирование и 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.
Ключевые RED-методология метрик
| Метрика | Что измеряет | Пример PromQL |
|---|---|---|
| Rate | Requests per second | rate(http_requests_total[5m]) |
| Errors | Error rate (%) | sum(rate(errors_total[5m])) / sum(rate(requests_total[5m])) |
| Duration | Latency percentiles | histogram_quantile(0.95, http_request_duration_seconds_bucket) |
ELK Stack (Elasticsearch, Logstash, Kibana)
Популярный стек для централизованного логирования:
- Elasticsearch — search & analytics engine (хранит индексы логов)
- Logstash — pipeline обработки (parse, enrich, transform)
- Kibana — UI для поиска, визуализации, алертинга
Distributed Tracing
В микросервисной архитектуре один пользовательский запрос проходит через десятки сервисов. Трейсинг восстанавливает полную картину:
| Инструмент | Особенности |
|---|---|
| Jaeger | OpenTelemetry native, CNCF graduated project |
| Zipkin | Лёгкий, простой deployment |
| Tempo | Grafana Labs, интеграция с Loki/Grafana |
| OpenTelemetry | Vendor-neutral SDK/API/spec для metrics/logs/traces |
Health Checks в K8s
| Тип probe | Назначение | Когда использовать |
|---|---|---|
| livenessProbe | Restart container if fails | Приложение зависло / deadlock |
| readinessProbe | Remove from Service endpoints | Ещё не готов принимать traffic (warmup, migration) |
| startupProbe | Delay liveness/readiness checks | Медленно стартующие приложения (>60s init) |
Logging best practices
- Structured logging — JSON format вместо plain text (легче парсить)
- Correlation ID — уникальный ID на весь жизненный цикл запроса
- Levels discipline — DEBUG/INFO/WARN/ERROR/FATAL осмысленно
- No PII in logs — маскировать passwords, tokens, personal data
- Centralized collection — все логи в одно место (Loki/ELK/CloudWatch)
- Retention policy — defined TTL для разных уровней (debug короче, audit дольше)
Сценарные задачи и System Design
Типовые задачи проектирования систем и ключевые моменты для каждой:
URL Shortener (bit.ly)
- Генерация уникального короткого кода (base62 encoding)
- Хранение映射 long URL → short code (KV store: Redis/DynamoDB)
- Redirect через 301/302
- Analytics: клики, география (async via Kafka)
- Кеширование горячих URL в Redis
Chat Application (WhatsApp)
- WebSocket для realtime доставки
- Message queue (Kafka) для offline delivery
- Storage: per-user inbox model vs write-fanout
- Read receipts, typing indicators
- End-to-end encryption
- Presence service (online/offline tracking)
E-commerce Backend (Amazon)
- Catalog service (search via Elasticsearch)
- Cart & checkout (distributed transactions / saga pattern)
- Inventory management (optimistic locking)
- Payment integration (idempotency keys)
- Order processing pipeline (event-driven)
- Recommendation engine (ML + caching)
Notification System
- Multi-channel: Email, SMS, Push, In-app
- Template rendering service
- Priority queues (urgent > normal)
- Retry with exponential backoff
- Rate limiting per user/channel
- Delivery tracking and analytics
Rate Limiter
- Algorithms: Token Bucket, Leaky Bucket, Sliding Window
- Implementation: Redis INCR + EXPIRE
- Per-user / per-IP / per-API-key limits
- Distributed rate limiting (shared Redis cluster)
- Graceful degradation: 429 Too Many Requests + Retry-After header
Вопросы и ответы
Ниже собраны вопросы из всех разделов с краткими ответами.
Основы Backend
Ответ: Серверная часть приложения, отвечающая за бизнес-логику, работу с БД, аутентификацию и API.
Пользователь не видит бэкенд напрямую, но именно он обеспечивает всю функциональность.
Ответ:
- Frontend — клиентская часть (браузер), отвечает за UI/UX, использует HTML/CSS/JS.
- Backend — серверная часть, отвечает за логику, данные, безопасность, использует Java/Python/Node.js.
Ответ:
- DNS-запрос для получения IP-адреса
- Установка TCP соединения
- Отправка HTTP-запроса на сервер
- Сервер обрабатывает запрос (бизнес-логика + обращение к БД)
- Возврат HTTP-ответа (HTML/JSON)
- Браузер рендерит страницу
Ответ:
- Проектирование серверной логики
- Создание и поддержка REST API
- Работа с базами данных (SQL/NoSQL)
- Реализация аутентификации и авторизации
- Настройка серверов и деплой
- Обеспечение безопасности приложения
- Оптимизация производительности и масштабируемости
- Работа с инструментами DevOps и облачными платформами
HTTP и HTTPS
Ответ: HTTPS = HTTP + TLS/SSL шифрование.
- HTTP передаёт данные открытым текстом (порт 80)
- HTTPS шифрует весь трафик (порт 443), защищая от перехвата и подмены
Ответ:
- PUT заменяет ресурс целиком (идемпотентен)
- PATCH обновляет только указанные поля
Пример: PUT меняет весь объект User, PATCH меняет только email.
Ответ: Сервер не хранит информацию о предыдущих запросах клиента. Каждый запрос должен содержать всю необходимую информацию самостоятельно.
Для поддержания «памяти» используются cookies, sessions или JWT токены.
REST API
Ответ:
- Client-Server
- Statelessness
- Cacheability
- Uniform Interface
- Layered System
- Code on Demand (опционально)
Ответ:
- REST — для современных веб/мобильных приложений (легковесный, JSON, HTTP-native)
- SOAP — для enterprise интеграций, где нужны строгие контракты (WSDL), WS-Security, транзакльности
Ответ: Три основных подхода:
- URI versioning:
/api/v1/users - Header versioning: Accept: application/vnd.api.v1+json
- Query param:
/api/users?version=1
Java
Ответ:
- Интерфейс — чистый контракт (до Java 8 только abstract методы), поддерживает multiple inheritance. Определяет «что делать».
- Абстрактный класс — может иметь concrete методы, поля, конструкторы, но single inheritance. Предоставляет «общую основу».
Ответ:
- ArrayList — динамический массив: O(1) random access, O(n) insert/delete в середине
- LinkedList — двусвязный список: O(n) access, O(1) insert/delete на краях
Для большинства случаев ArrayList быстрее из-за locality of reference.
Ответ:
- HashMap хранит пары key→value
- HashSet хранит только уникальные элементы (внутренне использует HashMap с dummy value)
Оба обеспечивают O(1) средний поиск.
Spring Framework
Ответ: Техника передачи зависимостей объекту извне вместо самостоятельного создания.
Типы:
- Constructor injection (рекомендуется — неизменяемость, обязательность)
- Setter injection (для опциональных зависимостей)
- Field injection (@Autowired — проще, но хуже тестируемость)
Ответ: Все три являются стереотипами @Component.
- @Service маркирует бизнес-слой
- @Repository — DAO слой (добавляет translation of persistence exceptions)
Функционально одинаковы, семантически различаются для читаемости и AOP.
Ответ: Последовательность запуска:
- main() вызывается
- SpringApplication.run()
- Автоконфигурация (читает META-INF/spring.factories)
- Создание ApplicationContext
- Сканирование @Component/@Configuration
- Регистрация бинов
- Старт embedded server (Tomcat/Jetty/Netty)
- Приложение готово
REST на Spring Boot
Ответ: DTO отделяют внешнюю форму данных от внутренней модели. Позволяют:
- Скрыть чувствительные поля (password)
- Контролировать сериализацию
- Избежать lazy loading проблем
- Валидировать вход отдельно от entity
Ответ: Через @RestControllerAdvice + @ExceptionHandler.
Один класс перехватывает все исключения и возвращает единообразный error response с нужным HTTP статусом и сообщением.
Базы данных
Ответ:
- 1NF: атомарные значения, нет повторяющихся групп
- 2NF: 1NF + каждый неключевой атрибут полностью зависит от всего первичного ключа (нет partial dependency)
- 3NF: 2NF + нет transitive dependency (неключевые атрибуты не зависят друг от друга)
Ответ: Когда столбец часто используется в WHERE, JOIN, ORDER BY.
Индекс ускоряет чтение, но замедляет запись (INSERT/UPDATE/DELETE). Не индексируйте низкокардинальные столбцы (пол, boolean).
Ответ: Свойства транзакций:
- Atomicity — вся транзакция или ничего
- Consistency — данные всегда в валидном состоянии
- Isolation — параллельные транзакции не мешают друг другу
- Durability — после commit данные переживают crash
Hibernate и JPA
Ответ: Загружаем список из N сущностей, каждая имеет lazy связь → Hibernate делает 1 запрос на список + N запросов на связи.
Решения:
- JOIN FETCH в JPQL
- @EntityGraph
- Batch fetching
- EAGER fetch (осторожно!)
Ответ:
- EAGER — связанные данные грузятся сразу вместе с родителем
- LAZY — грузятся при первом обращении к getter
По умолчанию: @ManyToOne/@OneToOne = EAGER, @OneToMany/@ManyToMany = LAZY. Рекомендуется LAZY + явный fetch когда нужно.
Безопасность
Ответ: JWT состоит из трёх base64url частей:
- Header — алгоритм подписи
- Payload — claims (userId, role, exp)
- Signature — подпись секретом
Сервер проверяет подпись при каждом запросе. Токен самодостаточен — сервер не хранит сессии.
Ответ:
- Никогда не конкатенировать пользовательский ввод в SQL
- Использовать PreparedStatement / параметризованные запросы
- В JPA/Hibernate это сделано автоматически через JPQL/Criteria API
- Input validation, least privilege DB accounts
Ответ:
- Session: сервер хранит состояние, клиент получает session ID в cookie. Масштабирование сложнее (sticky sessions).
- Token (JWT): сервер ничего не хранит, токен содержит все claims. Лучше для микросервисов и SPA, но logout требует blacklist или короткого TTL.
Архитектура
Ответ:
Монолит:
- ✅ Прост в разработке/деплое, одна кодовая база, легко дебажить
- ❌ Сложно масштабировать части независимо, technology lock-in
Микросервисы:
- ✅ Независимый деплой, tech diversity, fault isolation
- ❌ Distributed complexity, network overhead, data consistency challenges
Ответ:
- 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: богатые структуры данных (lists, sets, hashes, sorted sets), persistence (RDB/AOF), replication, pub/sub, transactions
- Memcached: только simple key-value, нет persistence, но чуть быстрее для простых кейсов
Redis универсальнее.
Асинхронная обработка
Ответ:
- 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
Ответ: Специальная очередь для сообщений, которые не удалось обработать после N retry.
Предотвращает бесконечные циклы повторной обработки. Сообщения в DLQ анализируются вручную или автоматически для диагностики.
DevOps и деплой
Ответ:
- VM эмулирует целое железо + guest OS (тяжёлая, минуты старта)
- Контейнер разделяет host kernel, изолирует только process space (лёгкий, секунды старта)
Docker container ≈ процесс с своей файловой системой и networking.
Ответ:
- Blue-green: две идентичные среды, traffic переключается atomically с blue на green. Instant rollback. Дороже (2x ресурсы).
- Rolling update: постепенно заменяет старые pod'ы новыми (K8s default). Дешевле, но slower rollback.
Ответ:
- kube-apiserver — единственная точка входа
- etcd — распределённое KV хранилище состояния
- kube-scheduler — выбирает node для пода
- kube-controller-manager — контроллеры (deployment, replica, endpoint и др.)
- cloud-controller-manager — интеграция с cloud provider
Monitoring & Observability
Ответ: Подход к мониторингу микросервисов:
- Rate — количество запросов в секунду
- Errors — доля ошибочных ответов
- Duration — время обработки (percentiles p50/p95/p99)
Эти три метрики дают быстрый взгляд на здоровье сервиса.
Ответ:
- livenessProbe — если fail, kubelet перезапускает контейнер (deadlock/hang detection)
- readinessProbe — если fail, pod убирается из Service endpoints (ещё не готов обслуживать)
- startupProbe — временно отключает остальные probes пока приложение медленно инициализируется (>60s)
Ответ: Уникальный идентификатор, присваиваемый каждому запросу на входе и пробрасываемый через все микросервисы.
Позволяет собрать всю цепочку событий одного запроса в ELK/Loki несмотря на распределённую природу системы.
Ответ:
- Pull (default): Prometheus сам ходит по targets каждые N секунд. Лучше для долгоживущих сервисов,自动 discovery.
- Push (via Pushgateway): приложение само отправляет метрики. Нужно для ephemeral jobs (batch/cron), которые живут меньше scrape interval.
Ответ: 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.