Давайте представим, что у нас есть несколько ограниченных контекстов, и все они разделены с помощью служб обмена сообщениями (очередей, шин сообщений).
Какой-то бизнес-процесс, скажем Order processing, охватывает несколько ограниченных контекстов.
Например, Order, размещенный пользователем, первоначально принимается, затем проверяется, оплата обрабатывается, запасы корректируются, Order планируются к доставке и, наконец, Order переходят в состояние доставлено.
ЭДА реализуется с помощью хореографии без центрального Manager.
Также есть дашборд, который должен на каждом этапе отображать состояние заказа.
Теперь, из-за асинхронного характера процесса, событие предыдущего состояния (например, PaymentProcessed) может попасть в контекст границы Dashboard после следующего состояния (например, ScheduledForDelivery).
Как справиться с ситуацией, когда Dashboard всегда должна отражать последнее состояние процесса?
«и все они разделены с помощью служб обмена сообщениями». Это предположение, которое вы делаете из проекта, или вы это утверждаете? ...потому что компоненты могут быть тесно связаны, даже если между ними есть посредник.
Где сохраняется текущее состояние Order? (не говорите «в памяти» — это не средство сохранения). Разве ваша панель управления не может просто прочитать все это из производственной базы данных?
«Теперь, из-за асинхронного характера процесса, событие предыдущего состояния (например, PaymentProcessed) может попасть в контекст границы Dashboard после следующего состояния (например, ScheduledForDelivery)». - в этом случае ограничения этой проблемы (как вы ее описали) не могут быть удовлетворены, потому что вы только что сказали, что невозможно получить последнее состояние для Order.
@Dai Ну, это зависит от того, как вы определяете «последний». Вы можете рассуждать об этом так, что вы не разрешаете этот конкретный переход, который переводит Dashboard в предыдущее состояние. Это может быть достигнуто с использованием конечного автомата, например.
Состояние Order сохраняется в базе данных.
Компоненты должны быть отделены для других причин, стоящих за этой темой.


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