Интеграция шины сообщений и повторная синхронизация ограниченных контекстов после простоя - служебная шина 1.0

Я только что загрузил магазин событий joliver и хочу подключить служебную шину к Windows Service Bus 1.0 для приложения, разделенного более чем на один процесс с ограниченным контекстом.

Если ограниченный контекст был отключен, в то время как события в других ограниченных контекстах были созданы (или даже могут быть развернуты новым контекстом), я могу видеть следующую последовательность событий.

  1. Например, ContextA, ContextB и ContextC, все подключенные с помощью служебной шины 1.0 и каждый контекст со своим собственным хранилищем событий, все они используют одну и ту же объединительную плату обмена сообщениями шины.
  2. ContextC переходит в автономный режим.
  3. Когда ContextC возвращается в исходное состояние, другие ограниченные контексты должны быть уведомлены о событиях, которые необходимо повторно отправить в контекст, который только что вернулся в оперативный режим. Эти события воспроизводятся из каждого хранилища событий.

Мои вопросы:

  1. Вышеупомянутый сценарий будет применяться к любым библиотекам источников событий, поэтому есть ли какой-либо код инфраструктуры поверх этого, который я могу использовать, или мне нужно использовать собственный?
  2. Как в Windows Service Bus 1.0 объединить порядковые номера в моем хранилище событий с порядковыми номерами в служебной шине?
  3. Каков наилучший способ обнаружения и обработки уже полученных событий безопасным способом (защита от сбоев обработчиков сообщений)?

person morleyc    schedule 15.03.2013    source источник
comment
На этот вопрос было больше ответов, прежде чем вы расширили его, включив гораздо больше предположений! Хотя есть трещина ...   -  person Ruben Bartelink    schedule 17.03.2013
comment
Все, что мне нужно сократить, дайте мне знать, и я отредактирую ... Все, что мне нужно, это способ синхронизировать автономные ограниченные контексты, и я расширил свою идею. Могу удалить, если поможет прояснить вопрос   -  person morleyc    schedule 17.03.2013
comment
Возможно, подумайте о том, чтобы исключить из этого вопроса распределение событий по BC (вы оптимизируете самостоятельные пабы) и задать его отдельно, поскольку он не имеет ничего общего с хранилищами событий и сделает вас более запутанным, чтобы получить полезные ответы на ваш основной вопрос.   -  person Ruben Bartelink    schedule 17.03.2013
comment
Что касается служебной шины 1.0, можете ли вы уточнить, видите ли вы все это как в Azure или локально (или, надеюсь, не в обоих сразу!).   -  person Ruben Bartelink    schedule 17.03.2013
comment
Также подумайте о том, чтобы просто использовать мой бессвязный ответ как способ задать совершенно новый набор более коротких вопросов, на которые будет легче ответить (и задать!)   -  person Ruben Bartelink    schedule 17.03.2013
comment
@RubenBartelink, спасибо :) Я урезал вопрос, могу подтвердить, что все ограниченные контексты используют одну и ту же объединительную панель обмена сообщениями. Каждый BC будет воспроизводить события из своего собственного хранилища событий, когда его спросят.   -  person morleyc    schedule 17.03.2013
comment
Также выделите отдельный вопрос stackoverflow.com/questions/15458075/   -  person morleyc    schedule 17.03.2013
comment
Хорошо, прежде чем я прочитал вопрос, я не думаю, что это хорошая идея, вам нужна более слабая связь, чем это (и более чистый способ управления обработкой ошибок и отказоустойчивостью).   -  person Ruben Bartelink    schedule 17.03.2013
comment
К своему ответу я добавил ответы на ваши отредактированные вопросы. Я бы посоветовал нам больше не возиться ни с вашим вопросом, ни с моим ответом для всеобщего здравого смысла. Пожалуйста, задайте еще раз хотя бы небольшую часть вопроса, если что-то сбивает с толку или не соответствует вашему мнению о том, что вам нужно.   -  person Ruben Bartelink    schedule 17.03.2013


Ответы (1)


Вышеупомянутый сценарий будет применяться к любым библиотекам источников событий, поэтому есть ли какой-либо код инфраструктуры поверх этого, который я могу использовать, или мне нужно использовать собственный?

Понятие механизма Проекции, привязанного к событиям, безусловно, широко распространено. К сожалению, существует множество способов сделать это в зависимости от вашего стека, требований к производительности и масштабируемости, а также многих других факторов.

В результате я не знаю о коммодитизированном объекте такого рода.

Магазин GetEventStore имеет встроенную возможность проецирования, которая выглядит чрезвычайно мощной и избавляет от необходимости создавать все это вне стола. До его существования я бы сказал, что не следует даже думать о том, чтобы игнорировать SRPness JOES.

Вы почти ничего не сказали о своем реальном стеке, кроме как упомянули Azure.

Как с помощью служебной шины Windows связать порядковые номера в моем хранилище событий с порядковыми номерами в служебной шине?

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

Каков наилучший способ обнаружения и обработки уже полученных событий безопасным способом (защита от сбоев обработчиков сообщений)?

Если вы используете Azure и рассматриваете ServiceBus, то темы можно использовать для обеспечения хотя бы однократной доставки (и вы будете использовать средство сеансов). Посмотрите двухчасовое подробное видео по подписке ClemensV плюс несколько других эпизодов, иначе вы потратите столько же времени на ошибки)

Чтобы ограничить широковещательный трафик, если ContextC запрашивает повторы из ContextA и ContextB, есть ли способ, чтобы эти сообщения воспроизведения были отправлены только в ContextC? Или мне не стоит об этом беспокоиться?

Mu. Вы начали спрашивать, была ли эта идея хорошей, но теперь, кажется, усвоили предположение, что это правильный путь.

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

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


РЕДАКТИРОВАТЬ: ответы на ваши отредактированные версии вопросов 2+

Как в Windows Service Bus 1.0 объединить порядковые номера в моем хранилище событий с порядковыми номерами в служебной шине?

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

Как только события относятся к теме, они получают MessageSequenceNumber, и подписка (при наличии сеанса) доставляет (фактически подписчик их получает) их последовательно.

Каков наилучший способ обнаружения и обработки уже полученных событий безопасным способом (защита от сбоев обработчиков сообщений)?

Это встроено в служебную шину (или в любой механизм очередей). Вы не отмечаете сообщение как завершенное, пока оно не будет успешно обработано. Любой сбой приводит к прекращению использования (что возвращает его в очередь на повторную обработку).

Абонент, который делает перерыв, отключается от сети или выполняет резервное копирование, естественно, рассматривается в Теме.

person Ruben Bartelink    schedule 16.03.2013