Jak skutecznie korzystać z usług sieciowych w środowisku korporacyjnym, jeśli nie można korzystać z transakcji?


14

Miejsce, w którym pracuję, stara się ustalić pewne podstawowe zasady, a debata, którą teraz toczymy, dotyczy bibliotek lokalnych a usług sieciowych do ponownego wykorzystania kodu. Usługi sieciowe wydają się być popularnym wyborem w większości firm i właśnie do tego dąży większość programistów.

Po prostu nie widzę, jak możesz skutecznie korzystać z usług sieciowych do jakiejkolwiek poważnej pracy. Jak mogę bezpiecznie wykonywać wiele zgłoszeń serwisowych, jeśli nie mogę skorzystać z transakcji?

Powiedzmy, że mam zadanie crona, które pobiera klientów z naszej bazy danych, którzy spełniają określony warunek, o którym muszą zostać powiadomieni. Otrzymują oni faks, e-mail i tworzony jest bilet umożliwiający wewnętrzne śledzenie problemu. To 3 różne wezwania serwisowe, które miałyby miejsce dla każdego klienta w pętli for.

Jeśli w dowolnym miejscu występuje błąd, możliwe jest, że na przykład faks i wiadomość e-mail są wysyłane do klienta, ale bilet nie jest tworzony. Albo, co gorsza, to zadanie crona może zawierać błąd, który powoduje, że kończy się niepowodzeniem w tym samym momencie za każdym razem i wielokrotnie wysyła e-maile do tego samego klienta. Gdyby wszystkie biblioteki były lokalne, wszystko mogłoby być po prostu zawinięte w transakcję i nic z tego by się nie wydarzyło. Ale w tym przykładzie korzystamy z usług internetowych.

Zauważ, że metody e-mail i faks faktycznie wstawiają dane do tabel kolejek zabezpieczonych bazą danych, które z kolei są obsługiwane przez osobny proces zadania cron. Tak więc połączenia z metodami „wyślij e-mail” i „wyślij faks” mogą być w razie potrzeby przerwane bez skutków ubocznych.

Opcją jest umieszczenie całego fragmentu kodu w samej usłudze sieciowej, aby sama usługa wywoływała metody tworzenia wiadomości e-mail, faksu i biletów w transakcji. Ale potem tworzymy metodę usługi internetowej tylko na potrzeby transakcji; nie ma żadnego ważnego powodu, aby kiedykolwiek musielibyśmy wywoływać tę metodę z dowolnego miejsca, z wyjątkiem skryptu z jednym cronem.

Jak ogólnie poradziłbyś sobie z tą metodą?


Aby podać pełną odpowiedź, potrzebuję więcej informacji. Przechodząc do architektury opartej na usługach, należy wziąć pod uwagę wiele rzeczy. Na przykład, czy masz środowisko heterogeniczne (różne języki i platformy) lub homogeniczne (jeden język i platforma). Czy masz zainstalowany system magistrali usług? Jeśli nie, czy zamierzasz je wdrożyć? Jak planujesz uzyskać dostęp do swoich usług (intranet z pojedynczą lokalizacją, WAN z wieloma lokalizacjami, rozproszony klient uderzający w interfejs usługi publicznej). Istnieje wiele zmiennych, które wpływają na „optymalne” rozwiązanie.
Michael Brown

@MikeBrown: wszystkie usługi byłyby napisane w jednym języku, ale byłyby używane przez wiele platform. Nie mam pojęcia o wdrożeniu EBS, nie rozpoczęliśmy nawet żadnej pracy usług, więc wszystko jest możliwe. Usługi byłyby głównie wykorzystywane wewnętrznie przez naszą sieć lokalną, ale niektóre z nich musiałyby być dostępne publicznie dla aplikacji mobilnych.
ryeguy

„Gdyby wszystkie biblioteki były lokalne, wszystko można by było zawinąć w transakcję i nic z tego by się nie wydarzyło”. Fałszywy. Błąd może wystąpić po wysłaniu wiadomości e-mail, ale przed ostateczną aktualizacją bazy danych. Transakcja nie uniemożliwia z mocą wsteczną wiadomości e-mail ani faksu.
S.Lott

@ S.Lott: Tak, ponieważ połączenia e-mailowe i faksowe w rzeczywistości po prostu umieszczają je w kolejce, które są dostarczane w inny sposób. Jeśli transakcja, którą opisałem powyżej, miałaby miejsce, wstawianie kolejki byłoby przerywane.
ryeguy

1
@ryeguy: Zaktualizuj pytanie. Proszę nie dodawać komentarzy do pytania. To ważna część twojej architektury. Proszę ujawnić to w pytaniu.
S.Lott

Odpowiedzi:


5

To, co opisujesz, jest w rzeczywistości transakcją rozproszoną implementującą zatwierdzanie dwufazowe . Niektóre platformy do obsługi wiadomości korporacyjnych obsługują tego rodzaju menedżerów transakcji, ale konkretne produkty zależą od platformy / języka. Nie mam konkretnych doświadczeń z takimi narzędziami, ale mam nadzieję, że te wskazówki pomogą.


3

Interesujące jest to, że biorąc udział w tym konkretnym pytaniu i odpowiedziach, istnieje podobny wątek na temat usług obsługujących wiele platform na liście mailingowej DDD / CQRS, w której uczestniczę. Mogę powtórzyć niektóre z moich porad tutaj.

Jedną z opcji obsługi transakcji w heterogenicznym środowisku jest użycie mechanizmu transportu, który obsługuje transakcje i jest obsługiwany na wszystkich platformach, z których będzie on używany. Zaawansowane Message Queue Protocol (AMQP) wykonuje transakcje wspierające i nie jest native API dla prawie każdego języka, który jest powszechnie używany do dziś. RabbitMQ to serwer, który implementuje AMQP i został sprawdzony w branży jako solidne rozwiązanie.

Wykorzystanie systemu opartego na RabbitMQ stawia cię na drodze do posiadania pełnego ESB, jeśli potrzebujesz do niego wyrosnąć. Publikujesz wiadomości na kanale i subskrybujesz kolejkę. Tam, gdzie robi się to naprawdę potężne, jest to, że między kanałem a kolejką możesz wykonać wiele ciekawych rzeczy. Kanał może zasilać wiele kolejek (pub / sub), kolejka może być zasilana przez wiele kanałów, możesz kierować wiadomości do różnych kolejek na podstawie zawartości itp. Itp.

Właśnie czytałem o alternatywach dla transakcji (które przychodzą z narzutem i zamieniają operację asynchroniczną w operację blokującą). RabbitMQ obsługuje tak zwane potwierdzenie wydawcy . Zasadniczo umożliwia zarejestrowanie wywołania zwrotnego dla opublikowanej metody obsługi nieudanej transakcji. W twoim przypadku może to cofnąć żądania e-mail / faksu i usunąć bilet.

Oczywiście królicza nora (przepraszam za kalambur) idzie jeszcze głębiej. Za pomocą Rabbit można wykonywać złożone aranżacje zarówno z wewnętrznymi, jak i zewnętrznymi usługami internetowymi.

Dla twoich publicznych serwisów staje się to bardzo proste. Twoja usługa (SOAP, REST lub JSON) po prostu publikuje komunikat w odpowiedniej kolejce usług i pozwala stamtąd zająć się tym systemem wewnętrznym.

Dostępna jest także funkcja umożliwiająca utworzenie komunikatu żądania / odpowiedzi dla scenariuszy, w których informacje oczekują szybkiego powrotu.



1

Sposób, w jaki poradziłem sobie z tym w aplikacji usług, którą napisałem, polegał na utworzeniu opakowania do obsługi niezbędnych transakcji. W moim przypadku żądanie użytkownika złożone przez witrynę internetową, aplikację komputerową lub usługę Windows wymagało wysłania zapytania do usługi internetowej i, w oparciu o wynik i opcje użytkownika, musiało zaktualizować lokalną bazę danych i, opcjonalnie, zdalną za pośrednictwem usługi internetowej. Następnie musiał wygenerować raport, który należy natychmiast zwrócić, przesłać e-mailem i / lub faksem. Miałem kontrolę nad lokalną bazą danych, generowaniem wiadomości e-mail i raportów, ale nie w usługach internetowych ani na serwerze faksu.

Utworzenie opakowania umożliwiło lepszą kontrolę transakcji i obsługę błędów. Umożliwiło to także lepsze bezpieczeństwo poprzez kontrolowanie dostępu do wewnętrznych usług sieciowych ze źródeł zewnętrznych. Ogólnie rzecz biorąc, uważam potrzebę transakcji i zarządzania usługą za ważny powód do stworzenia odpowiedniego opakowania dla pojedynczego rozwiązania, o ile kod jest ponownie używany poprawnie (bez kodowania cut-n-paste).


1

Po prostu nie widzę, jak możesz skutecznie korzystać z usług sieciowych do jakiejkolwiek poważnej pracy. Jak mogę bezpiecznie wykonywać wiele zgłoszeń serwisowych, jeśli nie mogę skorzystać z transakcji?

Nie możesz

Pytanie, które powinieneś zadać, brzmi: w jaki sposób realizować transakcje za pomocą X usługi sieciowej? W tej chwili zakładasz, że to niemożliwe.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.