Я рассматриваю проект по переносу части нашего SOA на основе WCF на модель служебной шины (возможно, nServiceBus) и использую базовый pub-sub для разделения команд на запросы .
Я не новичок в SOA или даже в моделях шины обслуживания, но признаюсь, что до недавнего времени моя концепция «разделения» была ограничена обычным зеркалированием и репликацией базы данных. Тем не менее, меня привлекает эта идея, потому что она, кажется, обеспечивает все преимущества в конечном итоге непротиворечивой системы, в то же время обходя многие из очевидных недостатков (особенно отсутствие надлежащей поддержки транзакций).
Я много читал на эту тему от Уди Дахана, который в основном является гуру архитектуры ESB (по крайней мере, в мире Microsoft), но одна вещь, которую он говорит, действительно озадачивает меня:
По мере того как мы получаем более крупные сущности с большим количеством полей, мы также получаем больше действующих лиц, работающих с этими же сущностями, и тем выше вероятность того, что что-то коснется некоторого их атрибута в любой момент времени, увеличивая число конфликтов параллелизма.
[...]
Ключевым элементом CQRS является переосмысление дизайна пользовательского интерфейса, чтобы мы могли уловить намерения наших пользователей, так что предпочтение клиента - это другая единица работы для пользователя, отличающаяся от указания того, что клиент переехал или что он получил состоите в браке. Использование Excel-подобного интерфейса для изменения данных не отражает намерения, как мы видели выше.
- Уди Даан, уточненный CQRS
С точки зрения, описанной в цитате, трудно поспорить с этой логикой. Но, похоже, это идет вразрез с SOA. Предполагается, что SOA (и в действительности сервисы в целом) имеют дело с крупнозернистыми сообщениями, чтобы минимизировать сетевые шумы - среди многих других преимуществ.
Я понимаю, что болтовня в сети менее важна, когда у вас есть высокораспределенные системы с хорошей очередью сообщений и отсутствием багажа RPC, но кажется, что не стоит полностью устранять проблему. Кажется, что Уди почти говорит, что каждое изменение атрибута (то есть обновление поля) должно быть его собственной командой, которую трудно представить в контексте одного пользователя, потенциально обновляющего сотни или тысячи объединенных сущностей и атрибутов, как это часто происходит с традиционным веб-сервис.
Одно пакетное обновление в SQL Server может занять доли секунды при наличии хорошего высокопараметрического запроса, табличного параметра или массовой вставки в промежуточную таблицу; обработка всех этих обновлений по одному медленная, медленная, медленная , и аппаратное обеспечение для баз данных OLTP является самым дорогим из всех масштабируемых / масштабируемых.
Есть ли способ примирить эти конкурирующие проблемы? Я думаю об этом неправильно? Есть ли у этой проблемы известное решение в мире CQS / ESB?
Если нет, то как решить, каким должен быть «правильный уровень» гранулярности в Команде? Есть ли какой-то «стандарт», который можно использовать в качестве отправной точки - вроде 3NF в базах данных - и отклоняться только тогда, когда тщательное профилирование предполагает потенциально значительное повышение производительности?
Или это, возможно, одна из тех вещей, которые, несмотря на несколько сильных мнений, высказанных различными экспертами, на самом деле являются просто вопросом мнения?