2010-03-23 11 views
8

Robiłem wiele badań ostatnio o SOA i ESB użytkownika itpJak wdrożyć luźne powiązania z architektury SOA

pracuję na przeprojektowanie niektórych starszych systemów teraz w pracy i chciałby go zbudować z większą ilością architektury SOA niż obecnie. Korzystamy z tych usług w około 5 naszych witrynach internetowych i jednym z największych problemów, z jakimi mamy do czynienia teraz, jest to, że prawie cały czas, kiedy wprowadzamy poprawki lub aktualizacje, musimy ponownie wdrożyć nasze 5 stron internetowych, które mogą być dość czasochłonny proces.

Moim celem jest stworzenie luźno powiązanych interfejsów między usługami, aby można było wprowadzać zmiany bez konieczności ponownego wdrażania wszystkich zależnych usług i stron internetowych.

Potrzebuję możliwości rozszerzenia istniejącego interfejsu usługi bez przerywania lub aktualizowania żadnej z jego zależności. Czy któryś z was już wcześniej napotkał ten problem? Jak to rozwiązałeś?

+1

Witaj Brian, +1 dobre pytanie. Chciałbym się też uczyć. Czy mógłbyś zaktualizować to pytanie za pomocą zasobów internetowych, które uznałeś za przydatne do tego. –

Odpowiedz

3

Sugeruję, aby spojrzeć na inny styl usług niż może robiłeś do tej pory. Rozważ usługi, które współpracują ze sobą przy użyciu zdarzeń, a nie żądania/odpowiedzi. Używam tego podejścia od wielu lat z klientami w różnych branżach z dużym sukcesem. W ciągu ostatnich 4 lat napisałem o tych tematach całkiem sporo. Oto jedno miejsce, gdzie można zacząć:

http://www.udidahan.com/2006/08/28/podcast-business-and-autonomous-components-in-soa/

nadzieję, że pomoże.

+0

Nigdy o tym nie myślałem. To zabawne, ponieważ pobrałem kopię twojego open source ESB nServiceBus około tydzień temu. Tylko przeglądałem kod przez około godzinę i założyłem, że to, co robisz, nie rozwiąże mojego problemu. Widziałem grupę klas, które były przekazywane między wydawcami/subskrybentami i spowodowało, że sądzę, że wszelkie zmiany spowodują odbudowanie zależności. Po przeczytaniu tego, co napisałeś, wszystko ma sens. Przekazują pojedyncze wiadomości za pośrednictwem zdarzeń, a nie całego interfejsu usługi. Mogę dodawać nowe wiadomości bez łamania istniejącego kodu. –

0

To, o co prosisz, nie jest łatwym tematem. Istnieje wiele sposobów, dzięki którym architektura zorientowana na usługi może być luźno powiązana.

Proponuję sprawdzić Thomasa Erla SOA book series. Wyjaśnia wszystko dość wyraźnie i dogłębnie.

+0

Doceniam twoją odpowiedź. Wiem, że nie jest to łatwy temat. Badałem to przez ostatni miesiąc. Widziałem kilka prezentacji na InfoQ, które również wyglądały na kilka książek w Internecie, więc dobrze rozumiem, jak powinien wyglądać końcowy produkt, ale mam problemy z dostaniem się z punktu A do punktu B. Przyjrzę się w książce, którą zasugerowałeś, być może pomoże to trochę wyjaśnić. –

+0

Justin, czy przypadkiem nie zdajesz sobie sprawy z jakichkolwiek zasobów internetowych rzucających trochę światła na to pytanie, które jest uciążliwe. –

2

Istnieje kilka metod, które można zastosować. Nasza architektura SOA obejmuje wiadomości XML wysyłane do iz usług. Jednym ze sposobów osiągnięcia tego, co opisujesz, jest unikanie użycia biblioteki powiązania danych w naszym schemacie XML i użycie generycznego parsera XML, aby uzyskać tylko węzły danych, które chcesz ignorować, które nie są zainteresowane. W ten sposób usługa może dodać dodatkowe nowe węzły do ​​wiadomości, nie naruszając nikogo aktualnie używającego tego. Zwykle robimy to tylko wtedy, gdy potrzebujemy jednej lub dwóch informacji z większej struktury schematu.

Alternatywnie, innym (preferowanym) rozwiązaniem, którego używamy, jest wersjonowanie. Wersja usługi jest zgodna z określonym schematem/interfejsem. Kiedy zmienia się schemat (np. Interfejs jest rozszerzany lub modyfikowany), tworzymy nową wersję usługi. W każdej chwili możemy mieć 2 lub 3 wersje w dowolnym momencie. Z czasem wycofujemy, a następnie usuwamy starsze wersje, a ostatecznie przenosimy zależny kod na nowsze wersje. W ten sposób osoby zależne od usługi mogą nadal korzystać z istniejącej wersji usługi, podczas gdy niektóre szczególne zależności mogą "zaktualizować" do nowej wersji. Które wersje usługi są wywoływane, są zdefiniowane w pliku konfiguracyjnym zależnego kodu. Zauważ, że to nie tylko schemat, który jest wersjonowany, ale także cały kod implementacji.

Mam nadzieję, że to pomoże.

+0

Tak to wyzywająco jest jednym z rozwiązań, które też by działało. Jednak myślę, że największym problemem, jaki miałem na głowie, było to, że kiedy myślałem o usłudze, myślałem, że wymaga ona umowy serwisowej podobnej do tej używanej w usługach WCF. Po rozbiciu i przekształceniu każdej funkcji API w jej własną wiadomość rozwiązanie tego problemu staje się znacznie łatwiejsze. Ponieważ możesz dodać dowolną liczbę wiadomości do usługi, możesz teraz dodać do niej dodatkowe wersje i nowe wiadomości. –

0

Istnieje kilka typowych warunków, aby uzyskać luźne połączenie usług.

  1. Zastosowanie doc/dosłowny styl usług internetowych, że w danych (format drutu) zamiast RPC uniknąć dane schematu opartego wiążące.

  2. będzie ściśle przestrzegać umowy, gdy są wysyłane dane, ale zachować kilka założeń przetwarzania danych przychodzących, XPath jest dobrym narzędziem, które (luzem w ścisła out)

  3. Zastosowanie ESB i uniknąć każdy bezpośrednio wskazują na punktowa komunikacja między usługami.

+0

Tak, zdecydowałem się użyć ESB NServiceBus. Wygląda na to, że rozwiązałem większość moich problemów. –

0

Tutaj jest szorstka kontrolną do oceny, czy SOA realizuje Loose sprzęgu:

  • Położenie w nazwie systemu (jego adres fizyczny): Czy aplikacja wykorzystywać bezpośrednie adresy URL dla dostępu systemów lub czy aplikacja jest oddzielona od siebie za pomocą warstwy abstrakcji, która jest odpowiedzialna za utrzymywanie połączeń między systemami? Rejestr usług i paradygmat grupy usług używany w SAP NetWeaver CE są dobrymi przykładami tego, jak taka abstrakcja mogłaby wyglądać. Używanie korporacyjnej magistrali serwisowej (ESB) to kolejny przykład. Chodzi o to, że aplikacja nie powinna zakodować twardego adresu fizycznego w nazwie systemu nazwanego , aby naprawdę zostać uznanym za luźno sprzężony.

  • Liczba odbiorników: Czy aplikacja określa, które systemy są odbiorcami połączenia serwisowego? Luźno połączony kompozytor nie będzie określał konkretnych systemów, ale pozostawi dostarczanie wiadomości do warstwy implementacji umowy serwisowej. Ścisła aplikacja połączona będzie jawnie wywoływać systemy odbiorcze w porządku ; luźno powiązana aplikacja po prostu wykonuje połączenia z interfejsem usługi i umożliwia realizację umowy o usługę , aby zadbać o szczegóły dostarczania wiadomości do właściwych systemów .

  • Dostępność systemów: Czy aplikacja wymaga, aby wszystkie systemy, które łączą się być uruchomiony przez cały czas? Oczywiście, jest to bardzo trudne wymaganie, szczególnie jeśli chcesz chcesz połączyć się z systemami zewnętrznymi, które nie są pod Twoją kontrolą. Jeśli odpowiedź brzmi, że wszystkie systemy muszą działać cały czas, aplikacja jest ściśle powiązana w tym zakresie.

  • Format danych: Czy wniosek ponowne formatów danych dostarczonych przez systemów backend lub używasz kanoniczny system typu dane , która jest niezależna od systemów typu używanego w tzw aplikacjami? Jeśli używasz ponownie typów danych systemów zaplecza , prawdopodobnie będziesz musiał zmagać się z konwersją typów danych w aplikacji, a to nie jest podejście bardzo luźno powiązane.

  • Czas reakcji: Czy aplikacja wymaga zwane systemy reagowania w określonym terminie, czy jest to dopuszczalne do stosowania na otrzymać odpowiedź minut, godzin lub nawet dni później?