(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': data().getTime(),įvykis:'gtm.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-5LHNRP9'); thecodest, The Codest autorius - Puslapis 7 iš 9

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
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

"Pub/Sub" su "Rails" trūkumai

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:

  1. Domenas,
  2. Renginys,
  3. Įvykio tvarkyklė,
  4. Renginio leidėjas,
  5. 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:

Panašūs modeliai

  1. EventBus - komponentai gali siųsti įvykius į "EventBus" nežinodami, kas juos priims ir kiek respondentų juos priims. reaguoti,
  2. Stebėtojas - subjektas turi priklausomų asmenų, vadinamų stebėtojais, sąrašą ir praneša jiems, kai pasikeičia jų būsena,
  3. 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.

bendradarbiavimo vėliava
lt_LTLithuanian