ساخته‌شده توسط هوش مصنوعیبهبودیافته توسط مردم

Riqli · اسناد زنده · به‌طور مداوم به‌روزرسانی می‌شوند

جایی که دانش هوش مصنوعی با تجربه انسان گره می‌خورد.

اشتراک‌گذاری با دوستان
image

Микросервисы CQRS и Event Sourcing с Kafka. Hard skill. (CQRS event sourcing. Микросервисы Kafka. Kafka микросервисы. CQRS Kafka обучение. Tutorial. Practice. Standard.)

بخش‌ها

Основы микросервисной архитектуры

محتویات

Микросервисы — это небольшие, слабо связанные приложения, которые могут отказывать независимо друг от друга. Основная цель — достижение независимости. Ключевые принципы: микросервисы не должны разделять код или данные, а для связи использовать асинхронное событийно-ориентированное взаимодействие через брокер сообщений, такой как Apache Kafka.

بخش‌ها

Шаблоны CQRS и Event Sourcing

محتویات

CQRS (Command and Query Responsibility Segregation) разделяет приложение на command (запись) и query (чтение) части. Это позволяет масштабировать их независимо, оптимизировать схемы данных и снизить конкуренцию за блокировки. Event Sourcing хранит все изменения состояния как неизменяемую последовательность событий (events) в event store, а не только текущее состояние.

محتویات

В CQRS используются три типа сообщений: Commands (описывают действие, например, `NewPostCommand`), Events (описывают факт события в прошлом, например, `PostCreatedEvent`) и Queries (запросы данных). Агрегат (Aggregate) — это доменная сущность, отвечающая за поддержание неизменного состояния на стороне записи, которая использует события для изменения своего состояния.

بخش‌ها

Паттерн Mediator для диспетчеризации

محتویات

Паттерн Mediator (Посредник) используется для слабой связи между объектами. В контексте CQRS, ICommandDispatcher выступает в роли медиатора, который принимает Command и находит соответствующий Command Handler. Command Handler — это конкретный обработчик, содержащий бизнес-логику для конкретной команды. Он зависит от Event Sourcing Handler для загрузки и сохранения агрегата.

بخش‌ها

Event Store и работа с событиями

محتویات

Event Store — это база данных для хранения событий. Она должна быть immutable (append-only), события хранятся в хронологическом порядке, а состояние агрегата восстанавливается через replaying. Event Model представляет схему документа в MongoDB, включая идентификатор агрегата, версию, тип события и сами данные события. Optimistic Concurrency Control (оптимистичная блокировка) обеспечивается проверкой версии при сохранении.

محتویات

Event Sourcing Handler отвечает за загрузку и сохранение агрегатов. Event Store Repository — это низкоуровневый репозиторий для прямого взаимодействия с MongoDB. Polymorphic deserialization (полиморфная десериализация) с помощью Event Json Converter позволяет корректно восстанавливать конкретные типы событий из базового абстрактного класса, используя поле-дискриминатор `type`.

بخش‌ها

Apache Kafka и Event Bus

محتویات

Apache Kafka — это распределенная потоковая платформа, используемая как Event Bus (шина событий). Kafka Producer публикует сообщения в Topics. Kafka Consumer читает сообщения из топиков. Consumer Group позволяет масштабировать обработку: несколько экземпляров потребителя делят нагрузку по партициям (partitions). Offset — это позиция в логе коммитов, которая отслеживается для каждой Consumer Group.

محتویات

События публикуются в Topic (`socialmedia.posts.events`) после сохранения в Event Store. Consumer Hosted Service (фоновое задание) запускает Kafka Consumer, который прослушивает топик, десериализует события (используя EventJsonConverter) и передает их в EventHandler для обновления Read Database (например, SQL Server).

بخش‌ها

Read Side: Query API и база данных

محتویات

Read Database (в проекте — Microsoft SQL Server) содержит материализованные представления (materialized views), оптимизированные для запросов. Database Context (DbContext) и Entity Framework Core используются для взаимодействия с БД. Repositories (Post Repository, Comment Repository) реализуют паттерн Repository для инкапсуляции логики доступа к данным. Схема создается автоматически при старте приложения через `EnsureCreated()`.

محتویات

Для обработки запросов (Queries) также используется паттерн Mediator с IQueryDispatcher и QueryHandler. Контроллер (PostLookupController) принимает HTTP GET запросы, создает объект Query (`FindAllPostsQuery`, `FindPostByIdQuery`, и т.д.) и отправляет его через диспетчер. Query Handler использует соответствующий репозиторий для получения данных из Read Database и возвращает DTO (`PostLookupResponse`) клиенту.

بخش‌ها

Восстановление Read Database

محتویات

Ключевое преимущество Event Sourcing — возможность пересоздать всю Read Database из Event Store. Для этого создается специальная команда (RestoreReadDbCommand), которая загружает все события из event store и повторно публикует их в Kafka. Event Consumers обрабатывают их заново, полностью восстанавливая read-модель. Это позволяет быстро переключиться на другой тип БД (например, с MS SQL на PostgreSQL) без потери данных.


سوالات

Какой принцип НЕ рекомендуется при проектировании микросервисов для достижения высокой автономности?

پاسخ‌هاصحیح

Разделение кода и данных (Shared code/data) между сервисами, даже если это нарушает принцип DRY (Don't Repeat Yourself).

توضیحات

Хотя DRY важен, в микросервисах независимость и автономность важнее повторного использования кода. Общий код создает скрытые связи, и ошибка в одном месте может затронуть все сервисы.

پاسخ‌هااشتباه

Использование асинхронного событийно-ориентированного взаимодействия через брокер сообщений.


سوالات

Какое из утверждений лучше всего описывает совместное использование CQRS и Event Sourcing?

پاسخ‌هاصحیح

Event Sourcing идеально подходит для реализации command части в CQRS, храня все изменения как события и позволяя пересоздавать состояние агрегата (aggregate).

توضیحات

CQRS разделяет операции чтения и записи. Event Sourcing обеспечивает надежный механизм хранения изменений на стороне записи и восстановления состояния, что является идеальным дополнением к command-модели.

پاسخ‌هااشتباه

CQRS и Event Sourcing — это взаимозаменяемые паттерны для оптимизации чтения из базы данных.


سوالات

Как правильно именовать команду (Command) для создания новой сущности в CQRS?

پاسخ‌هاصحیح

NewPostCommand или CreatePostCommand — команда должна называться глаголом в повелительном наклонении.

توضیحات

Имя команды отражает намерение выполнить действие. В отличие от событий, которые именуются в прошедшем времени (например, `PostCreated`), команды не содержат информации о результате.

پاسخ‌هااشتباه

PostCreatedEvent — так именуются события, которые уже произошли.


سوالات

Какова роль `CommandDispatcher` в реализации CQRS с использованием паттерна Mediator?

پاسخ‌هاصحیح

Он принимает объект Command, находит зарегистрированный для него Command Handler и перенаправляет команду на выполнение.

توضیحات

Dispatcher скрывает сложность поиска нужного обработчика от вызывающего кода (например, контроллера), что снижает связанность и упрощает тестирование.

پاسخ‌هااشتباه

Он напрямую изменяет состояние агрегата и сохраняет события в базу данных.


سوالات

Какая операция НЕ должна быть доступна при работе с Event Store?

پاسخ‌هاصحیح

Операции UPDATE и DELETE для уже сохраненных событий, так как Event Store является immutable (неизменяемым).

توضیحات

Event Store — это журнал фактов. Изменение или удаление события исказило бы историю. Если событие было ошибочным, создается новое компенсирующее событие.

پاسخ‌هااشتباه

Операции INSERT (добавление новых событий).


سوالات

Как решается проблема полиморфной десериализации событий при чтении из Event Store в MongoDB?

پاسخ‌هاصحیح

Использованием пользовательского конвертера JSON (JsonConverter), который анализирует поле-дискриминатор (например, `type`) для создания экземпляра конкретного класса события.

توضیحات

Библиотека сериализации (например, System.Text.Json) не может автоматически определить, экземпляр какого класса нужно создать из JSON, поэтому требуется кастомная логика, основанная на типе события.

پاسخ‌هااشتباه

Сохранение всех событий как строк JSON и дальнейший ручной парсинг с помощью `switch` по типу.


سوالات

Какой компонент Kafka позволяет нескольким экземплярам одного потребителя обрабатывать сообщения из одного топика параллельно, не дублируя их?

پاسخ‌هاصحیح

Consumer Group: Kafka назначает каждую партицию (partition) топика только одному потребителю внутри группы, распределяя нагрузку.

توضیحات

Consumer Group гарантирует, что каждое сообщение будет обработано только одним потребителем из группы. Горизонтальное масштабирование достигается добавлением новых потребителей в группу.

پاسخ‌هااشتباه

Offset, который отслеживает прогресс чтения.


سوالات

Где в архитектуре CQRS/ES происходит обновление `Read Database` (базы данных для запросов)?

پاسخ‌هاصحیح

В EventHandler на стороне Query API, который подписан на события из Kafka и применяет их к Read Database.

توضیحات

Read Database обновляется асинхронно через события из Kafka. Это отделяет процесс записи (Command API) от процесса обновления read-модели.