Zastanawiam się nad projektem migracji części naszego SOA opartego na WCF do modelu magistrali usług (prawdopodobnie nServiceBus) i za pomocą kilku podstawowych sub-pubów, aby osiągnąć separację poleceń i zapytań .
Nie jestem nowy w SOA, ani nawet w usługach modeli magistrali, ale przyznaję, że do niedawna moja koncepcja „separacji” ograniczała się do tworzenia kopii lustrzanych i replikacji. Mimo to pociąga mnie ten pomysł, ponieważ wydaje się, że zapewnia on wszystkie korzyści z ostatecznie spójnego systemu, jednocześnie omijając wiele oczywistych wad (w szczególności brak odpowiedniego wsparcia transakcyjnego).
Czytałem dużo na ten temat z Udi Dahan, który jest w zasadzie guru na architekturach ESB (przynajmniej w świecie Microsoft), ale jedno mówi naprawdę mnie zastanawia:
Gdy otrzymujemy większe jednostki z większą liczbą pól, otrzymujemy także więcej aktorów pracujących z tymi samymi jednostkami, a tym większe prawdopodobieństwo, że coś dotknie jakiegoś atrybutu w danym momencie, zwiększając liczbę konfliktów współbieżności.
[...]
Kluczowym elementem CQRS jest przemyślenie projektu interfejsu użytkownika, aby umożliwić nam uchwycenie intencji naszych użytkowników, dzięki czemu wybranie klienta jest inną jednostką pracy dla użytkownika niż wskazanie, że klient się przeprowadził lub że został żonaty. Używanie interfejsu użytkownika podobnego do programu Excel do zmiany danych nie wychwytuje zamiaru, jak widzieliśmy powyżej.
- Udi Dahan, Wyjaśnione CQRS
Z perspektywy opisanej w cytacie ciężko jest kłócić się z tą logiką. Ale wydaje się to sprzeczne z zasadą SOA. SOA (i tak naprawdę ogólnie usługi) mają radzić sobie z gruboziarnistymi wiadomościami , aby zminimalizować rozmowy sieciowe - wśród wielu innych korzyści.
Zdaję sobie sprawę, że gadanie w sieci nie stanowi większego problemu, gdy masz wysoce rozproszone systemy z dobrym kolejkowaniem wiadomości i bez bagażu RPC, ale nie wydaje się rozsądne całkowite odrzucenie problemu. Udi wydaje się niemal mówić, że każda zmiana atrybutu (tj. Aktualizacja pola) powinna być jego własnym poleceniem, co trudno sobie wyobrazić w kontekście jednego użytkownika potencjalnie aktualizującego setki lub tysiące połączonych jednostek i atrybutów, jak to często bywa w przypadku tradycyjnego Serwis internetowy.
Jedna aktualizacja wsadowa w programie SQL Server może zająć ułamek sekundy, biorąc pod uwagę dobrze sparametryzowane zapytanie, parametr o wartości tabeli lub wstawianie zbiorcze do tabeli pomostowej; przetwarzanie wszystkich tych aktualizacji pojedynczo jest powolne, wolne, wolne , a sprzęt bazy danych OLTP jest najdroższy ze wszystkich do skalowania w górę / w górę.
Czy jest jakiś sposób na pogodzenie tych konkurujących ze sobą obaw? Czy myślę o tym w niewłaściwy sposób? Czy ten problem ma dobrze znane rozwiązanie w świecie CQS / ESB?
Jeśli nie, to jak decydować, jaki powinien być „właściwy poziom” szczegółowości w poleceniu? Czy istnieje jakiś „standardowy” punkt, który można wykorzystać jako punkt wyjścia - coś w rodzaju 3NF w bazach danych - i odbiegać tylko wtedy, gdy staranne profilowanie sugeruje potencjalnie znaczącą poprawę wydajności?
Czy może jest to jedna z tych rzeczy, które pomimo wielu mocnych opinii różnych ekspertów, są w rzeczywistości kwestią opinii?