(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 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-5LLHNRP9'); thecodest, Kirjoittaja osoitteessa The Codest - Sivu 7 / 9

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

Pub/Subin ja Railsin haitat

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:

  1. Alue,
  2. Tapahtuma,
  3. Tapahtuman käsittelijä,
  4. Tapahtuman julkaisija,
  5. 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:

Samankaltaiset kuviot

  1. EventBus - komponentit voivat lähettää tapahtumia EventBusiin tietämättä, kuka ne poimii tai kuinka monta vastaajaa on tulossa. reagoida,
  2. Tarkkailija - subjekti ylläpitää luetteloa riippuvaisista henkilöistä, joita kutsutaan tarkkailijoiksi, ja ilmoittaa niille aina, kun niiden tila muuttuu,
  3. 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.

yhteistyöbanneri
fiFinnish