Панель мониторинга в дизайне, управляемом событиями

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

Какой-то бизнес-процесс, скажем Order processing, охватывает несколько ограниченных контекстов.

Например, Order, размещенный пользователем, первоначально принимается, затем проверяется, оплата обрабатывается, запасы корректируются, Order планируются к доставке и, наконец, Order переходят в состояние доставлено.

ЭДА реализуется с помощью хореографии без центрального Manager.

Также есть дашборд, который должен на каждом этапе отображать состояние заказа. Теперь, из-за асинхронного характера процесса, событие предыдущего состояния (например, PaymentProcessed) может попасть в контекст границы Dashboard после следующего состояния (например, ScheduledForDelivery).

Как справиться с ситуацией, когда Dashboard всегда должна отражать последнее состояние процесса?

Что такое «ограниченный контекст» в этом контексте?

Dai 06.06.2024 09:07

«и все они разделены с помощью служб обмена сообщениями». Это предположение, которое вы делаете из проекта, или вы это утверждаете? ...потому что компоненты могут быть тесно связаны, даже если между ними есть посредник.

Dai 06.06.2024 09:08

Где сохраняется текущее состояние Order? (не говорите «в памяти» — это не средство сохранения). Разве ваша панель управления не может просто прочитать все это из производственной базы данных?

Dai 06.06.2024 09:13

«Теперь, из-за асинхронного характера процесса, событие предыдущего состояния (например, PaymentProcessed) может попасть в контекст границы Dashboard после следующего состояния (например, ScheduledForDelivery)». - в этом случае ограничения этой проблемы (как вы ее описали) не могут быть удовлетворены, потому что вы только что сказали, что невозможно получить последнее состояние для Order.

Dai 06.06.2024 09:14

@Dai Ну, это зависит от того, как вы определяете «последний». Вы можете рассуждать об этом так, что вы не разрешаете этот конкретный переход, который переводит Dashboard в предыдущее состояние. Это может быть достигнуто с использованием конечного автомата, например.

tlzg 06.06.2024 09:20

Состояние Order сохраняется в базе данных.

tlzg 06.06.2024 09:22

Компоненты должны быть отделены для других причин, стоящих за этой темой.

tlzg 06.06.2024 09:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Создание микрофронтендов с Angular и федерацией модулей в монорепо: Пошаговое руководство
Создание микрофронтендов с Angular и федерацией модулей в монорепо: Пошаговое руководство
Микрофронтенды стали популярным архитектурным паттерном для веб-разработки. С появлением федерации модулей в Webpack 5 реализация микрофронтендов...
1
7
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Примените принцип «никогда не возвращайся». Допустим, заказ должен пройти через состояния state1, state2, state3, затем state4. Добавьте в свою панель управления немного логики, чтобы отклонять любые сообщения, которые содержат приказ «вернуться назад». Если вы получили сообщение state2 о несуществующем заказе, создайте его в этом состоянии. Если позже вы получите сообщение state1 для того же заказа, отклоните его, потому что вы знаете, что state1 идет раньше state2.

Да, я имел в виду нечто подобное. Есть ли обратная сторона такого подхода?

tlzg 10.06.2024 15:02

Ничего, о чем я могу думать.

Christophe Quintard 10.06.2024 15:57

Однажды у меня возникло требование относительно процессов, которые остаются в промежуточном состоянии. Я только что добавил поле даты и времени для каждого штата и каждый раз, когда получал сообщение, обновлял соответствующее поле. Таким образом, я мог бы получить незавершенные процессы и определить некоторые бизнес-правила для выдачи предупреждений всякий раз, когда процесс не достигает конечного состояния в течение заданного времени или если некоторые сообщения отсутствуют.

Christophe Quintard 10.06.2024 16:03

Другие вопросы по теме

CQRS: чтение обновления проекции модели в API
Как несколько потребителей Kafka в одной и той же группе потребителей читают сообщения из одного раздела в теме?
Использование сообщений в теме Kafka как можно скорее
Как управлять версиями пользовательских объектов Serdes в Kafka Stream при использовании API процессора во время последовательного обновления
Существуют ли какие-либо рекомендации по идентификации очередей RabbitMQ для ограниченного контекста в DDD?
Должны ли Kafka системы передачи состояния, переносимые событиями, быть реализованы с использованием GlobalKTable для локальных запросов?
Как я могу обеспечить согласованность при использовании подхода передачи состояния, переносимого событиями, в Kafka
Службы обмена сообщениями Azure: обнаружение отсутствия сообщения
Событие обновления тела модели
Детализация тем в архитектуре, управляемой событиями