Dlaczego operacje CRUD są tak złe w projekcie SOA?

Właśnie skończyłem czytać artykuł o MSDN autorstwa Johna Evdemona . Bije interfejsy CRUD i nazywa to anty-wzorcem.

O ile zgadzam się, że posiadanie czegokolwiek stateful jest trudne, a Current i MoveNext to złe pomysły to nie zgadzam się, że CRUD jak w Create Read Update I Delete są złe. Jeśli mam usługę samochodową i chcę, aby klienci mogli zrobić podstawy, jak stworzyć samochód, uzyskać szczegóły samochodów, zaktualizować szczegóły samochodów lub usunąć samochód, to jak mają one na myśli aby móc robić te rzeczy bez operacji CRUD.

Albo co mi tu umyka?

Author: Stephan, 2010-10-14

4 answers

Interfejsy CRUD powinny być unikane w scenariuszu rozproszonego systemu / SOA, ponieważ są bardzo gadatliwe. Ale powinienem nie znaczy, że muszę. Gdy masz pewne działania Klienta, które wymagają więcej niż jednego połączenia do usługi, wiesz, że powinieneś zrezygnować z podejścia CRUD i utworzyć nową operację usługi, która zwiększy te połączenia w jedno połączenie. Projektując system rozproszony należy zawsze ograniczyć liczbę połączeń do minimum, ponieważ połączenia sieciowe są bardzo czasochłonne / align = "left" /

Edit:

Możesz myśleć o interfejsie CRUD jako o dostępie do danych ujawnionych w usłudze. Czasami naprawdę tego chcesz. Jednak w architekturze SOA i rozproszonych systemów zazwyczaj ujawnia się funkcjonalność biznesową, która już owija dostęp do danych i oferuje znacznie bardziej złożone operacje (które wiążą się z wieloma operacjami dostępu do danych).

Przykład:

Interfejs logiki biznesowej CRUD X. Załóżmy, że pracujesz z Invoices. Każda faktura składa się z InvoiceHeader i jednego lub więcej InvoiceLine. Jeśli używasz interfejsu CRUD do faktury, najpierw wywołasz operację CreateInvoiceHeader, aby utworzyć InvoiceHeader, a następnie kilka operacji AddInvoiceLine, aby dodać wszystkie InvoiceLines - to jest podejście CRUD niskiego poziomu. Ale jeśli zaimplementujesz logikę biznesową po stronie usługi, wywołasz pojedynczy CreateInvoice i przekażesz złożony Wykres obiektu (nagłówek ze 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 workflow itp. Jest to wspólne podejście SOA i rozproszonego systemu.

 16
Author: Ladislav Mrnka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 01:47:26

RESTfull Web services , które ostatnio zyskują na popularności, okazuje się błędnym wpisem Pana Johna Evdemona.

 5
Author: Boris Pavlović,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-14 09:10:14

Myślę, że celowo zaprojektował najgorszy możliwy interfejs tutaj i tak naprawdę nie jest to interfejs 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ństwowe, ale nie są też potrzebne do prawdziwego interfejsu CRUD. Myślę, że to tylko bardzo słabo napisany przykład i nie jest tak naprawdę związany z operacjami CRUD.

Update:

Znalazłem podobne pytanie z bardzo dobrą odpowiedź :)

 5
Author: willcodejavaforfood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:49

Przyjęta odpowiedź jest nieprawidłowa. I pomimo faktu, że John używa CRUD jako anty-wzór przykład za pomocą CRUD for nie są złe dla SOA. Oto problem z SOA, jak opisuje John: zachęca do zwiększenia złożoności na poziomie usług, co ostatecznie prowadzi do zmniejszenia wsparcia dla wielu przypadków użycia. Jednym z głównych powodów, dla których tworzymy interfejsy API, jest zapewnienie dostępu do wielu aplikacji.

Na przykład powiedzmy, że mamy bloga API. Powiedzmy, że dajemy użytkownikom możliwość pisania postów, dodawania zdjęć i umieszczania komentarzy na jednym ekranie naszej zewnętrznej aplikacji. W wizji Johna SOA prawdopodobnie zaleciłby, abyśmy zbudowali nasze API, aby używać jednego wywołania do robienia wszystkich tych rzeczy, więc byłoby to mniej gadatliwe i bla bla bla... więc:

{
  "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 post przechodzi do tabeli posty komentarze do tabeli komentarze i obrazy do tabeli obrazy. Więc jeśli budujemy naszą usługę po najemców SOA, jak opisuje je John, wykonujemy nasze jedno połączenie z naszym obiektem i idzie do usług, które próbują stworzyć post, który, na przykład, działa dobrze, to próbuje stworzyć komentarze, które działają dobrze, ale kiedy dojdziemy do obrazów usługa zdaje sobie sprawę, że jeden z adresów URL obrazu jest uszkodzony są nie. Więc nasze serwis zwraca awarię? Nawet jeśli 3 Inne części są teraz z powodzeniem przechowywane w naszym magazynie danych? Czy cofamy i cofamy wszystkie części, które wykonują się pomyślnie? Co jeśli magazyn danych już wprowadził zmiany, a my nie możemy ich cofnąć?

Połącz to z faktem, że gdybyśmy uczynili go "bardziej rozmownym" i złożyli je indywidualnie, moglibyśmy teraz ponownie korzystać z tych usług w innych aplikacjach bez konieczności ponownego pisania jakiejkolwiek części usługi.

The bad part of the usługi skonsolidowane polega na tym, że jesteś sprzedawany z myślą, że usługa nigdy nie powinna zawieść... co jest śmieszne. Zawsze będzie przypadek krawędzi, gdzie coś się nie powiedzie i konsolidując wszystko w jednej usłudze zwiększyłeś swoją złożoność i faktycznie zwiększyłeś swoją zdolność do niepowodzenia.

Porównałbym tę wersję SOA do niedociągnięć, które już zdaliśmy sobie sprawę w budowaniu obiektów Boga w programowaniu obiektowym. https://en.wikipedia.org/wiki/God_object

Wiemy lepiej niż to, więc dlaczego go ponownie? Consolidated lub God Services są złym pomysłem, tak jak Bóg obiektów. Mówię, zbuduj swoje usługi, aby zrobić jedną rzecz i zrobić to dobrze dla tak wielu przypadków użycia, jak możesz, a Twoja usługa będzie dobra.

 0
Author: Cleanshooter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-14 16:52:26