Ruby svetainėje Bėgiai (Bėgiai, RoR) yra gerai žinomas žiniatinklio svetainė taikomoji sistema, parašyta Ruby programavimo kalba. Viešbutis / restoranas yra trumpas programinės įrangos projektavimo šablonų, vadinamų Leidinio prenumerata. Paaiškinsiu, kaip "Rails" programinės įrangos komponentų bendravimas gali būti tvarkomas naudojant "Pub/Sub".
Kas yra "Pub/sub"?
Viešbutis / pavaldžioji įstaiga yra programinės įrangos projektavimo modelis, užtikrinantis ryšį tarp paslaugų. Paslauga
atlieka vieną iš dviejų vaidmenų: leidėjo (kuris gamina) arba gavėjo (kuris vartoja). Kas yra
gaminamas ir vartojamas kaip įvykis, pranešimas arba pranešimas. Į
šiame straipsnyje jie vartojami pakaitomis tam pačiam dalykui įvardyti.
Paslauga, kuri gamina, nežino, kas vartoja. Paslauga, kuri vartoja, nežino.
sužinoti pranešimo kilmę. Jie gali likti nežinomi vienas kitam. Tai skiriasi nuo
pranešimų eilės, kai pranešimą siunčiantis komponentas dažnai žino jo paskirties vietą.
- šis žinučių siuntimo stilius leidžia siųsti žinutes bet kur. Šis mechanizmas yra pagrindinis
iš Viešbutis / pavaldžioji įstaiga ir tai reiškia, kad jie yra atsieti.
Kad galėtų išreikšti abipusius interesus, jie turi turėti bendrą supratimą. Todėl,
abu vaidmenys turi numanomą "lazdelės" mechanizmą, kai pranešimo gamintojas ir
susitikti su pranešimo vartotoju. Šis mechanizmas vadinamas subjektu, prenumerata arba tema. Jis yra
atsakinga už pranešimų priskyrimą kategorijoms pagal subjektus, iš esmės tai yra bebūklinis pranešimų filtras.
Temos veikia kaip transliavimo stotys. Leidėjas sukuria pranešimą temai,
abonentai iš karto gauna pranešimą iš temos. Dėl atsietos
paslaugomis, efektyviausias būdas keistis pranešimais yra juos tvarkyti asinchroniškai.
Bėgiai be "Pub/Sub
Pagal numatytuosius nustatymus "Rails" nėra jokių "Rails" pridėtinių išlaidų, susijusių su programinės įrangos projektavimo šablonais, skirtais pranešimams tarp komponentų perduoti. Kūrėjai naudoja standartinius į objektus orientuotas programavimas (OOP) paradigma: parametrų perdavimas funkcijoms, klausiant klasių apie reikšmes.
Kai paraiška yra gana nesudėtinga, to gali pakakti. Kai programa auga, pavyzdžiui, kai kurias operacijas reikia atlikti asinchroniškai, tada projektas reikia abstrakcijos, kuri išsprendžia, kad duomenys darbo eiga. Užuot išradinėję dviratį, kūrėjai gali įgyvendinti Viešbutis / pavaldžioji įstaiga užpildyti šį abstrakcijos trūkumą.
"Pub/Sub" privalumai naudojant "Rails
- Venkite aktyvių įrašų atgalinių iškvietimų.
- Į sistemą įtraukus asinchroninį lygiagretųjį apdorojimą, padidėja našumas, patikimumas ir patikimumas. mastelio keitimas yra patobulintos.
- Pranešimai gali būti transliuojami asinchroniškai į skirtingas sistemos dalis.
- Leidžia asinchroniškai transliuoti pranešimus į skirtingas sistemos dalis.
- Atskyrimas - funkcijos pridėjimas ar pakeitimas neturės jokios įtakos, nes "Pub/Sub
galite keisti, kaip viskas sąveikauja. - Pranešimo vartotojui nebereikės periodiškai tikrinti, ar nėra atnaujinimų arba naujų
informacija. Tai sumažina pristatymo vėlavimą, kuris gali būti ypač problemiškas sistemose.
be jokios tolerancijos vėlavimui. - Sistema negali apriboti abonentų skaičiaus, nes jis gali keistis,
bet kada atnaujinti, padauginti arba išnykti.
"Pub/Sub" su "Rails" trūkumai
- Pagrindinis Pub/sub sistemų trūkumas yra tai, kad leidėjas ir
abonentas.
Rails Pub/Sub pristatyti
"Rails" šaltinio pavyzdžiai buvo parašyti naudojant biblioteką
"Pub/Sub on Rails (Ruby nomenklatūroje biblioteka vadinama gem): Daugiau informacijos rasite gem'o readme. Įgyvendinimą sudaro moduliai:
- Domenas,
- Renginys,
- Įvykio tvarkyklė,
- Renginio leidėjas,
- Prenumerata.
Domenas
Aprašoma verslo logika, kad būtų galima pateikti "Pub/Sub" kontekstą ir taip užtikrinti švarią "Pub/Sub" logiką. kodas.
modulis Pranešimai
išplėsti PubSub::Domain
pabaiga
modulis Ataskaitos
išplėsti PubSub::Domain
pabaiga
Renginys
Tai klasė, kurioje aprašoma tai, kas įvyko. Deklaruokite klasės pavadinimą kaip savaime apibūdinantį, kas įvyko, pavyzdžiui: atšaukta, pakeista, sukurta, sunaikinta, išsiųsta, atnaujinta. Įvykių pavadinimai gali atrodyti taip: ProfitAndLossStatementCreatedEvent, kuris reiškia, kad buvo sukurta finansinė ataskaita.
klasė Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
atributas :profit_and_loss_statement_id, Types::Strict::Integer
end
Renginio leidėjas
Klasė, galinti skleisti įvykius. Pavyzdyje parodyta, kaip sukurti paslaugos ataskaitą. Sėkmingai sukūrus ataskaitą, išspinduliuojamas šios ataskaitos sukūrimo įvykis.
klasė 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
Įvykio tvarkyklė
Ši klasė turėtų būti vykdoma kaip atsakas į įvykio tvarkymą.
modulis Pranešimai
klasė ReportsProfitAndLossStatementCreatedHandler < PubSub::DomainEventHandler
def call
ReportMailer.profit_and_loss_statement(profit_and_loss_statement).deliver_now
end
privatus
def pelno_ir_nuostolio_ataskaita
ProfitAndLossStatement.find(event_data.profit_and_loss_statement_id)
end
end
end
Prenumerata
Įvykiai su savo tvarkytojais susiejami per prenumeratas.
pranešimai:
reports__profit_and_loss_statement_created: async
Naudojimo atvejų pavyzdžiai:
- "Follow" funkcija socialiniuose tinkluose,
- Daiktų internetas,
- Siuntimas paštu,
- Pranešimas apie sugeneruotus failus.
Panašūs modeliai
- EventBus - komponentai gali siųsti įvykius į "EventBus" nežinodami, kas juos priims ir kiek respondentų juos priims. reaguoti,
- Stebėtojas - subjektas turi priklausomų asmenų, vadinamų stebėtojais, sąrašą ir praneša jiems, kai pasikeičia jų būsena,
- Surinkimas - apklausos metu klientai periodiškai teiraujasi sistemos, ar yra naujų įvykių arba duomenų.
Brangakmeniai
Santrauka
"Pub/sub" nėra įprastas "Ruby in Rails" metodas. Kaip pristatoma straipsnyje, šis modelis gali duoti daug naudos projektui - dėl jo kodas gali būti švarus, paslaugos gali būti atskirtos ir lengvai keičiamos.
