Ruby na Szyny (Rails, RoR) jest dobrze znanym sieć framework aplikacji napisany w Ruby język programowania. Pub/Sub to krótka nazwa wzorców projektowych oprogramowania zwanych Publikuj-subskrybuj. Wyjaśnię, w jaki sposób komunikacja między komponentami oprogramowania w Railsach może być obsługiwana przez Pub/Sub.
Co to jest Pub/Sub?
Pub/sub to wzorzec projektowy oprogramowania zapewniający komunikację między usługami. Usługa
wiąże się z jedną z dwóch ról: wydawcy (który produkuje) lub odbiorcy (który konsumuje). Co to jest
jest określana jako zdarzenie, komunikat lub powiadomienie. W
W kontekście tego artykułu są one używane zamiennie w odniesieniu do tej samej rzeczy.
Usługa, która produkuje, nie wie, kto konsumuje. Usługa, która konsumuje, nie
znają pochodzenie wiadomości. Mogą pozostać dla siebie nieznani. Różni się to od
kolejki wiadomości, w których komponent wysyłający wiadomość często zna jej miejsce docelowe
- Ten styl przesyłania wiadomości pozwala na wysyłanie ich w dowolne miejsce. Mechanizm ten jest podstawą
z Pub/sub i oznacza to, że są one od siebie oddzielone.
Aby wyrazić swoje wzajemne interesy, muszą mieć wspólne zrozumienie. Dlatego,
Obie role mają ukryty mechanizm "kija", w którym producent wiadomości i użytkownik
konsument wiadomości spotyka się. Mechanizm ten nazywany jest tematem, subskrypcją lub tematem. Jest to
odpowiedzialny za kategoryzowanie wiadomości do tematów, jest zasadniczo bezstanowym filtrem wiadomości.
Tematy działają jak stacje nadawcze. Wydawca wysyła wiadomość do tematu,
subskrybenci natychmiast otrzymują wiadomość z tematu. Ze względu na rozłączność
usług, najbardziej efektywnym sposobem wymiany wiadomości jest ich asynchroniczna obsługa.
Railsy bez Pub/Sub
Domyślnie Railsy nie mają narzutu na wzorce projektowe oprogramowania do przekazywania komunikatów między komponentami. Programiści używają standardowych programowanie obiektowe (OOP): przekazywanie parametrów do funkcji, pytanie klas o wartości.
Gdy aplikacja jest raczej nieskomplikowana, może to wystarczyć. Gdy aplikacja się rozrasta, na przykład niektóre operacje muszą być wykonywane asynchronicznie, wówczas należy użyć funkcji projekt potrzebuje abstrakcji, która to rozwiązuje dane przepływ pracy. Zamiast wymyślać koło na nowo, deweloperzy mogą zaimplementować Pub/sub aby wypełnić ten brak abstrakcji.
Zalety Pub/Sub z Rails
- Unikaj wywołań zwrotnych Active Record.
- Dodanie asynchronicznego przetwarzania równoległego do systemu zwiększa jego wydajność, niezawodność i bezpieczeństwo. skalowalność zostały ulepszone.
- Wiadomości mogą być nadawane asynchronicznie do różnych części systemu.
- Umożliwia asynchroniczną emisję wiadomości do różnych części systemu.
- Oddzielenie - dodanie lub zmiana funkcjonalności nie wpłynie na nic, ponieważ Pub/Sub
pozwala modyfikować sposób interakcji wszystkich elementów. - Odbiorca wiadomości nie będzie już musiał okresowo sprawdzać dostępności aktualizacji lub nowych wiadomości.
informacje. Zmniejsza to opóźnienia w dostarczaniu, które mogą być szczególnie problematyczne w systemach
bez tolerancji dla opóźnień. - Nie ma limitu liczby subskrybentów, których system może obsłużyć, ponieważ może się on zmieniać,
aktualizować, mnożyć lub znikać w dowolnym momencie.
Wady Pub/Sub z Railsami
- Główną wadą systemów Pub/Sub jest ich rozłączność pomiędzy wydawcą i subskrybentem.
abonent.
Wprowadzenie Rails Pub/Sub
Przykłady źródeł w Railsach zostały napisane przy użyciu biblioteki
Pub/Sub on Rails (w nomenklaturze Rubiego biblioteka nazywana jest gemem): Więcej szczegółów znajdziesz w readme gema. Implementacja składa się z modułów:
- Domena,
- Wydarzenie,
- Obsługa zdarzeń,
- Wydawca wydarzenia,
- Subskrypcja.
Domena
Opisuje logikę biznesową w celu zapewnienia kontekstu dla Pub/Sub, a tym samym uczynienia go czystym. kod.
moduł Powiadomienia
extend PubSub::Domain
koniec
moduł Raporty
extend PubSub::Domain
koniec
Wydarzenie
Jest to klasa, która opisuje, co się stało. Zadeklaruj nazwę klasy jako samoopisującą się z tym, co się stało, na przykład: anulowane, zmienione, utworzone, zniszczone, wysłane, zaktualizowane. Nazwy zdarzeń mogą wyglądać następująco: ProfitAndLossStatementCreatedEvent, co oznacza, że zostało utworzone sprawozdanie finansowe.
class Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
atrybut :profit_and_loss_statement_id, Types::Strict::Integer
end
Wydawca wydarzenia
Klasa zdolna do emitowania zdarzeń. Przykład pokazuje tworzenie raportu usługi. Po pomyślnym utworzeniu raportu emitowane jest zdarzenie utworzenia tego raportu.
class Reports::ProfitAndLossStatementService
include PubSub::Emit
def execute
emit(:report_profit_and_loss_statement_created, profit_and_loss_statement_id: id) if result.ok?
end
end
Obsługa zdarzeń
Klasa ta powinna być wykonywana w odpowiedzi na obsługę zdarzenia.
moduł Powiadomienia
class ReportsProfitAndLossStatementCreatedHandler < PubSub::DomainEventHandler
def call
ReportMailer.profit_and_loss_statement(profit_and_loss_statement).deliver_now
end
private
def profit_and_loss_statement
ProfitAndLossStatement.find(event_data.profit_and_loss_statement_id)
end
end
end
Subskrypcja
Zdarzenia są powiązane ze swoimi programami obsługi poprzez subskrypcje.
powiadomienia:
reports__profit_and_loss_statement_created: async
Przykładowe przypadki użycia:
- Funkcja "Śledź" w sieciach społecznościowych,
- Internet rzeczy,
- Mailing,
- Powiadomienie o wygenerowanych plikach.
Podobne wzorce
- EventBus - Komponenty mogą wysyłać zdarzenia do EventBus, nie wiedząc, kto je odbierze ani ilu respondentów je odbierze. reagować,
- Obserwator - podmiot utrzymuje listę podmiotów zależnych, zwanych obserwatorami, i powiadamia ich za każdym razem, gdy zmienia się ich stan,
- Łączenie - Podczas odpytywania klienci okresowo pytają system, czy są jakieś nowe zdarzenia lub dane.
Klejnoty
Podsumowanie
Pub/sub nie jest powszechnym podejściem w Ruby in Rails. Jak przedstawiono w artykule, wzorzec ten może przynieść wiele korzyści dla projektu - może uczynić kod czystym, oddzielić usługi i uczynić je łatwo skalowalnymi.
