Ruby osoitteessa Kiskot (Rails, RoR) on tunnettu web sovelluskehys, joka on kirjoitettu Ruby ohjelmointikieli. Pub/Sub on lyhennetty nimi ohjelmistojen suunnittelumalleille nimeltä Publish-subscribe. Selitän, miten ohjelmistokomponenttien välinen kommunikointi Railsissa voitaisiin hoitaa Pub/Sub-menetelmällä.
Mikä on Pub/sub?
Pub/sub on ohjelmistosuunnittelumalli, joka tarjoaa palveluiden välistä viestintää. Palvelu
liittyy jompaankumpaan kahdesta roolista: julkaisija (joka tuottaa) tai vastaanottaja (joka kuluttaa). Mikä on
tuotetaan kulutettavaksi, määritetään tapahtumaksi, viestiksi tai ilmoitukseksi. Vuonna
Tässä artikkelissa niitä käytetään vaihtelevasti viittaamaan samaan asiaan.
Palvelu, joka tuottaa, ei tiedä, kuka kuluttaa. Palvelu, joka kuluttaa, ei
tietää viestin alkuperän. Ne voivat pysyä toisilleen tuntemattomina. Se eroaa
viestijonot, joissa viestin lähettävä komponentti usein tietää viestin määränpään.
- tämäntyyppisen viestinnän avulla voit lähettää viestejä missä tahansa. Tämä mekanismi on keskeinen
of Pub/sub ja se tarkoittaa, että ne on erotettu toisistaan.
Yhteisten etujensa ilmaiseminen edellyttää yhteistä ymmärrystä. Siksi,
molemmissa rooleissa on implisiittinen mekanismi, jossa viestin tuottaja ja
viestin kuluttaja tapaa. Tätä mekanismia kutsutaan aiheeksi, tilaukseksi tai aiheeksi. Se on
vastaa viestien luokittelusta kohteisiin, se on lähinnä tilaton viestisuodatin.
Aiheet toimivat lähetysasemina. Julkaisija tuottaa viestin aiheeseen,
tilaajat saavat välittömästi viestin aiheesta. Kytkettyjen
palveluissa tehokkain tapa vaihtaa viestejä on käsitellä niitä asynkronisesti.
Rails ilman Pub/Sub
Oletusarvoisesti Railsissa ei ole ohjelmistosuunnittelumallien yleiskustannuksia komponenttien välisessä viestien välittämisessä. Kehittäjät käyttävät standardia oliosuuntautunut ohjelmointi (OOP) paradigma: parametrien välittäminen funktioille, luokkien kysyminen arvoista.
Kun hakemus on melko yksinkertainen, se voi riittää. Kun sovellus kasvaa ja esimerkiksi joitakin toimintoja on suoritettava asynkronisesti, niin silloin projekti tarvitsee abstraktiota, joka ratkaisee, että tiedot työnkulku. Sen sijaan, että kehittäjät keksisivät pyörän uudelleen, he voivat toteuttaa Pub/sub täyttämään tämän abstraktion puutteen.
Pub/Subin edut Railsin kanssa
- Vältä aktiivisen tietueen takaisinkutsuja.
- Kun järjestelmään lisätään asynkronista rinnakkaiskäsittelyä, suorituskyky, luotettavuus ja skaalautuvuus parannetaan.
- Viestejä voidaan lähettää asynkronisesti järjestelmän eri osiin.
- Mahdollistaa viestien lähettämisen asynkronisesti järjestelmän eri osiin.
- Decoupling - toiminnallisuuden lisääminen tai muuttaminen ei vaikuta mihinkään, koska Pub/Sub
voit muokata kaiken vuorovaikutusta. - Viestin kuluttajan ei enää tarvitse tarkistaa säännöllisesti päivityksiä tai uusia viestejä.
tiedot. Se vähentää toimitusviivettä, joka voi olla erityisen ongelmallista järjestelmissä, joissa
eikä viivytyksiä siedetä. - Järjestelmä voi käsitellä tilaajien määrää ilman rajoituksia, koska se voi muuttua,
päivittää, lisääntyä tai kadota milloin tahansa.
Pub/Subin ja Railsin haitat
- Pub/sub-järjestelmien suurin haittapuoli on se, että niissä ei ole kytketty yhteen julkaisijaa ja toimittajaa.
tilaaja.
Rails Pub/Sub käyttöönotto
Esimerkkejä lähdekoodin Rails kirjoitettiin käyttäen kirjastoa
Pub/Sub on Rails (Rubyn nimikkeistössä kirjasto on nimeltään gem): Löydät lisätietoja gemin readme-tiedostosta. Toteutus koostuu moduuleista:
- Alue,
- Tapahtuma,
- Tapahtuman käsittelijä,
- Tapahtuman julkaisija,
- Tilaus.
Verkkotunnus
Kuvaa liiketoimintalogiikan, jotta Pub/Subille voidaan tarjota konteksti ja näin ollen tehdä puhtaat koodi.
moduuli Ilmoitukset
extend PubSub::Domain
end
moduuli Raportit
extend PubSub::Domain
end
Tapahtuma
Se on luokka, joka kuvaa, mitä tapahtui. Ilmoita luokan nimi mahdollisimman hyvin itseään kuvaavaksi sen kanssa, mitä tapahtui, esimerkiksi: peruutettu, muutettu, luotu, tuhottu, lähetetty, päivitetty. Tapahtuman nimet voivat näyttää seuraavanlaisilta: ProfitAndLossStatementCreatedEvent, joka tarkoittaa, että tilinpäätös luotiin.
class Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
attribuutti :profit_and_loss_statement_id, Types::Strict::Integer
end
Tapahtuman julkaisija
Luokka, joka pystyy lähettämään tapahtumia. Esimerkissä luodaan palveluraportti. Kun raportti on luotu onnistuneesti, lähetetään raportin luomista koskeva tapahtuma.
luokka Raportit::TuloslaskelmaPalvelu
include PubSub::Emit
def execute
emit(:report_profit_and_loss_statement_created, profit_and_loss_statement_id: id) if result.ok?
end
end
Tapahtuman käsittelijä
Tämä luokka on suoritettava vastauksena tapahtuman käsittelyyn.
moduuli Ilmoitukset
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
Tilaus
Tapahtumat sidotaan käsittelijöihinsä tilausten kautta.
ilmoitukset:
raportteja__profit_and_loss_statement_created: async
Esimerkkejä käyttötapauksista:
- "Seuraa" -toiminto sosiaalisissa verkostoissa,
- Esineiden internet,
- Postitus,
- Ilmoitus luoduista tiedostoista.
Samankaltaiset kuviot
- EventBus - komponentit voivat lähettää tapahtumia EventBusiin tietämättä, kuka ne poimii tai kuinka monta vastaajaa on tulossa. reagoida,
- Tarkkailija - subjekti ylläpitää luetteloa riippuvaisista henkilöistä, joita kutsutaan tarkkailijoiksi, ja ilmoittaa niille aina, kun niiden tila muuttuu,
- Pooling - Kyselyssä asiakkaat kysyvät säännöllisesti järjestelmältä, onko uusia tapahtumia tai tietoja.
Jalokivet
Yhteenveto
Pub/sub ei ole yleinen lähestymistapa Ruby in Railsissa. Kuten artikkelissa esitellään, tämä malli voi tuoda monia etuja projektille - se voi tehdä koodista siistiä, irrottaa palvelut toisistaan ja tehdä niistä helposti skaalautuvia.
