Ruby na adrese Rails (Kolejnice, RoR) je dobře známý web aplikační rámec napsaný v jazyce Ruby programovací jazyk. Hospoda/podnik je zkrácený název návrhových vzorů softwaru, které se nazývají Publish-subscribe. Vysvětlím, jak by se komunikace mezi softwarovými komponentami v systému Rails dala řešit pomocí Pub/Sub.
Co je Pub/sub?
Pub/sub je návrhový vzor softwaru zajišťující komunikaci mezi službami. Služba
zahrnuje jednu ze dvou rolí: vydavatele (který produkuje) nebo příjemce (který spotřebovává). Co je
je určen jako událost, zpráva nebo oznámení. V
V kontextu tohoto článku se tyto pojmy používají zaměnitelně a označují totéž.
Služba, která vyrábí, neví, kdo spotřebovává. Služba, která spotřebovává, neví.
znát původ zprávy. Mohou zůstat navzájem neznámé. Tím se liší od
fronty zpráv, kde komponenta, která zprávu odesílá, často zná její cíl.
- tento styl zasílání zpráv umožňuje posílat zprávy odkudkoli. Tento mechanismus je základem
z Pub/sub a to znamená, že jsou oddělené.
Aby mohli vyjádřit své společné zájmy, musí mít společné porozumění. Proto,
Obě role mají implicitní mechanismus hole, kde producent zprávy a
spotřebitele zprávy splnit. Tento mechanismus se nazývá subjekt, odběr nebo téma. Je to
zodpovědný za kategorizaci zpráv subjektům, je to v podstatě bezstavový filtr zpráv.
Témata fungují jako vysílací stanice. Vydavatel vytváří zprávu pro téma,
odběratelé okamžitě obdrží zprávu z tématu. Vzhledem k oddělené
služeb je nejefektivnějším způsobem výměny zpráv jejich asynchronní zpracování.
Kolejnice bez Pub/Sub
Ve výchozím nastavení není v systému Rails žádná režie pro návrhové vzory softwaru pro předávání zpráv mezi komponentami. Vývojáři používají standardní objektově orientované programování (OOP) paradigma: předávání parametrů funkcím, dotazování se na třídy o hodnotách.
Pokud je žádost poměrně nekomplikovaná, může to stačit. Když se aplikace rozroste, například je třeba některé operace provádět asynchronně, pak je třeba použít tzv. projekt potřebuje abstrakci, která řeší, že data pracovní postup. Místo vynalézání kola mohou vývojáři implementovat Pub/sub aby tento nedostatek abstrakce vyplnil.
Výhody Pub/Sub s Rails
- Vyhněte se zpětným voláním aktivního záznamu.
- Přidáním asynchronního paralelního zpracování do systému se zvýší výkon, spolehlivost a efektivita. škálovatelnost jsou vylepšeny.
- Zprávy lze vysílat asynchronně do různých částí systému.
- Umožňuje asynchronní vysílání zpráv do různých částí systému.
- Oddělení - přidání nebo změna funkce nebude mít na nic vliv, protože Pub/Sub
umožňuje upravit způsob interakce. - Spotřebitel zpráv již nebude muset pravidelně kontrolovat aktualizace nebo nové zprávy.
informace. Snižuje zpoždění při doručování, které může být problematické zejména v systémech.
bez tolerance ke zpoždění. - Počet účastníků, které systém zvládne, není omezen, protože se může měnit,
kdykoli upgradovat, množit nebo zanikat.
Nevýhody Pub/Sub s Rails
- Hlavní nevýhodou systémů Pub/sub je jejich oddělení vydavatele od vydavatele.
předplatitel.
Rails Pub/Sub představit
Příklady zdrojových kódů v Rails byly napsány pomocí knihovny
Pub/Sub on Rails (v nomenklatuře Ruby se knihovna nazývá gem): Další podrobnosti najdete v readme gemu. Implementace se skládá z modulů:
- Doména,
- Událost,
- Obsluha události,
- Vydavatel akce,
- Předplatné.
Doména
Popisuje obchodní logiku, aby poskytla kontext pro Pub/Sub, a tím umožnila čistou práci s daty. kód.
modul Oznámení
extend PubSub::Domain
end
modul Zprávy
rozšířit PubSub::Domain
end
Událost
Jedná se o třídu, která popisuje, co se stalo. Název třídy deklarujte jako sebepopisný s tím, co se stalo, například: zrušeno, změněno, vytvořeno, zničeno, odesláno, aktualizováno. Názvy událostí mohou vypadat např: ProfitAndLossStatementCreatedEvent, což znamená, že byl vytvořen finanční výkaz.
třída Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
atribut :profit_and_loss_statement_id, Types::Strict::Integer
end
Vydavatel události
Třída schopná vysílat události. Příklad ukazuje vytvoření servisní zprávy. Po úspěšném vytvoření sestavy emituje událost vytvoření této sestavy.
třída 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
Obsluha události
Tato třída by měla být spuštěna v reakci na zpracování události.
modul Oznámení
třída 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
Předplatné
Události jsou spojeny se svými zpracovateli prostřednictvím odběrů.
oznámení:
reports__profit_and_loss_statement_created: async
Příklady použití:
- Funkce "Sledovat" v sociálních sítích,
- Internet věcí,
- Poštovní zásilky,
- Upozornění na vygenerované soubory.
Podobné vzory
- EventBus - komponenty mohou posílat události do sběrnice EventBus, aniž by věděly, kdo je vyzvedne nebo kolik respondentů je vyzvedne. reagovat,
- Pozorovatel - subjekt udržuje seznam závislých osob, tzv. pozorovatelů, a oznamuje jim, kdykoli se změní jejich stav,
- Sdružování - při dotazování se klienti pravidelně ptají systému, zda jsou k dispozici nové události nebo data.
Drahokamy
Souhrn
Pub/sub není v Ruby in Rails běžný přístup. Jak bylo představeno v článku, tento vzor může projektu přinést mnoho výhod - díky němu je kód čistý, služby jsou oddělené a snadno škálovatelné.
