Распределенные системы

Что такое клиент-сервер архитектура?

Короткий ответ

Клиент-серверная архитектура: Это модель построения вычислительной сети или программной системы, в которой задачи или сетевая нагрузка распределены между поставщиками услуг (серверами) и заказчиками услуг (клиентами). - Принцип работы: 1. Клиент: Инициирует соединение и отправляет запрос к серверу, запрашивая определенный ресурс или услугу (например, веб-страницу, данные из базы, выполнение операции).

Полный ответ

  • Клиент-серверная архитектура: Это модель построения вычислительной сети или программной системы, в которой задачи или сетевая нагрузка распределены между поставщиками услуг (серверами) и заказчиками услуг (клиентами).
  • Принцип работы:
    1. Клиент: Инициирует соединение и отправляет запрос к серверу, запрашивая определенный ресурс или услугу (например, веб-страницу, данные из базы, выполнение операции). Клиент обычно отвечает за пользовательский интерфейс и взаимодействие с пользователем.
    2. Сервер: Находится в режиме ожидания запросов от клиентов. При получении запроса он обрабатывает его, выполняет необходимые действия (например, извлекает данные, производит вычисления) и отправляет ответ обратно клиенту. Сервер обычно отвечает за хранение данных, бизнес-логику и управление ресурсами.
  • Коммуникация: Клиент и сервер взаимодействуют по сети с использованием определенного протокола (например, 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, сфокусированным на построении одного приложения, а не на интеграции всего предприятия.

Какие есть способы декомпозиции на микросервисы? Какие используешь?

Короткий ответ

Декомпозиция (разделение) монолита или проектирование новой системы в виде микросервисов – сложная задача. Основные подходы:

Полный ответ

Декомпозиция (разделение) монолита или проектирование новой системы в виде микросервисов – сложная задача. Основные подходы:

  1. По бизнес-возможностям (Business Capability): Сервисы выделяются вокруг основных функций или возможностей бизнеса. Это самый популярный и рекомендуемый подход.
    • Пример: Управление заказами, Управление каталогом, Управление пользователями, Обработка платежей, Система уведомлений.
  2. По поддоменам (Domain-Driven Design - DDD): Система делится на логические домены и поддомены (Core, Supporting, Generic). Каждый поддомен может стать основой для одного или нескольких микросервисов. Границы между сервисами соответствуют границам контекстов (Bounded Contexts) в DDD.
    • Пример: В системе e-commerce могут быть поддомены “Продажи”, “Складской учет”, “Доставка”, “Маркетинг”.
  3. По шагам бизнес-процесса/Use Case (Реже): Сервис отвечает за определенный шаг в процессе (например, сервис “Валидация заказа”, сервис “Расчет доставки”). Может привести к слишком сильной связанности (chattiness) между сервисами.
  4. По сущностям/ресурсам (Noun-based): Выделение сервисов вокруг основных сущностей системы (например, сервис “Товары”, сервис “Клиенты”). Похоже на подход по бизнес-возможностям, но акцент больше на данных.
  5. Паттерн “Душитель” (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-теорема (Теорема Брюера): Фундаментальная теорема для распределенных систем. Она утверждает, что любая распределенная система хранения данных может одновременно обеспечивать не более двух из следующих трех гарантий:
    1. Consistency (Согласованность): Все узлы видят одни и те же данные в один и тот же момент времени. Любое чтение вернет результат самой последней успешной записи.
    2. Availability (Доступность): Любой запрос к не вышедшему из строя узлу системы завершается корректным откликом (без ошибок), но без гарантии, что он содержит самую последнюю запись. Система всегда доступна для чтения и записи.
    3. 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).
  • Для чего используется (основные функции):
    1. Маршрутизация запросов (Routing): Направляет входящие запросы от клиентов к соответствующим внутренним сервисам.
    2. Аутентификация и Авторизация: Централизованно проверяет права доступа клиентов перед передачей запроса внутрь системы.
    3. Агрегация/Композиция API: Может объединять данные из нескольких микросервисов в один ответ для клиента, уменьшая количество запросов от клиента.
    4. Трансляция протоколов: Может преобразовывать протоколы (например, принимать REST, а вызывать gRPC внутри).
    5. Балансировка нагрузки (Load Balancing): Распределяет нагрузку между экземплярами внутренних сервисов.
    6. Ограничение частоты запросов (Rate Limiting / Throttling): Защищает бэкенд-сервисы от перегрузки и злоупотреблений.
    7. Кэширование: Кэширует ответы от сервисов для ускорения повторных запросов.
    8. Логирование и Мониторинг: Централизованный сбор метрик и логов по всем входящим запросам.
    9. Преобразование запросов/ответов: Адаптация API для разных типов клиентов (веб, мобильные).
  • Цель: Упростить клиентские приложения (им не нужно знать о множестве бэкенд-сервисов), инкапсулировать внутреннюю структуру системы, обеспечить единую точку для применения сквозных политик (безопасность, логирование, rate limiting).

Что такое балансировщик? Для чего используется?

Короткий ответ

Балансировщик нагрузки (Load Balancer): Это устройство или программное обеспечение, которое распределяет входящий сетевой трафик (запросы) между несколькими серверами (или экземплярами сервисов), выполняющими одну и ту же функцию. - Для чего используется: 1.

Полный ответ

  • Балансировщик нагрузки (Load Balancer): Это устройство или программное обеспечение, которое распределяет входящий сетевой трафик (запросы) между несколькими серверами (или экземплярами сервисов), выполняющими одну и ту же функцию.
  • Для чего используется:
    1. Повышение доступности и отказоустойчивости: Если один из серверов выходит из строя, балансировщик автоматически перестает направлять на него трафик и перенаправляет его на работающие серверы. Пользователи не замечают сбоя (или замечают минимальные перебои).
    2. Увеличение производительности и масштабируемости: Распределение нагрузки позволяет обрабатывать больше запросов, чем мог бы один сервер. Можно легко добавлять новые серверы за балансировщик для горизонтального масштабирования.
    3. Оптимизация использования ресурсов: Обеспечивает более равномерную загрузку серверов.
    4. Упрощение обслуживания: Позволяет выводить серверы из эксплуатации для обновления или ремонта без остановки всего сервиса.
  • Алгоритмы балансировки: 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.