DDD Шина Связи Контекстных Сообщений
Я интегрирую различные контексты с Windows Service Bus и у меня есть несколько вопросов:
1) Как выявляются дубликаты в других ограниченных контекстах? Сохранить последнюю обработанную последовательность сообщений? Я хочу, чтобы возможность повторно запускать события, чтобы позволить повторную синхронизацию новых ограниченных контекстов HandleEvent(OrderPlaced orderPlaced, bool isReplay)
которые будут закуплены для производства в будущем для первоначальной синхронизации.
2) Для меж-контекстной шины сообщений, будем ли мы использовать тему для ограниченного контекста (и иметь пространство имен для группировки ограниченных контекстов)? Или один ограниченный контекст для каждого пространства имен?
3) В документации по шине сообщений говорится, что сообщения могут поступать не по порядку. Какой алгоритм следует использовать для повторной сборки по порядку? Что произойдет, если сообщения 6 и 8 были получены, а 7 не пришли? Будем ли мы ждать указанное время, а затем просто продолжим? Как разрешить самовосстановление?
4) Я полагаю, что вышеупомянутое довольно распространено почти во всех проектах DDD. Существуют ли какие-либо библиотеки, которые обрабатывают сообщения, включая протокол команда / ответ, для запроса синхронизации предыдущих событий из внешнего ограниченного контекста?
1 ответ
Это не отвечает на большинство ваших вопросов, но дает вам альтернативу.
Многие из этих проблем ушли, когда я начал тянуть события вместо того, чтобы подталкивать их ко мне. Если я тяну, я просто сохраняю контрольную точку номера события, до которого я обработал. Когда мне нужно восстановить, я удаляю прочитанные модели и контрольную точку, и новые считанные модели будут созданы автоматически. Поскольку я использую один писатель, дубликаты не проблема. Заказ тоже не проблема.
У нас все еще есть события, которые вытесняются, но они используются только для реактивного поведения. Например; Когда заказ размещен, распечатайте билет.
Имеет ли это смысл для вас, зависит от того, насколько быстро вам нужно реагировать на события и насколько свежими должны быть ваши данные (1 секунда против 30 секунд и т. Д.).