Как сблизить состояние внутри нарушенного ограниченного контекста с возможностью возникновения конфликтов? - PullRequest
0 голосов
/ 30 июня 2019

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

Сейчас ситуация осложняется тем, что координаторы работают над веб-приложением (бэкэнд), а исполнители - над их мобильными приложениями (клиентами). Так что ограниченный контекст эффективно распределяется между многими узлами. Кроме того, мобильные приложения могут работать полностью автономно в течение довольно длительного периода времени (несколько дней).

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

Реальные сценарии намного сложнее: исполнители и координаторы могут выполнять различные виды действий с задачами совершенно независимо друг от друга. Затем через некоторое время они должны правильно синхронизировать состояние, следуя бизнес-правилам.

Как бы вы реализовали такие синхронизации внутри распределенного ограниченного контекста, которые предполагают разрешение конфликтов (отклонения, компенсации и т. Д.)?

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Как бы вы реализовали такие синхронизации внутри распределенного ограниченного контекста, которые предполагают разрешение конфликтов (отклонения, компенсации и т. Д.)?

Наиболее важной отправной точкой для систем «ввода данных» является то, что модель - не книга рекордов, а внешний мир. Сообщения от иногда подключенных систем сообщают вам, что произошло на этих устройствах; Задача модели - вычислить последствия.

Реальный мир не всегда следует счастливому пути.

Извините, в данный момент задача не ваша. Пожалуйста, удалите задачу на вашем телефоне. Я отклоняю ваш результат выполнения задания.

Это, возможно, еще верный ответ от вашей модели. Я бы не сказал «отклонить ваш результат»; мы не отрицаем результат, предоставленный исполнителем - мы объединяем эту информацию с другими собранными нами данными и описываем текущее состояние конечного автомата.

Другими словами, мы добавляем в модель больше путей и состояний, а не настаиваем на том, чтобы реальный мир следовал только счастливому пути.

0 голосов
/ 01 июля 2019

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

См. представление , чтоидет через модель программирования Cadence.

...