Я розглядаю проект про переміщення частини нашого WCF на базі WCF на модель службової шини (можливо, nServiceBus) і використовую деякий базовий pub-sub для досягнення розділення команд-запитів .
Я не новачок у SOA або навіть у моделях службових шин, але, зізнаюся, до недавнього часу моя концепція "розділення" обмежувалася дзеркальним відображенням та реплікацією баз даних. Тим не менш, мене приваблює ця ідея, тому що, здається, вона забезпечує всі переваги системи, що є врешті-решт, одночасно уникаючи багатьох очевидних недоліків (особливо, відсутність належної підтримки транзакцій).
Я багато читав на цю тему від Уді Дахана, який в основному є гуру архітектури ESB (принаймні, у світі Microsoft), але одне, що він каже, нас справді спантеличує:
Оскільки ми отримуємо більші сутності з більшою кількістю полів, ми також отримуємо більше акторів, які працюють з тими ж сутностями, і чим більша ймовірність того, що в якийсь момент щось зачепить якийсь їх атрибут, збільшуючи кількість конфліктів одночасності.
[...]
Основним елементом CQRS є переосмислення дизайну користувальницького інтерфейсу для того, щоб ми могли зафіксувати наміри наших користувачів таким чином, щоб зробити перевагу клієнта іншою одиницею роботи для користувача, ніж вказувати на те, що клієнт перемістився або що він отримав одружився. Використання інтерфейсу, схожого на Excel, для зміни даних не передбачає наміру, як ми бачили вище.
- Уді Дахан, уточнений CQRS
З точки зору, описаного в цитаті, важко сперечатися з цією логікою. Але це, здається, йде проти зерна стосовно SOA. SOA (і справді сервіси загалом) повинні мати справу з грубозернистими повідомленнями , щоб мінімізувати мережеву балаканину - серед багатьох інших переваг.
Я усвідомлюю, що мережевий балаканин не викликає проблем, коли у вас високорозподілені системи з хорошою чергою повідомлень і жодним багажем RPC, але не видається розумним цілком відмовитись від проблеми. Udi майже здається, що кожна зміна атрибуту (тобто оновлення поля) повинна бути власною командою, що важко уявити в контексті того, що один користувач потенційно може оновлювати сотні чи тисячі об'єднаних об'єктів та атрибутів, як це часто відбувається з традиційними веб-сервіс.
Одне пакетне оновлення в SQL Server може зайняти частку секунди, отримавши хороший високопараметризований запит, табличний параметр або об'ємну вставку до інтерактивної таблиці; обробка всіх цих оновлень по одному відбувається повільно, повільно, повільно , а обладнання для баз даних OLTP є найдорожчим з усіх для масштабування та зменшення масштабів.
Чи є якийсь спосіб узгодити ці конкуруючі проблеми? Я думаю про це неправильно? Чи має ця проблема добре відоме рішення у світі CQS / ESB?
Якщо ні, то як вирішити, яким повинен бути "правильний рівень" деталізації в команді? Чи є якийсь "стандартний", який можна використовувати як вихідний пункт - на зразок 3NF в базах даних - і відхилятися лише тоді, коли ретельне профілювання припускає потенційно значну користь від продуктивності?
Чи, можливо, це одна з тих речей, яка, незважаючи на кілька висловлених різними експертами думок, насправді є лише питанням думки?