NEventStore: как масштабируется диспетчеризация неотправленных событий?

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

Подводя итог моему пониманию, событие добавляется к фиксации как неотправленное, затем оно публикуется в диспетчерах и затем помечается как отправленное.

В то же время всякий раз, когда вы подключаете NEventStore, он ищет неотправленные события, а затем отправляет их и помечает событие как отправленное.

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

Подумайте об этой архитектуре:

Client -> Command Bus -> Command Handler -> EventStore persist -> Dispatch to Event Handlers

Если у нас есть много Command Handlers для обработки нашей нагрузки, мы также будем сохранять много событий.

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

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


person mbp    schedule 15.08.2013    source источник


Ответы (2)


Этот вопрос действительно старый, но, поскольку я только что наткнулся на него, я добавлю свои два цента: я не думаю, что вы должны подключать новый экземпляр NEventStore для каждого экземпляра обработчика команд. Объекты NEventStore не имеют состояния, поэтому вы можете использовать один экземпляр для всего процесса (или AppDomain).

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

person Fabian Schmied    schedule 28.03.2016

На мой взгляд допустимо, что в этом случае сообщения отправляются несколько раз. Фактически основывайтесь на этом документе:

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

Так что да, потребители могут в конечном итоге получить одно и то же сообщение несколько раз.

Но, как говорит Фабиан Шмид, я думаю, что вам следует создавать (подключать) neventstore только один раз для каждого экземпляра приложения, а не для каждого обработчика команд.

person Davide Icardi    schedule 13.05.2016