Распределенные системы
Что такое клиент-сервер архитектура?
Короткий ответ
Клиент-серверная архитектура: Это модель построения вычислительной сети или программной системы, в которой задачи или сетевая нагрузка распределены между поставщиками услуг (серверами) и заказчиками услуг (клиентами). - Принцип работы: 1. Клиент: Инициирует соединение и отправляет запрос к серверу, запрашивая определенный ресурс или услугу (например, веб-страницу, данные из базы, выполнение операции).
Полный ответ
- Клиент-серверная архитектура: Это модель построения вычислительной сети или программной системы, в которой задачи или сетевая нагрузка распределены между поставщиками услуг (серверами) и заказчиками услуг (клиентами).
- Принцип работы:
- Клиент: Инициирует соединение и отправляет запрос к серверу, запрашивая определенный ресурс или услугу (например, веб-страницу, данные из базы, выполнение операции). Клиент обычно отвечает за пользовательский интерфейс и взаимодействие с пользователем.
- Сервер: Находится в режиме ожидания запросов от клиентов. При получении запроса он обрабатывает его, выполняет необходимые действия (например, извлекает данные, производит вычисления) и отправляет ответ обратно клиенту. Сервер обычно отвечает за хранение данных, бизнес-логику и управление ресурсами.
- Коммуникация: Клиент и сервер взаимодействуют по сети с использованием определенного протокола (например, HTTP, FTP, SQL*Net).
- Примеры: Веб-браузер (клиент) и веб-сервер, почтовый клиент (Outlook, Thunderbird) и почтовый сервер, приложение для работы с БД (клиент) и СУБД (сервер).
- Цель: Централизация ресурсов и управления, разделение ответственности, масштабируемость (можно добавлять больше клиентов или увеличивать мощность сервера).
Какие есть виды архитектуры? Какая архитектура у тебя на проекте?
Короткий ответ
Виды архитектуры (основные): - Клиент-серверная: (Описана выше) Фундаментальная модель. - Монолитная архитектура (Monolith): Все компоненты приложения (UI, бизнес-логика, доступ к данным) объединены в единый, неразделимый блок (монолит), который развертывается целиком.
Полный ответ
-
Виды архитектуры (основные):
- Клиент-серверная: (Описана выше) Фундаментальная модель.
- Монолитная архитектура (Monolith): Все компоненты приложения (UI, бизнес-логика, доступ к данным) объединены в единый, неразделимый блок (монолит), который развертывается целиком.
- Многоуровневая/Слоеная архитектура (Layered / N-Tier): Приложение разделено на логические слои, каждый из которых отвечает за свою часть функциональности и взаимодействует только с соседними слоями. Классический пример - 3-уровневая (Presentation Tier, Business Logic Tier, Data Access Tier).
- Микросервисная архитектура (Microservices): Приложение строится как набор небольших, независимых и слабо связанных сервисов, каждый из которых реализует определенную бизнес-возможность. Сервисы общаются по сети (часто через REST API или асинхронно).
- Сервис-ориентированная архитектура (SOA - Service-Oriented Architecture): Более ранняя концепция, похожая на микросервисы, но обычно с более крупными (coarse-grained) сервисами, часто использующая Enterprise Service Bus (ESB) для интеграции и ориентированная на интеграцию на уровне предприятия.
- Событийно-ориентированная архитектура (EDA - Event-Driven Architecture): Компоненты системы реагируют на события, происходящие в системе. Взаимодействие часто происходит асинхронно через брокеры сообщений или шины событий. (Хореография - частный случай).
- Peer-to-Peer (P2P): Децентрализованная архитектура, где участники (пиры) равноправны и могут выступать и как клиенты, и как серверы.
-
Какая архитектура у тебя на проекте (пример ответа): “На моем текущем проекте используется микросервисная архитектура. Система разделена на несколько независимых сервисов, отвечающих за ключевые бизнес-домены: сервис пользователей, сервис заказов, сервис каталога товаров, сервис оплаты и сервис уведомлений. Сервисы в основном взаимодействуют друг с другом через REST API для синхронных запросов и через брокер сообщений Kafka для асинхронных событий (например, при создании заказа сервис заказов публикует событие, на которое подписывается сервис уведомлений). Каждый сервис имеет свою базу данных (PostgreSQL или MongoDB в зависимости от задач) и развертывается независимо в Docker-контейнерах. Такая архитектура была выбрана для обеспечения независимой разработки, масштабирования и отказоустойчивости отдельных компонентов системы.” (Адаптируйте под свой реальный опыт или наиболее релевантный проект).
Чем отличается SOA и микросервисная архитектура?
Короткий ответ
Хотя обе архитектуры основаны на идее сервисов, между ними есть ключевые различия:
Полный ответ
Хотя обе архитектуры основаны на идее сервисов, между ними есть ключевые различия:
| Признак | SOA (Сервис-ориентированная) | Микросервисы |
|---|---|---|
| Гранулярность сервисов | Крупные (Coarse-grained), часто охватывают несколько функций. | Мелкие (Fine-grained), сфокусированы на одной бизнес-возможности. |
| Область применения | Обычно интеграция на уровне предприятия (связь разных систем). | Обычно построение одного приложения или продукта. |
| Коммуникация | Часто через ESB (Enterprise Service Bus), протоколы SOAP, WS-*. | Чаще легковесные протоколы (REST, gRPC), прямое взаимодействие или через API Gateway, брокеры сообщений (Kafka, RabbitMQ). |
| Хранение данных | Часто общая база данных или хранилище для нескольких сервисов. | Каждый сервис имеет свою собственную базу данных. |
| Развертывание (Deployment) | Обычно скоординированное развертывание нескольких сервисов. | Независимое развертывание каждого сервиса. |
| Управление/Governance | Централизованное (общие стандарты, ESB). | Децентрализованное (каждая команда выбирает технологии, “умные эндпоинты, глупые пайпы”). |
| Связь/Coupling | Более сильная связь (через ESB, общие модели данных). | Слабая связь (через четкие API, независимые данные). |
| Контекст возникновения | Эпоха интеграции крупных корпоративных систем. | Эпоха Agile, DevOps, облачных вычислений. |
Упрощенно: Микросервисы можно считать более современным, легковесным и гибким подходом к реализации идей SOA, сфокусированным на построении одного приложения, а не на интеграции всего предприятия.
Какие есть способы декомпозиции на микросервисы? Какие используешь?
Короткий ответ
Декомпозиция (разделение) монолита или проектирование новой системы в виде микросервисов – сложная задача. Основные подходы:
Полный ответ
Декомпозиция (разделение) монолита или проектирование новой системы в виде микросервисов – сложная задача. Основные подходы:
- По бизнес-возможностям (Business Capability): Сервисы выделяются вокруг основных функций или возможностей
бизнеса. Это самый популярный и рекомендуемый подход.
- Пример: Управление заказами, Управление каталогом, Управление пользователями, Обработка платежей, Система уведомлений.
- По поддоменам (Domain-Driven Design - DDD): Система делится на логические домены и поддомены (Core,
Supporting, Generic). Каждый поддомен может стать основой для одного или нескольких микросервисов. Границы между
сервисами соответствуют границам контекстов (Bounded Contexts) в DDD.
- Пример: В системе e-commerce могут быть поддомены “Продажи”, “Складской учет”, “Доставка”, “Маркетинг”.
- По шагам бизнес-процесса/Use Case (Реже): Сервис отвечает за определенный шаг в процессе (например, сервис “Валидация заказа”, сервис “Расчет доставки”). Может привести к слишком сильной связанности (chattiness) между сервисами.
- По сущностям/ресурсам (Noun-based): Выделение сервисов вокруг основных сущностей системы (например, сервис “Товары”, сервис “Клиенты”). Похоже на подход по бизнес-возможностям, но акцент больше на данных.
- Паттерн “Душитель” (Strangler Fig Pattern): Применяется для рефакторинга существующего монолита. Новая функциональность реализуется в виде микросервисов, которые постепенно “перехватывают” запросы у старого монолита, пока тот полностью не будет заменен.
- Какие используешь (пример ответа): “При проектировании или анализе декомпозиции я в первую очередь ориентируюсь на бизнес-возможности. Я стараюсь понять, какие ключевые функции должна выполнять система с точки зрения бизнеса, и группирую связанную логику и данные в отдельные сервисы. Например, все, что связано с процессом оформления и отслеживания заказа, логично выделить в сервис “Заказы”. Этот подход помогает создать сервисы со слабой связностью и высокой функциональной сплоченностью (cohesion). При работе со сложными предметными областями я также учитываю принципы Domain-Driven Design и границы контекстов (Bounded Contexts), чтобы декомпозиция была более обоснованной и устойчивой к изменениям.”
В чем заключается независимость микросервисов?
Короткий ответ
Независимость – ключевое преимущество микросервисной архитектуры. Она проявляется в нескольких аспектах:
Полный ответ
Независимость – ключевое преимущество микросервисной архитектуры. Она проявляется в нескольких аспектах:
- Независимость развертывания (Deployment): Каждый микросервис может быть развернут (обновлен, откачен) независимо от других сервисов, без необходимости останавливать или переразвертывать всю систему. Это ускоряет выпуск новых фич и исправление ошибок.
- Независимость масштабирования (Scalability): Каждый сервис можно масштабировать (увеличивать или уменьшать количество его экземпляров) независимо от других, в соответствии с его текущей нагрузкой. Это позволяет эффективно использовать ресурсы.
- Технологическая независимость (Technology Diversity): Команды могут выбирать наиболее подходящий стек технологий (язык программирования, фреймворк, СУБД) для каждого конкретного сервиса, не будучи связанными единым стеком для всей системы.
- Независимость данных (Data Independence): Каждый сервис владеет своей базой данных и не имеет прямого доступа к базам данных других сервисов. Взаимодействие происходит только через API. Это предотвращает сильную связанность на уровне данных.
- Независимость от сбоев (Fault Isolation): Сбой в одном сервисе не должен приводить к отказу всей системы (при правильном проектировании с использованием паттернов отказоустойчивости, таких как Circuit Breaker). Остальные сервисы могут продолжать работать.
- Организационная независимость: Позволяет организовать работу небольших автономных команд, каждая из которых отвечает за полный жизненный цикл своего сервиса (You build it, you run it).
В чем отличие монолита и микросервисов? Плюсы/минусы? Когда лучше выбрать монолит?
Короткий ответ
Когда лучше выбрать монолит:
Полный ответ
| Характеристика | Монолит | Микросервисы |
|---|---|---|
| Структура | Единый блок кода, единая база данных. | Набор небольших, независимых сервисов, свои БД у каждого. |
| Разработка | + Проще начать, проще отладка (в рамках одного процесса). | - Сложнее начать (инфраструктура, коммуникации), сложнее распределенная отладка. |
| Развертывание | + Проще (один артефакт). | - Сложнее (нужна автоматизация CI/CD для каждого сервиса). + Независимое и частое. |
| Масштабирование | - Масштабируется только целиком (неэффективно). | + Масштабируются отдельные сервисы (эффективно). |
| Технологии | - Один стек технологий на все приложение. | + Можно использовать разные технологии для разных сервисов. |
| Надежность | - Сбой одного компонента может повлиять на все. | + Изоляция сбоев (при правильном проектировании). |
| Командная работа | - Сложно для больших команд (конфликты, зависимости). | + Идеально для небольших автономных команд. |
| Согласованность данных | + Легко обеспечить (ACID транзакции). | - Сложнее (распределенные транзакции, саги, eventual consistency). |
| Сложность | + Низкая начальная. - Растет со временем. | - Высокая начальная (операционная). + Управляемая со временем. |
| Скорость изменений | - Медленнее (из-за зависимостей и общего релиза). | + Быстрее (независимые релизы). |
Когда лучше выбрать монолит:
- На старте проекта / MVP: Когда требования еще не устоялись, и важна максимальная скорость начальной разработки.
- Небольшие приложения: Если приложение имеет ограниченный функционал и не ожидается его сильного роста.
- Маленькая команда: Когда нет ресурсов или экспертизы для управления сложностью распределенной системы.
- Простая предметная область: Если логика приложения относительно проста и легко укладывается в единую модель.
- Необходимость строгой транзакционной согласованности по всему приложению, которую сложно реализовать в распределенной среде.
Что такое Хореография? Для чего используют?
Короткий ответ
Хореография (Choreography): В контексте распределенных систем (особенно микросервисов и EDA) – это паттерн взаимодействия, при котором нет центрального координатора (оркестратора). Каждый сервис самостоятельно реагирует на события, происходящие в системе, публикуя свои собственные события или выполняя действия. - Принцип: Сервисы общаются через события (events), публикуемые в общий брокер сообщений или шину событий.
Полный ответ
- Хореография (Choreography): В контексте распределенных систем (особенно микросервисов и EDA) – это паттерн взаимодействия, при котором нет центрального координатора (оркестратора). Каждый сервис самостоятельно реагирует на события, происходящие в системе, публикуя свои собственные события или выполняя действия.
- Принцип: Сервисы общаются через события (events), публикуемые в общий брокер сообщений или шину событий. Каждый сервис подписывается на интересующие его события и реагирует на них автономно, не зная о других подписчиках.
- Аналогия: Группа танцоров на сцене. Каждый знает свою партию и реагирует на музыку и движения других танцоров, но нет дирижера, который бы указывал каждому, что делать в каждый момент времени.
- Для чего используют:
- Построение слабо связанных (loosely coupled) систем.
- Достижение высокой масштабируемости и отказоустойчивости (выход из строя одного сервиса-подписчика не останавливает обработку события другими).
- Упрощение добавления новых сервисов, реагирующих на существующие события.
- Реализация событийно-ориентированной архитектуры (EDA).
Какие плюсы и минусы хореографии?
Короткий ответ
Плюсы: - Слабая связанность: Сервисы не знают друг о друге, только о событиях. Легко заменять или добавлять сервисы. - Гибкость и расширяемость: Легко добавить нового подписчика на событие без изменения существующих сервисов. - Высокая отказоустойчивость: Сбой одного подписчика не влияет на других. - Масштабируемость: Можно независимо масштабировать сервисы-обработчики событий.
Полный ответ
- Плюсы:
- Слабая связанность: Сервисы не знают друг о друге, только о событиях. Легко заменять или добавлять сервисы.
- Гибкость и расширяемость: Легко добавить нового подписчика на событие без изменения существующих сервисов.
- Высокая отказоустойчивость: Сбой одного подписчика не влияет на других.
- Масштабируемость: Можно независимо масштабировать сервисы-обработчики событий.
- Минусы:
- Сложность мониторинга и отладки: Трудно отследить и визуализировать сквозной бизнес-процесс, так как логика распределена по многим сервисам.
- Сложность обеспечения согласованности: Реализация распределенных транзакций (например, с использованием паттерна Saga) становится сложнее без центрального координатора. Труднее обрабатывать ошибки и выполнять компенсационные действия.
- Риск циклических зависимостей: Можно случайно создать циклы событий.
- Сложнее понять общую картину: Общая логика взаимодействия не очевидна из кода одного сервиса.
Что такое Оркестрация? Для чего используют?
Короткий ответ
Оркестрация (Orchestration): В контексте распределенных систем – это паттерн взаимодействия, при котором существует центральный компонент (оркестратор), который управляет потоком выполнения бизнес-процесса, координируя вызовы других сервисов.
Полный ответ
- Оркестрация (Orchestration): В контексте распределенных систем – это паттерн взаимодействия, при котором существует центральный компонент (оркестратор), который управляет потоком выполнения бизнес-процесса, координируя вызовы других сервисов.
- Принцип: Оркестратор получает запрос, затем последовательно (или параллельно) вызывает другие сервисы в нужном порядке, собирает их ответы, принимает решения на основе этих ответов и управляет общим состоянием процесса. Взаимодействие обычно происходит через прямые запросы (например, REST, gRPC).
- Аналогия: Дирижер (оркестратор), управляющий оркестром (сервисами). Дирижер указывает каждому инструменту, когда и что играть.
- Для чего используют:
- Реализация сложных бизнес-процессов, требующих координации нескольких сервисов.
- Обеспечение четкой видимости и контроля над потоком выполнения.
- Упрощение управления транзакциями и компенсациями (оркестратор отвечает за это).
- Централизация логики принятия решений в процессе.
Какие плюсы и минусы оркестрации?
Короткий ответ
Плюсы: - Прозрачность и управляемость: Легко понять, отследить и отладить поток выполнения бизнес-процесса, так как он централизован. - Централизованная логика: Упрощает реализацию сложной логики ветвления и принятия решений. - Упрощенное управление транзакциями/компенсациями: Оркестратор может управлять распределенной транзакцией (например, Saga), вызывая компенсирующие действия при сбоях.
Полный ответ
- Плюсы:
- Прозрачность и управляемость: Легко понять, отследить и отладить поток выполнения бизнес-процесса, так как он централизован.
- Централизованная логика: Упрощает реализацию сложной логики ветвления и принятия решений.
- Упрощенное управление транзакциями/компенсациями: Оркестратор может управлять распределенной транзакцией (например, Saga), вызывая компенсирующие действия при сбоях.
- Проще обработка ошибок: Централизованное место для обработки ошибок, возникающих в вызываемых сервисах.
- Минусы:
- Сильная связанность: Сервисы зависят от оркестратора, а оркестратор знает обо всех участвующих сервисах и их API.
- Оркестратор как узкое место (Bottleneck): Вся нагрузка по координации ложится на оркестратор, он может стать узким местом производительности.
- Оркестратор как единая точка отказа (Single Point of Failure): Сбой оркестратора останавливает выполнение всех координируемых им процессов.
- Риск превращения оркестратора в “умный монолит”: Если слишком много логики переносится в оркестратор, он может стать сложным и трудно поддерживаемым.
Как сделать систему, которая будет консистентна, доступна и устойчивой на части? Что такое CAP-теорема?
Короткий ответ
CAP-теорема (Теорема Брюера): Фундаментальная теорема для распределенных систем. Она утверждает, что любая распределенная система хранения данных может одновременно обеспечивать не более двух из следующих трех гарантий: 1. Consistency (Согласованность): Все узлы видят одни и те же данные в один и тот же момент времени. Любое чтение вернет результат самой последней успешной записи. 2.
Полный ответ
- CAP-теорема (Теорема Брюера): Фундаментальная теорема для распределенных систем. Она утверждает, что любая
распределенная система хранения данных может одновременно обеспечивать не более двух из следующих трех гарантий:
- Consistency (Согласованность): Все узлы видят одни и те же данные в один и тот же момент времени. Любое чтение вернет результат самой последней успешной записи.
- Availability (Доступность): Любой запрос к не вышедшему из строя узлу системы завершается корректным откликом (без ошибок), но без гарантии, что он содержит самую последнюю запись. Система всегда доступна для чтения и записи.
- Partition Tolerance (Устойчивость к разделению): Система продолжает функционировать (остается доступной или согласованной) даже в случае потери (или задержки) произвольного числа сообщений между узлами сети (т.е. при разделении сети на изолированные части).
- Выбор: Поскольку сетевые сбои (P) в распределенных системах неизбежны, на практике приходится выбирать между
Согласованностью (C) и Доступностью (A) во время разделения сети:
- CP-системы: Выбирают Согласованность в ущерб Доступности. Во время разделения сети часть системы (или вся система) может стать недоступной для записи (или даже чтения), чтобы избежать рассинхронизации данных. (Пример: Многие реляционные БД в режиме строгой кластеризации).
- AP-системы: Выбирают Доступность в ущерб Согласованности. Система остается доступной для чтения и записи даже во время разделения, но данные на разных узлах могут временно расходиться (достигается eventual consistency - согласованность в конечном счете). (Пример: Cassandra, DynamoDB, DNS).
- Как сделать систему (компромиссы):
- Полностью удовлетворить все три свойства одновременно - невозможно по теореме CAP.
- Нужно определить бизнес-требования: что важнее в конкретном случае – немедленная согласованность или максимальная доступность?
- Для достижения баланса:
- Использовать кворумные чтения/записи (чтобы гарантировать чтение актуальных данных с N/2+1 узлов).
- Применять eventual consistency и механизмы разрешения конфликтов (Last Write Wins, CRDT).
- Использовать разные модели согласованности для разных частей системы.
- Проектировать с учетом устойчивости к разделению (P) (использовать таймауты, повторные попытки, circuit breakers).
- Применять Saga Pattern для управления распределенными транзакциями в AP-системах.
Что такое API gateway?Для чего используется?
Короткий ответ
API Gateway (Шлюз API): Это сервер (или сервис), который выступает единой точкой входа для всех клиентских запросов к бэкенд-сервисам системы (особенно в микросервисной архитектуре). Он действует как фасад или обратный прокси (reverse proxy). - Для чего используется (основные функции): 1. Маршрутизация запросов (Routing): Направляет входящие запросы от клиентов к соответствующим внутренним сервисам. 2.
Полный ответ
- API Gateway (Шлюз API): Это сервер (или сервис), который выступает единой точкой входа для всех клиентских запросов к бэкенд-сервисам системы (особенно в микросервисной архитектуре). Он действует как фасад или обратный прокси (reverse proxy).
- Для чего используется (основные функции):
- Маршрутизация запросов (Routing): Направляет входящие запросы от клиентов к соответствующим внутренним сервисам.
- Аутентификация и Авторизация: Централизованно проверяет права доступа клиентов перед передачей запроса внутрь системы.
- Агрегация/Композиция API: Может объединять данные из нескольких микросервисов в один ответ для клиента, уменьшая количество запросов от клиента.
- Трансляция протоколов: Может преобразовывать протоколы (например, принимать REST, а вызывать gRPC внутри).
- Балансировка нагрузки (Load Balancing): Распределяет нагрузку между экземплярами внутренних сервисов.
- Ограничение частоты запросов (Rate Limiting / Throttling): Защищает бэкенд-сервисы от перегрузки и злоупотреблений.
- Кэширование: Кэширует ответы от сервисов для ускорения повторных запросов.
- Логирование и Мониторинг: Централизованный сбор метрик и логов по всем входящим запросам.
- Преобразование запросов/ответов: Адаптация API для разных типов клиентов (веб, мобильные).
- Цель: Упростить клиентские приложения (им не нужно знать о множестве бэкенд-сервисов), инкапсулировать внутреннюю структуру системы, обеспечить единую точку для применения сквозных политик (безопасность, логирование, rate limiting).
Что такое балансировщик? Для чего используется?
Короткий ответ
Балансировщик нагрузки (Load Balancer): Это устройство или программное обеспечение, которое распределяет входящий сетевой трафик (запросы) между несколькими серверами (или экземплярами сервисов), выполняющими одну и ту же функцию. - Для чего используется: 1.
Полный ответ
- Балансировщик нагрузки (Load Balancer): Это устройство или программное обеспечение, которое распределяет входящий сетевой трафик (запросы) между несколькими серверами (или экземплярами сервисов), выполняющими одну и ту же функцию.
- Для чего используется:
- Повышение доступности и отказоустойчивости: Если один из серверов выходит из строя, балансировщик автоматически перестает направлять на него трафик и перенаправляет его на работающие серверы. Пользователи не замечают сбоя (или замечают минимальные перебои).
- Увеличение производительности и масштабируемости: Распределение нагрузки позволяет обрабатывать больше запросов, чем мог бы один сервер. Можно легко добавлять новые серверы за балансировщик для горизонтального масштабирования.
- Оптимизация использования ресурсов: Обеспечивает более равномерную загрузку серверов.
- Упрощение обслуживания: Позволяет выводить серверы из эксплуатации для обновления или ремонта без остановки всего сервиса.
- Алгоритмы балансировки: Round Robin (по кругу), Least Connections (на сервер с наименьшим числом активных соединений), IP Hash (клиент с одним IP всегда попадает на один сервер), Weighted Round Robin (с учетом мощности серверов) и др.
- Уровни работы: Могут работать на разных уровнях модели OSI (L4 - транспортный уровень, L7 - уровень приложений). L7-балансировщики “умнее”, могут принимать решения на основе HTTP-заголовков, URL и т.д.
Что такое Event Sourcing?
Короткий ответ
Event Sourcing (Источникование событий): Это архитектурный паттерн, при котором все изменения состояния приложения записываются и хранятся как последовательность неизменяемых (immutable) событий во времени, а не только текущее состояние.
Полный ответ
- Event Sourcing (Источникование событий): Это архитектурный паттерн, при котором все изменения состояния приложения записываются и хранятся как последовательность неизменяемых (immutable) событий во времени, а не только текущее состояние.
- Принцип: Вместо того чтобы обновлять текущее состояние данных в базе (например,
UPDATE users SET status = 'active' WHERE id = 123), система генерирует и сохраняет событие, описывающее произошедшее изменение (например,UserActivated { userId: 123, timestamp: ... }). Текущее состояние объекта (или системы в целом) можно восстановить (реконструировать) в любой момент времени, проиграв (replaying) последовательность событий, относящихся к этому объекту, с самого начала. - Ключевые компоненты:
- Событие (Event): Неизменяемая запись о факте, произошедшем в прошлом.
- Хранилище событий (Event Store): База данных, оптимизированная для записи и чтения последовательностей событий (часто используются специализированные БД или брокеры вроде Kafka).
- Агрегат (Aggregate): Объект доменной модели, который обрабатывает команды и генерирует события. Его состояние определяется последовательностью примененных к нему событий.
- Преимущества:
- Полный аудиторский след: Вся история изменений сохраняется, что ценно для анализа, отладки и требований регуляторов.
- Возможность реконструкции прошлого состояния: Можно узнать состояние системы на любой момент времени.
- Временные запросы (Temporal Queries): Легко отвечать на вопросы о том, что происходило в прошлом.
- Основа для CQRS: Естественно разделяет команды (запись событий) и запросы (чтение проекций).
- Улучшенная производительность записи: Запись событий – это обычно быстрая операция добавления (append-only).
- Недостатки:
- Сложность запроса текущего состояния: Требуется механизм проекций (создание и обновление моделей для чтения) или перепроигрывание событий, что может быть медленно для агрегатов с длинной историей.
- Eventual Consistency: Модели для чтения (проекции) часто обновляются асинхронно и могут отставать от хранилища событий.
- Эволюция схемы событий: Изменение формата событий со временем требует аккуратного управления версиями.
- Более высокий порог входа и сложность реализации по сравнению с традиционным подходом CRUD.