Синхронизация данных на стороне запроса в CQRS — не будет ли конфликтов?

У меня есть общий вопрос о парадигме CQRS в целом.

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

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

Другими словами, если бы мы попытались использовать модель pub/sub для EventBus, и было бы много разных подписчиков на определенный тип события, не могли бы они начать конкурировать друг с другом из-за обновления различных битов денормализованных данных? Разве это не поставит нас в ту же лодку, что и до CQRS?

Как я слышал, это объяснялось, похоже, что CQRS должен полностью покончить с этим соперничеством, но является ли это просто идеалом, и на самом деле мы только сводим его к минимуму? Я чувствую, что могу что-то упустить здесь, но не могу понять это.


person cwash    schedule 17.05.2013    source источник


Ответы (1)


все зависит от того, как вы спроектировали инфраструктуру. Строго говоря, CQRS сам по себе ничего не говорит о том, как обновляются модели Query. Использование событий — это лишь один из вариантов, который у вас есть. CQRS также ничего не говорит о разрешении конфликтов. Это всего лишь архитектурный паттерн, который оставляет вам больше возможностей и возможностей для решения таких задач, как параллелизм. В «обычных» архитектурах, таких как многоуровневая архитектура, у вас часто вообще нет этих опций.

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

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

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

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

person Allard    schedule 17.05.2013
comment
Просто интересно, вы хотели добавить к своему вопросу тег Axon вместо Axiom? - person Allard; 17.05.2013
comment
Спасибо за указание на неверный тег, не обратил пристального внимания на автозаполнение. - person cwash; 17.05.2013
comment
Спасибо и за ответ! - person cwash; 17.05.2013