Ruby aadressil Rööpad (Rööpad, RoR) on tuntud veeb rakendusraamistik, mis on kirjutatud Ruby programmeerimiskeel. Pub/Sub on tarkvara disainimustrite lühinimetus, mida nimetatakse Publish-subscribe. Ma selgitan, kuidas Railsi tarkvarakomponentide vahelist suhtlust saaks käsitleda Pub/Subi abil.
Mis on Pub/sub?
Pub/sub on tarkvara disainimudel, mis pakub teenuste vahelist suhtlust. Teenus
kaasneb üks kahest rollist: avaldaja (kes toodab) või vastuvõtja (kes tarbib). Mis on
toodetakse tarbitavaks sündmuseks või sõnumiks või teatiseks. In the
käesoleva artikli kontekstis kasutatakse neid mõisteid vaheldumisi ühe ja sama asja tähistamiseks.
Teenus, mis toodab, ei tea, kes tarbib. Teenus, mis tarbib, ei tea
teate sõnumi päritolu. Nad võivad jääda üksteisele tundmatuks. See erineb
sõnumijärjekorrad, kus sõnumi saatev komponent teab sageli selle sihtkohta.
- selline sõnumite saatmise stiil võimaldab saata sõnumeid kõikjale. See mehhanism on põhiline
aadressilt Pub/sub ja see tähendab, et nad on lahutatud.
Oma ühiste huvide väljendamiseks peavad nad jagama ühist arusaama. Seetõttu,
mõlemas rollis on vaikimisi mehhanismi pulk, kus sõnumi tootja ja
sõnumi tarbija vastab. Seda mehhanismi nimetatakse subjektiks, tellimuseks või teemaks. See on
vastutab sõnumite liigitamise eest subjektidele, see on sisuliselt olematu sõnumifilter.
Teemad toimivad saatejaamana. Väljaandja toodab sõnumi teemale,
tellijad saavad koheselt teate teemast. Kuna lahtiseotud
teenuste puhul on kõige tõhusam viis sõnumite vahetamiseks nende asünkroonne käitlemine.
Rails ilma Pub/Subita
Vaikimisi ei ole Railsi tarkvaradisainimustrite puhul sõnumite edastamiseks komponentide vahel mingeid üleliigseid kulusid. Arendajad kasutavad standardseid objektorienteeritud programmeerimine (OOP) paradigma: funktsioonidele parameetrite edastamine, väärtuste kohta klasside küsimine.
Kui taotlus on üsna lihtne, võib sellest piisata. Kui rakendus kasvab, näiteks on vaja teha mõningaid operatsioone asünkroonselt, siis on projekt vajab abstraktsiooni, mis lahendab, et andmed tööprotsess. Selle asemel, et leiutada ratast uuesti, saavad arendajad rakendada Pub/sub et täita see abstraktsiooni puudus.
Pub/Sub koos Rails'iga plussid
- Vältige aktiivse kirje tagasikutseid.
- Lisades süsteemi asünkroonse paralleeltöötluse, paraneb jõudlus, töökindlus ja skaleeritavus on parandatud.
- Sõnumeid saab edastada asünkroonselt süsteemi eri osadele.
- Võimaldab sõnumeid edastada asünkroonselt süsteemi erinevatele osadele.
- Decoupling - funktsionaalsuse lisamine või muutmine ei mõjuta midagi, sest Pub/Sub
võimaldab teil muuta, kuidas kõik omavahel suhtleb. - Sõnumite tarbija ei pea enam perioodiliselt kontrollima, kas uuendusi või uusi
teave. See vähendab edastamise viivitust, mis võib olla eriti problemaatiline süsteemides, kus
mis ei salli viivitusi. - Ei ole mingit piirangut, kui palju tellijaid süsteem suudab käsitleda, sest see võib muutuda,
uuendada, paljuneda või kaduda igal ajal.
Pub/Sub koos Railsiga miinused
- Pub/sub-süsteemide peamine puudus on see, et nad lahutavad kirjastaja ja
tellija.
Rails Pub/Sub tutvustada
Näiteid allikas Rails kirjutati kasutades raamatukogu
Pub/Sub on Rails (Ruby nomenklatuuris nimetatakse raamatukogu gemiks): Rohkem üksikasju leiate gemi readme'ist. Rakendus koosneb moodulitest:
- Domeen,
- Üritus,
- Sündmuse käsitseja,
- Ürituse kirjastaja,
- Tellimus.
Domeen
Kirjeldab äriloogikat, et anda kontekst Pub/Subile ja seega teha puhas kood.
moodul Teated
laiendada PubSub::Domain
end
moodul Aruanded
laiendada PubSub::Domain
end
Sündmus
See on klass, mis kirjeldab juhtunut. Deklareerige klassi nimi võimalikult isekirjeldavaks koos sellega, mis juhtus, näiteks: tühistatud, muudetud, loodud, hävitatud, saadetud, uuendatud. Sündmuse nimed võivad välja näha järgmiselt: ProfitAndLossStatementCreatedEvent, mis tähendab, et finantsaruanne loodi.
class Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
atribuut :profit_and_loss_statement_id, Types::Strict::Integer
end
Sündmuse kirjastaja
Klass, mis on võimeline sündmusi välja saatma. Näide näitab teenuse aruande loomist. Kui aruanne on edukalt loodud, saadetakse välja selle aruande loomise sündmus.
klass 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
Sündmuse käsitseja
See klass tuleks käivitada vastusena sündmuse käsitlemisele.
moodul Teated
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
Tellimus
Sündmused on seotud nende käitlejatega tellimise kaudu.
teatised:
Aruanded__kasum_ja_kaotuse_aruanne_loodud: async
Näide kasutusjuhtumitest:
- "Follow" funktsioon sotsiaalvõrgustikes,
- Asjade internet,
- Postitus,
- Teade genereeritud failide kohta.
Sarnased mustrid
- EventBus - komponendid võivad saata sündmusi EventBus'ile, teadmata, kes neid vastu võtab või kui palju vastajaid on reageeri,
- Vaatleja - subjekt säilitab nimekirja sõltuvatest isikutest, mida nimetatakse vaatlejateks, ja teavitab neid, kui nende seisund muutub,
- Koondamine - küsitlemisel küsivad kliendid perioodiliselt süsteemilt, kas on uusi sündmusi või andmeid.
Kalliskivid
Kokkuvõte
Pub/sub ei ole Ruby in Railsis levinud lähenemisviis. Nagu artiklis tutvustatud, võib see muster tuua projektile palju kasu - see võib muuta koodi puhtaks, lahutada teenuseid ja muuta need kergesti skaleeritavaks.
