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ą?
źródło
Odpowiedzi:
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ą.
źródło
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.
źródło
Poszukiwane słowa kluczowe to „choreografia serwisu internetowego”.
Sprawdź artykuł Wikipedii na ten temat.
źródło
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).
źródło
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.
źródło