Το Pub/Sub μπορεί να αποφέρει πολλά οφέλη στο έργο - μπορεί να κάνει τον κώδικα καθαρό, να αποσυνδέσει τις υπηρεσίες και να τις κάνει εύκολα επεκτάσιμες. Μάθετε περισσότερα για το Pub/Sub στο παρακάτω άρθρο και ανεβάστε το έργο σας επίπεδο!
Ruby on Rails (Rails, RoR) είναι ένα πολύ γνωστό πλαίσιο εφαρμογών ιστού γραμμένο σε 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 σας επιτρέπει να τροποποιήσετε τον τρόπο με τον οποίο αλληλεπιδρούν τα πάντα.
Ο καταναλωτής μηνυμάτων δεν θα χρειάζεται πλέον να ελέγχει περιοδικά για ενημερώσεις ή νέες πληροφορίες. Μειώνει την καθυστέρηση παράδοσης που μπορεί να είναι ιδιαίτερα προβληματική σε συστήματα χωρίς καμία ανοχή για καθυστερήσεις.
Δεν υπάρχει όριο για το πόσους συνδρομητές μπορεί να διαχειριστεί το σύστημα, επειδή μπορεί να αλλάξει, να αναβαθμιστούν, να πολλαπλασιαστούν ή να εξαφανιστούν ανά πάσα στιγμή.
Μειονεκτήματα του Pub/Sub με Rails
Το σημαντικότερο μειονέκτημα των συστημάτων Pub/sub είναι η αποσύνδεση του εκδότη και του συνδρομητής.
Εισαγωγή Rails Pub/Sub
Παραδείγματα του πηγαίου κώδικα στο Rails γράφτηκε χρησιμοποιώντας τη βιβλιοθήκηPub/Sub στο Rails (στην ονοματολογία της Ruby, μια βιβλιοθήκη ονομάζεται gem): Θα βρείτε περισσότερες λεπτομέρειες στο readme του gem. Η υλοποίηση αποτελείται από ενότητες:
Τομέας,
Εκδήλωση,
Χειριστής συμβάντος,
Εκδότης της εκδήλωσης,
Συνδρομή.
Τομέας
Περιγράφει την επιχειρησιακή λογική προκειμένου να παρέχει πλαίσιο για 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
Παράδειγμα περιπτώσεων χρήσης:
Λειτουργία "Follow" στα κοινωνικά δίκτυα,
Διαδίκτυο των πραγμάτων,
Ταχυδρομείο,
Ειδοποίηση σχετικά με τα παραγόμενα αρχεία.
Παρόμοια μοτίβα
EventBus - στοιχεία μπορούν να στέλνουν συμβάντα στο EventBus χωρίς να γνωρίζουν ποιος θα τα παραλάβει ή πόσοι συμμετέχοντες θα αντιδράσουν,
Παρατηρητής - το υποκείμενο διατηρεί έναν κατάλογο εξαρτημένων ατόμων, που ονομάζονται παρατηρητές, και τους ειδοποιεί κάθε φορά που αλλάζει η κατάστασή τους,
Συγκέντρωση - κατά την αναζήτηση, οι πελάτες ρωτούν περιοδικά το σύστημα αν υπάρχουν νέα συμβάντα ή δεδομένα.
Πολύτιμοι λίθοι
Περίληψη
Η Pub/sub δεν είναι μια συνηθισμένη προσέγγιση στο Ruby in Rails. Όπως παρουσιάζεται στο άρθρο, αυτό το μοτίβο μπορεί να φέρει πολλά οφέλη στο έργο - μπορεί να κάνει τον κώδικα καθαρό, να αποσυνδέσει τις υπηρεσίες και να τις κάνει εύκολα επεκτάσιμες.