У меня ограниченный контекст для управления задачами, специфичными для домена. Некоторый пользователь (называемый координатором) может создать задачу и назначить ее другому пользователю (называемому исполнителем). Исполнитель может завершить задачу через некоторое время. В то же время координатор может переназначить задачу другому исполнителю, который отвечает за выполнение этой задачи. Первый исполнитель теряет способность работать с заданием.
Сейчас ситуация осложняется тем, что координаторы работают над веб-приложением (бэкэнд), а исполнители - над их мобильными приложениями (клиентами). Так что ограниченный контекст эффективно распределяется между многими узлами. Кроме того, мобильные приложения могут работать полностью автономно в течение довольно длительного периода времени (несколько дней).
Так что может быть ситуация, когда координатор назначает задачу исполнителю A
, тогда исполнитель отключается. В meatime координатор решил, что не хочет ждать выполнения задачи исполнителем A
и переназначил задачу исполнителю B
. Однако исполнитель A
по некоторым причинам не знал об этом и все равно выполнил задание. Спустя некоторое время исполнитель A
становится онлайн, и теперь мы должны последовательно синхронизировать состояние между его мобильным приложением и бэкэндом, следуя бизнес-правилу, согласно которому задачи могут быть выполнены только их фактическими исполнителями. Исполнитель A
сообщает бэкэнду «Эй, я выполнил задание с таким результатом». Бэкэнд прослушал исполнителя A
, затем он видит задачу, назначенную исполнителю B
. Бэкэнд должен ответить исполнителю A
: «Извините, в данный момент задача не ваша. Пожалуйста, удалите задачу из своего телефона. Я отклоняю ваш результат выполнения задачи».
Реальные сценарии намного сложнее: исполнители и координаторы могут выполнять различные виды действий с задачами совершенно независимо друг от друга. Затем через некоторое время они должны правильно синхронизировать состояние, следуя бизнес-правилам.
Как бы вы реализовали такие синхронизации внутри распределенного ограниченного контекста, которые предполагают разрешение конфликтов (отклонения, компенсации и т. Д.)?