(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, Συγγραφέας στο The Codest - Σελίδα 7 από 9

Ruby στο Ράγες (Rails, RoR) είναι ένα γνωστό web πλαίσιο εφαρμογών γραμμένο σε Ruby γλώσσα προγραμματισμού. Pub/Sub είναι μια σύντομη ονομασία των προτύπων σχεδίασης λογισμικού που ονομάζονται Δημοσίευση-συνδρομή. Θα εξηγήσω πώς η επικοινωνία μεταξύ των συστατικών λογισμικού στο Rails θα μπορούσε να αντιμετωπιστεί από το Pub/Sub.

Τι είναι η Pub/sub;

Pub/sub είναι ένα πρότυπο σχεδίασης λογισμικού που παρέχει επικοινωνία μεταξύ υπηρεσιών. Υπηρεσία
συνεπάγεται έναν από τους δύο ρόλους: εκδότης (που παράγει) ή δέκτης (που καταναλώνει). Τι είναι
που παράγεται προς κατανάλωση προσδιορίζεται ως γεγονός ή μήνυμα ή ειδοποίηση. Στο
πλαίσιο αυτού του άρθρου, χρησιμοποιούνται εναλλακτικά για να αναφερθούν στο ίδιο πράγμα.
Η υπηρεσία που παράγει δεν γνωρίζει ποιος καταναλώνει. Η υπηρεσία που καταναλώνει δεν
να γνωρίζετε την προέλευση του μηνύματος. Μπορούν να παραμείνουν άγνωστοι μεταξύ τους. Διαφέρει από το
ουρές μηνυμάτων, όπου το στοιχείο που στέλνει το μήνυμα συχνά γνωρίζει τον προορισμό του
- αυτό το στυλ ανταλλαγής μηνυμάτων σας επιτρέπει να στέλνετε μηνύματα οπουδήποτε. Αυτός ο μηχανισμός είναι ο πυρήνας
του Pub/sub και αυτό σημαίνει ότι είναι αποσυνδεδεμένες.

Για να εκφράσουν τα κοινά τους συμφέροντα, πρέπει να έχουν κοινή αντίληψη. Ως εκ τούτου,
και οι δύο ρόλοι έχουν έναν σιωπηρό μηχανισμό του stick όπου ο παραγωγός ενός μηνύματος και ο
ο καταναλωτής του μηνύματος συναντάται. Αυτός ο μηχανισμός ονομάζεται θέμα, συνδρομή ή θέμα. Είναι
υπεύθυνη για την κατηγοριοποίηση των μηνυμάτων σε θέματα, είναι ουσιαστικά ένα άπατρις φίλτρο μηνυμάτων.
Τα θέματα λειτουργούν ως σταθμοί εκπομπής. Ένας εκδότης παράγει το μήνυμα στο θέμα,
οι συνδρομητές λαμβάνουν αμέσως το μήνυμα από το θέμα. Λόγω της αποσυνδεδεμένης
υπηρεσίες, ο πιο αποδοτικός τρόπος ανταλλαγής μηνυμάτων είναι η ασύγχρονη διαχείρισή τους.

Rails χωρίς Pub/Sub

Από προεπιλογή, δεν υπάρχει επιβάρυνση του Rails για τα πρότυπα σχεδίασης λογισμικού για τη μετάδοση μηνυμάτων μεταξύ στοιχείων. Οι προγραμματιστές χρησιμοποιούν το πρότυπο αντικειμενοστραφής προγραμματισμός (OOP) παράδειγμα: περνώντας παραμέτρους σε συναρτήσεις, ζητώντας κλάσεις σχετικά με τις τιμές.

Όταν η εφαρμογή είναι μάλλον απλή, μπορεί να είναι αρκετή. Όταν η εφαρμογή μεγαλώνει, για παράδειγμα, κάποιες λειτουργίες πρέπει να γίνονται ασύγχρονα, τότε η έργο χρειάζεται αφαίρεση που επιλύει ότι δεδομένα ροή εργασιών. Αντί να επανεφεύρουν τον τροχό, οι προγραμματιστές μπορούν να εφαρμόσουν Pub/sub για να καλύψει αυτή την έλλειψη αφαίρεσης.

Πλεονεκτήματα του Pub/Sub με το Rails

Μειονεκτήματα του Pub/Sub με Rails

Εισαγωγή Rails Pub/Sub

Παραδείγματα του πηγαίου κώδικα στο Rails γράφτηκε χρησιμοποιώντας τη βιβλιοθήκη
Pub/Sub στο Rails (στην ονοματολογία της Ruby, μια βιβλιοθήκη ονομάζεται gem): Θα βρείτε περισσότερες λεπτομέρειες στο readme του gem. Η υλοποίηση αποτελείται από ενότητες:

  1. Τομέας,
  2. Εκδήλωση,
  3. Χειριστής συμβάντος,
  4. Εκδότης της εκδήλωσης,
  5. Συνδρομή.

Τομέας

Περιγράφει την επιχειρησιακή λογική προκειμένου να παρέχει πλαίσιο για Pub/Sub και, ως εκ τούτου, να κάνει καθαρές κωδικός.

 ενότητα Ειδοποιήσεις
   extend PubSub::Domain
 end
 ενότητα Αναφορές
   extend PubSub::Domain
 end

Εκδήλωση

Είναι μια κατηγορία που περιγράφει τι συνέβη. Δηλώστε το όνομα της κλάσης ως αυτοπεριγραφικό με το τι συνέβη όσο το δυνατόν περισσότερο, για παράδειγμα: ακυρώθηκε, άλλαξε, δημιουργήθηκε, καταστράφηκε, στάλθηκε, ενημερώθηκε. Τα ονόματα συμβάντων μπορεί να μοιάζουν με τα εξής: ProfitAndLossStatementCreatedEvent, που σημαίνει ότι δημιουργήθηκε μια οικονομική κατάσταση.

 class Reports::ProfitAndLossStatementCreatedEvent < PubSub::DomainEvent
   attribute :profit_and_loss_statement_id, Types::Strict::Integer
 end

Εκδότης εκδηλώσεων

Κλάση ικανή να εκπέμπει συμβάντα. Το παράδειγμα δείχνει τη δημιουργία μιας αναφοράς υπηρεσίας. Όταν η έκθεση δημιουργηθεί με επιτυχία, εκπέμπει το συμβάν της δημιουργίας της εν λόγω έκθεσης.

class 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

Χειριστής συμβάντος

Αυτή η κλάση θα πρέπει να εκτελείται ως απόκριση στο χειρισμό ενός συμβάντος.

ενότητα Ειδοποιήσεις
 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

Συνδρομή

Τα συμβάντα συνδέονται με τους χειριστές τους μέσω συνδρομών.

ειδοποιήσεις:
 report__profit_and_loss_statement_created: async

Παράδειγμα περιπτώσεων χρήσης:

Παρόμοια μοτίβα

  1. EventBus - στοιχεία μπορούν να στέλνουν συμβάντα στο EventBus χωρίς να γνωρίζουν ποιος θα τα παραλάβει ή πόσοι συμμετέχοντες θα αντιδράστε,
  2. Παρατηρητής - το υποκείμενο διατηρεί έναν κατάλογο εξαρτημένων ατόμων, που ονομάζονται παρατηρητές, και τους ειδοποιεί κάθε φορά που αλλάζει η κατάστασή τους,
  3. Συγκέντρωση - κατά την αναζήτηση, οι πελάτες ρωτούν περιοδικά το σύστημα αν υπάρχουν νέα συμβάντα ή δεδομένα.

Πολύτιμοι λίθοι

Περίληψη

Η Pub/sub δεν είναι μια συνηθισμένη προσέγγιση στο Ruby in Rails. Όπως παρουσιάζεται στο άρθρο, αυτό το μοτίβο μπορεί να φέρει πολλά οφέλη στο έργο - μπορεί να κάνει τον κώδικα καθαρό, να αποσυνδέσει τις υπηρεσίες και να τις κάνει εύκολα επεκτάσιμες.

πανό συνεργασίας
elGreek