EventStore и более одной единицы работы?

В ответе на несколько вопросов Джонатон Оливер упоминает об использовании AsynchronousCommitDispatcher для обработки нескольких единиц работы.

Я все еще на стадии разработки своего проекта (и все еще изучаю CRQS и ES) и у меня есть несколько вопросов:

1) Буду ли я создавать AsynchronousCommitDispatcher для каждого совокупного корня, на который будет влиять событие домена?

2) Что произойдет, если у меня есть какой-то механизм блокировки, когда отправленное событие не может внести изменения в сводный корень, если оно заблокировано другим пользователем? AsynchronousCommitDispatcher повторяется, если есть блокировка?

3) Что если система выйдет из строя до того, как будет обработано событие домена? Если я не настаиваю на том факте, что он не был обработан, не будет ли он потерян?

4) Первоначально я понимал, что типы диспетчеров предназначены для обмена сообщениями по сети или для обновления модели чтения. Здесь мы используем его для обновления другого совокупного корня. Я это исправлю?

ТИА

JD

1 ответ

Решение

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

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

Да, диспетчеры могут помочь обновить модели чтения, но не так, как вы думаете. Вместо этого диспетчеры просто помещают сообщения в вашу среду обмена сообщениями (MSMQ, RabbitMQ или, на более высоком уровне, NServiceBus/MassTransit). Затем, как только сообщение получено в ваших моделях представления, вы соответственно обновляете таблицы модели представления.

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