(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, Autor na The Codest - Strona 7 z 9

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

Wady Pub/Sub z Railsami

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:

  1. Domena,
  2. Wydarzenie,
  3. Obsługa zdarzeń,
  4. Wydawca wydarzenia,
  5. 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:

Podobne wzorce

  1. EventBus - Komponenty mogą wysyłać zdarzenia do EventBus, nie wiedząc, kto je odbierze ani ilu respondentów je odbierze. reagować,
  2. Obserwator - podmiot utrzymuje listę podmiotów zależnych, zwanych obserwatorami, i powiadamia ich za każdym razem, gdy zmienia się ich stan,
  3. Łą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.

baner współpracy
pl_PLPolish