2010-10-14 22 views
14

Właśnie skończyłem czytać artykuł o MSDN by John Evdemon. Ła interfejsy CRUD i nazywa to anty-wzorem.Dlaczego operacje CRUD są tak złe w projekcie SOA?

Chociaż zgadzam się, że mając nic stanowej jest trudne i bieżące i MoveNext są złe pomysły nie zgadzam się, że podobnie jak w CRUD Tworzenie Czytaj Update i Delete są złe. Jeśli mam usługę samochodową i chcę, aby klienci byli w stanie wykonać podstawowe czynności, np. Utwórz samochód, zdobądź szczegóły dotyczące samochodów, zaktualizuj dane samochodu lub usuń samochód, a następnie, w jaki sposób mają one być w stanie wykonywać te czynności bez operacji CRUD.

Albo co ja tu brakuje?

+1

Myślę, że będę musiał przeczytać artykuł, aby uzyskać odpowiedź: od kiedy traktuje się kursor (moveNext) jako operację CRUD? – mikemanne

Odpowiedz

16

interfejsów CRUD należy unikać w scenariuszu rozproszony system/SOA, ponieważ są one bardzo rozmowny. Ale nie musi to oznaczać. Kiedy masz jakieś akcje klienta, które wymagają więcej niż jednego połączenia z twoją usługą, wiesz, że powinieneś zrezygnować z podejścia CRUD i stworzyć nową usługę, która będzie agregować te połączenia w jedno połączenie. Projektując system rozproszony należy zawsze zmniejszyć liczbę połączeń do minimum, ponieważ połączenie sieciowe jest bardzo czasochłonne.

Edit:

Można myśleć o interfejsu CRUD jako o dostęp do danych narażonych w eksploatacji. Czasami naprawdę tego chcesz. Jednak w architekturze SOA i architekturze rozproszonej zazwyczaj ujawnia się funkcjonalność biznesowa, która już owija dostęp do danych i oferuje o wiele bardziej złożone operacje (które agregują wiele operacji dostępu do danych).

przykład:

CRUD interfejs logiczny x firm. Załóżmy, że pracujesz z Invoices. Każda faktura składa się z InvoiceHeader i jednego lub więcej InvoiceLine. W przypadku korzystania z interfejsu CRUD na fakturze należy najpierw zadzwonić CreateInvoiceHeader operację tworzenia InvoiceHeader a następnie kilka AddInvoiceLine operacje, aby dodać wszystkie InvoiceLines - czyli podejście niski poziom CRUD. Ale jeśli wdrożysz logikę biznesową po stronie usługi, zadzwonisz pod numer CreateInvoice i prześlesz kompleksowy wykres obiektów (nagłówek z wszystkimi liniami) do usługi, aby utworzyć i dodać to, co jest potrzebne. Metoda Create może również wykonywać inne operacje biznesowe, takie jak uruchamianie niektórych przepływów pracy itp. Jest to powszechne podejście SOA i systemu rozproszonego.

+0

To trochę mnie martwi. W jaki sposób pozwalamy klientom tworzyć nowe jednostki lub aktualizować ich dane, jeśli nie ujawniamy operacji CRUD. Na przykład Wystarczy prosta metoda Create, która akceptuje samochód. Jeśli wystąpi problem, odeślemy błąd. Jeśli nic nie otrzymasz, to się udało. Moim zdaniem nie może być mniej gadatliwy. Tak jak powiedziałem, być może brakuje mi czegoś wielkiego. – uriDium

+0

@uriDium: Dodałem przykład. –

+0

Och, racja. Dzięki za przykład. Tak więc CRUD w niemal "prawdziwej formie", w której wszystko ulega rozkładowi do postaci podstawowej. Stwórz Odczytaj Aktualizację lub Usuń jest złym pomysłem, ponieważ wymusza usługi rozmowne. Jeśli umieścisz je wszystkie w jednej metodzie serwisowej, takiej jak na przykład PlaceOrder (invoiceHeader, List ), będzie znacznie lepiej, ponieważ ograniczy się do czatu i zwiększy sens biznesowy. Ale oczywiście nadal istnieje przypadek, w którym potrzebujemy po prostu stworzyć pojedynczy obiekt. Czy mam pomysł? – uriDium

5

RESTfull web services które zostały ostatnio coraz popularniejsze okazują słupek źle Johnie Evdemon użytkownika.

+1

Nie sądzę, powiedział: "Programiści powinni skonsultować istniejące standardy branżowe przed opracowaniem własnych schematów." Cóż, HTTP z jego operacją CRUD jest standardem używanym z usługami sieciowymi RESTfull. IMHO jest tutaj historią, nie ma sensu definiować własnych operacji CRUD, ponieważ dla operacji CRUD jest już dość wymyślnych rozwiązań już wynalezionych. – Stephan

5

Myślę, że ma na celu zaprojektowany najgorszy możliwy interfejs tutaj i to nie jest tak naprawdę interfejsu CRUD.

<WebMethod()> _ 
Public Function MoveNext() As Boolean 
End Function 

<WebMethod()> _ 
Public Function Current() As Object 
End Function 

Te dwie metody nie są oczywiście bezpaństwowcami, ale nie są również potrzebne do prawdziwego interfejsu CRUD. Myślę, że jest to bardzo źle napisany przykład i nie jest tak naprawdę związany z operacjami CRUD.

Aktualizacja:

Znaleziono podobne pytanie o bardzo dobrych answer :)

0

Zaakceptowanych odpowiedź jest błędna. I pomimo faktu, że John używa CRUD jako przykładu wzorcowego przy użyciu CRUD, nie są złe dla SOA.Oto problem z architekturą SOA opisaną przez Johna: zachęca ona do zwiększenia złożoności na poziomie usługi, co w efekcie prowadzi do zmniejszenia obsługi wielu przypadków użycia. Jednym z głównych powodów, dla których budujemy interfejsy API, jest zapewnienie dostępu do wielu aplikacji, w tym miejscu główny zwrot z inwestycji ma na celu budowanie interfejsów API.

Załóżmy na przykład, że mamy interfejs API blogu. Powiedzmy, że dajemy użytkownikom możliwość pisania postów, dodawania zdjęć i umieszczania komentarzy na jednym ekranie naszej zewnętrznej aplikacji. W wizji Jana SOA będzie pewnie zalecamy budujemy naszą API do korzystania z jednego połączenia, aby zrobić wszystkie te rzeczy, więc byłoby mniej rozmowny i bla bla bla ... tak:

{ 
    "post_title": "New Post", 
    "post_content": "Some Stuff....", 
    "comments": [{ 
    "comment": "This is right on!", 
    "userId": 101 
    }, { 
    "comment": "I agree.", 
    "userId": 105 
    }], 
    "images": [{ 
    "imgURL": "http://some.img.com/1" 
    }, { 
    "imgURL": "http://some.img.com/2" 
    }] 
} 

Teraz są oczywiście trzy różne obiekty danych, które muszą być oddzielnie przechowywane tutaj: post, komentarze i obrazy. Z perspektywy magazynu danych wpis trafia do tabeli POSTS komentarzy do tabeli KOMENTARZE i obrazów do tabeli IMAGES. Jeśli więc budujemy naszą usługę zgodnie z lokatorami SOA, tak jak je opisuje John, to wykonujemy nasze jedno połączenie z naszym obiektem i to właśnie usługi, które usiłują stworzyć stanowisko, które na przykład działa dobrze, próbuje stworzyć komentarze, które działają dobrze, ale kiedy dojdziemy do obrazu, usługa zdaje sobie sprawę, że jeden z adresów URL obrazu jest wadliwy, nie udaje się. Więc nasza usługa zwraca błąd? Mimo że 3 inne części są teraz pomyślnie przechowywane w naszym magazynie danych? Czy wracamy i cofamy wszystkie części, które są skuteczne? Co się stanie, jeśli magazyn danych już zatwierdził zmiany i nie możemy go wycofać?

Połączyliśmy to z faktem, że gdybyśmy zrobili to "bardziej rozmowni" i przesłaliśmy je indywidualnie, możemy teraz ponownie korzystać z tych usług w innych aplikacjach bez konieczności ponownego pisania jakiejkolwiek części usługi.

Zła część skonsolidowanych usług polega na tym, że sprzedaje się pomysł, że usługa powinna nigdy nie zawieść ... co jest śmieszne. Zawsze znajdzie się przypadek, w którym coś się nie powiedzie i konsolidując wszystko w jedną usługę, zwiększysz swoją złożoność i zwiększysz swoją zdolność do porażki.

Porównałbym tę wersję SOA do niedociągnięć, które już udało nam się zrealizować w budowaniu obiektów Boga w programowaniu obiektowym. https://en.wikipedia.org/wiki/God_object

Znamy lepiej niż to, więc dlaczego je odświeżamy? Skonsolidowane lub Boskie usługi są złym pomysłem, podobnie jak obiekty Boga. Mówię, buduj swoje usługi, aby zrobić jedną rzecz i rób to dobrze dla tylu zastosowań, ile możesz, a twoja usługa będzie dobra.