Προγραμματισμός

Γράψτε τη δική σας μαμά!

Η μαμά είναι παρεξηγημένη και η μαμά δεν παίρνει πίστωση. Μπορεί να το έχετε ακούσει πριν, αλλά στην αρένα των κατανεμημένων συστημάτων είναι πραγματικά αλήθεια! Αυτό συμβαίνει επειδή το μεσαίο λογισμικό προσανατολισμένο στα μηνύματα (MOM) παραδοσιακά δεν απολάμβανε το ίδιο επίπεδο πολυπλοκότητας και υποστήριξης με άλλες τεχνολογίες που χρησιμοποιούνται σε κατανεμημένα πλαίσια επικοινωνιών.

Αλλά οι καιροί αλλάζουν. Με την εισαγωγή εξελιγμένων, ισχυρών προσφορών προμηθευτών, το ενδιαφέρον για τα συστήματα MOM αυξάνεται ραγδαία. Οι καλές εφαρμογές MOM παρέχουν διεπαφή εφαρμογών υψηλού επιπέδου, εγγυήσεις ποιότητας υπηρεσίας και πλήθος υπηρεσιών όπως ασφάλεια, ουρά μηνυμάτων και υποστήριξη καταλόγου που είναι απαραίτητες για κατανεμημένες επικοινωνίες "βιομηχανικής ισχύος".

Κατανεμημένα πλαίσια επικοινωνιών

Ο σκοπός ενός κατανεμημένου πλαισίου επικοινωνίας είναι να παρέχει έναν καλό τρόπο επικοινωνίας των τμημάτων ενός κατανεμημένου συστήματος. Τα αντικειμενοστρεφή πλαίσια ολοκληρώνουν αυτήν την εργασία παρέχοντας στα κατανεμημένα αντικείμενα έναν τρόπο αλληλογραφίας.

Τα κατανεμημένα αντικειμενοστρεφή πλαίσια που λαμβάνουν τη μεγαλύτερη προσοχή είναι αυτά που μοντελοποιούν τα μηνύματα ως κλήσεις μεθόδου. Τα CORBA και RMI είναι δύο εξαιρετικά παραδείγματα αυτού του τύπου πλαισίου (βλ. Πόροι). Αυτά τα συστήματα ονομάζονται συχνά συστήματα κλήσης απομακρυσμένης διαδικασίας (RPC). Η μαγεία αυτών των συστημάτων είναι ότι πραγματοποιούν απομακρυσμένες διαδικασίες (ή μεθόδους) οι κλήσεις φαίνεται να είναι τοπικές κλήσεις διαδικασίας (LPC).

Τα RPC αρχειοθετούνται στο μοτίβο πελάτη / διακομιστή. Για παράδειγμα, αντικείμενα CORBA που εκθέτουν μεθόδους που πρέπει να κληθούν από απομακρυσμένα αντικείμενα καλούνται (και είναι) διακομιστές.

Σας παρουσιάζουμε τη μαμά

Σε αντίθεση με τα RPC, οι MOM δεν μοντελοποιούν μηνύματα ως κλήσεις μεθόδου. Αντ 'αυτού, τα μοντελοποιούν ως συμβάντα σε ένα σύστημα παράδοσης συμβάντων. Οι πελάτες στέλνουν και λαμβάνουν συμβάντα ή "μηνύματα" μέσω API που παρέχει η MOM. Το MOM μπορεί να παρουσιάσει υπηρεσίες καταλόγου που επιτρέπουν στους πελάτες να αναζητήσουν μια άλλη εφαρμογή που λειτουργεί ως διακομιστής ή μπορεί να παρουσιάσει "κανάλια" για όλες τις χρήσεις που επιτρέπουν σε μια ομάδα πελατών να επικοινωνούν ως ομότιμοι, ή μπορεί να παρουσιάζει και τις δύο επιλογές.

Όλες οι εφαρμογές επικοινωνούν απευθείας μεταξύ τους χρησιμοποιώντας το MOM. Τα μηνύματα που δημιουργούνται από εφαρμογές έχουν νόημα μόνο για άλλους πελάτες, επειδή το ίδιο το MOM είναι μόνο ένας δρομολογητής μηνυμάτων (και σε ορισμένες περιπτώσεις ένα σύστημα ουράς μηνυμάτων επίσης).

Οι μητέρες διατίθενται σε όλα τα σχήματα και μεγέθη

Όλα τα MOM μοιράζονται δύο βασικά χαρακτηριστικά: επιτρέπουν τη μετάδοση μηνυμάτων και η μετάδοση μηνυμάτων δεν αποκλείει. Πέρα από αυτά τα βασικά, οι προμηθευτές μπορούν να εφαρμόσουν οποιονδήποτε αριθμό διαφορετικών διεπαφών και υπηρεσιών.

Πολλές MOM παρέχουν μια διεπαφή δημοσίευσης και εγγραφής για να επιτρέπουν στις εφαρμογές να δημοσιεύουν και να λαμβάνουν μηνύματα που τους ενδιαφέρουν. Αυτή η διεπαφή μπορεί να λάβει τη μορφή ενός συστήματος που βασίζεται σε κανάλια ή ενός πιο απλού συστήματος στο οποίο ένας πελάτης καταγράφει τους τύπους των μηνυμάτων ενδιαφέρεται να λάβει.

Οι βασικές MOM παρέχουν μόνο άμεσα μηνύματα, χωρίς πρόσθετες υπηρεσίες. Οι σύνθετες MOM παρέχουν ουρά μηνυμάτων και εγγυημένη παράδοση, μαζί με ασφάλεια, ανάλυση δεδομένων μεταξύ πλατφορμών, επεκτασιμότητα και άλλα οφέλη.

Μαμά με μια ματιά

Ακολουθεί μια γρήγορη αναφορά για να σας βοηθήσουμε να μάθετε τι είναι το MOM.

Πλεονεκτήματα της μαμάς

  • Απλός: Οι πελάτες δημοσιεύουν και εγγραφούν

    Η δημοσίευση-και-εγγραφή είναι μια χρήσιμη αφαίρεση υψηλού επιπέδου για το τι πρέπει να κάνουν οι εφαρμογές για να επικοινωνήσουν.

  • Ανετα: Δεν απαιτείται περίπλοκη ρύθμιση

    Οι MOM είναι εύκολο να εγκατασταθούν και να χρησιμοποιηθούν, σε αντίθεση με πολύπλοκα συστήματα που βασίζονται σε RPC όπως το CORBA.

  • Γενικός: Το ίδιο MOM μπορεί να χρησιμοποιηθεί για πολλές εφαρμογές

    Επειδή οποιοδήποτε δεδομένο σύστημα MOM είναι ουσιαστικά απλώς μια γενική μεταφορά μηνυμάτων, μπορεί να επαναχρησιμοποιηθεί σε διαφορετικές εφαρμογές χωρίς επιπλέον εργασία.

  • Εύκαμπτος: Κάθε μήνυμα μπορεί να μεταδοθεί

    Οποιοδήποτε μήνυμα μπορεί να περάσει από τη μαμά. Επειδή η μαμά δεν καταλαβαίνει τα μηνύματα, δεν έχει σημασία τι είναι.

Μειονεκτήματα της μαμάς

  • Γενικός: Οι εφαρμογές πρέπει να κατανοούν τα μηνύματα

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

  • Αγνωστος: Δεν μοντελοποιεί κλήσεις μεθόδου

    Οι προγραμματιστές που δεν είναι εξοικειωμένοι με τα μηνύματα ενδέχεται να έχουν πρόβλημα να καταλάβουν πώς να τα χρησιμοποιήσουν αποτελεσματικά.

  • Ασύγχρονη: Τα μηνύματα δεν αποκλείουν

    Τα μηνύματα φυσικά δεν αποκλείουν. Αυτό δυσχεραίνει τη σύνταξη εφαρμογών που χρειάζονται αποκλεισμό κλήσεων.

  • Πολύ απλό: Χωρίς ανάλυση δεδομένων

    Ακόμα και τα απλά συστήματα RPC αναλύουν σωστά τα δεδομένα. Οι απλές MOM μπορούν απλώς να στέλνουν μηνύματα στα οποία τα byte είναι εκτός λειτουργίας από την άποψη του παραλήπτη.

  • Μη τυπικό: Οι προμηθευτές είναι παντού

    Οι υλοποιήσεις του προμηθευτή MOM κάνουν τα πάντα ... και τίποτα.

    Caveat Emptor

    είναι η φράση που πρέπει να θυμάστε όταν εξετάζετε τις διάφορες προσφορές πωλητών.

Πότε είναι κατάλληλες οι μητέρες;

  • Κατά την επικοινωνία, οι εφαρμογές πρέπει να χρησιμοποιούν μηνύματα
  • Όταν το προσωπικό προγραμματισμού δεν είναι παντρεμένο με συστήματα πελάτη / διακομιστή και RPC
  • Όταν το CORBA / RMI και τα σχετικά συστήματα είναι πολύ περίπλοκα
  • Όταν τα απλά συστήματα RPC είναι πολύ στοιχειώδη

Σχεδιαστικά θέματα για τη μαμά μας

Τώρα που το φόντο είναι εκτός δρόμου, ας αρχίσουμε να συνθέτουμε τη μαμά μας, την Μήνυμα λεωφορείου. Θα χρησιμοποιήσουμε το MOM για να επιτρέψουμε την επικοινωνία μεταξύ των κατανεμημένων πελατών του πίνακα. (Ανατρέξτε στην ενότητα Πόροι για συνδέσμους προς πληροφορίες σχετικά με την εφαρμογή του πίνακα με τις οποίες συνεργαζόμαστε τις τελευταίες δόσεις.)

Το βασικό ζήτημα για το Bus Bus είναι ότι παρέχει μια βολική διεπαφή υψηλού επιπέδου για τα αντικείμενα της εφαρμογής που θα το χρησιμοποιήσουν.

Επειδή ένα κανάλι έχει νόημα ως η κεντρική υπηρεσία που πρέπει να παρέχει το Bus Bus, η διεπαφή με το Bus Bus είναι το Κανάλι τάξη. Ο πελάτης χρησιμοποιεί το Κανάλι τάξη για πρόσβαση σε κάθε λειτουργία υψηλού επιπέδου του Διαύλου Μηνυμάτων, από την εγγραφή και τη δημοσίευση έως την καταχώριση διαθέσιμων καναλιών στο σύστημα.

ο Κανάλι Η τάξη εκθέτει μεθόδους κλάσης που επηρεάζουν το Δίαυλο μηνυμάτων στο σύνολό του ή αφορούν όλα τα κανάλια. Κάθε παρουσία καναλιού αντιπροσωπεύει ένα μόνο κανάλι στο σύστημα και εκθέτει συγκεκριμένες μεθόδους καναλιού.

Δύο διεπαφές, Λίστα λιστών και ChannelsUpdateListener, παρέχονται για τους σκοπούς της εγγραφής για τη λήψη μηνυμάτων σε ένα κανάλι και τη λήψη ειδοποίησης για την προσθήκη καναλιού, αντίστοιχα.

Η παρακάτω εικόνα απεικονίζει την αρχιτεκτονική του συστήματος Bus Bus.

Κάτω από την κουκούλα

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

Κανάλι

για να παρακολουθείτε τα κανάλια. Οι ακροατές ενός καναλιού εφαρμόζουν το

Λίστα λιστών

διεπαφή και αντικείμενα που θέλουν να λαμβάνουν ενημερώσεις σχετικά με τις προσθήκες καναλιού υλοποιούν το

ChannelsUpdateListener

διεπαφή. Τα καταχωρημένα αντικείμενα ακρόασης καλούνται πίσω από

Κανάλι

όποτε συμβαίνει κάτι ενδιαφέρον. Όλη η επικοινωνία με τον έξω κόσμο γίνεται με συγκεκριμένη μεταφορά του

ΜήνυμαBus

διεπαφή, όπως

ΜήνυμαBusSocketImpl

.

Καθε ΜήνυμαBus Η εφαρμογή μεταβιβάζει μηνύματα μιλώντας σε έναν αντίστοιχο διακομιστή μετάδοσης μηνυμάτων, που ονομάζεται μεσίτης, μέσω μιας κοινής μεταφοράς δικτύου, όπως πρίζες ή URL / servlets Ο μεσίτης δρομολογεί μηνύματα μεταξύ ΜήνυμαBus περιπτώσεις, καθεμία από τις οποίες αντιστοιχεί σε ένα Κανάλι τάξη.

Επειδή αυτές οι συγκεκριμένες μεταφορές υλοποιούν όλες τις ΜήνυμαBus διεπαφή, είναι εναλλάξιμα. Για παράδειγμα, βασίζεται σε servlet ΜήνυμαBus και ο μεσίτης μπορεί να χρησιμοποιηθεί από Κανάλι στη θέση των υποδοχών ΜήνυμαBus και μεσίτης.

Το Message Bus μας είναι ένα απλό σύστημα peer-to-peer που βασίζεται σε κανάλια, καθιστώντας το κατάλληλο για χρήση σε μια εφαρμογή peer-to-peer όπως ένα συνεργατικό σύστημα.

Χρήση του Bus Bus σε μια εφαρμογή πελάτη

Αυτά τα βήματα επιτρέπουν σε έναν πελάτη να χρησιμοποιήσει το Bus Bus:

  1. Ρυθμίστε μια παρουσία του ΜήνυμαBus.

     Channel.setMessageBus (νέο MessageBusSocketImpl (BROKER_NAME, BROKER_PORT)); 

    Σε αυτήν την κλήση, ένα νέο ΜήνυμαBus Η υλοποίηση δημιουργείται, με τον μεσίτη να προσδιορίζεται από τα ορίσματα στην κλήση κατασκευαστή.

  2. Εγγραφείτε σε ένα κανάλι.

     Κανάλι κείμενοChannel = Channel.subscribe ("text_channel", αυτό); 

    Αυτή η κλήση επιστρέφει μια παρουσία του καναλιού που αντιστοιχεί στο όρισμα ονόματος καναλιού. Εάν το κανάλι δεν υπάρχει, δημιουργείται στο σύστημα.

    Πέρασμα Αυτό ως επιχείρημα σημαίνει ότι αυτός ο καλούντος είναι ο ίδιος Λίστα λιστών. Ο καλών μπορεί να εγγραφεί όχι μόνο ο ίδιος αλλά και οποιεσδήποτε Λίστα λιστών στο κανάλι ή σε οποιονδήποτε αριθμό ακροατών σε ένα μόνο κανάλι.

  3. Δημοσιεύστε ένα μήνυμα στο κανάλι.

     textChannel.publish (νέα συμβολοσειρά (myID + "λέει Γεια!")); 

    Η δημοσίευση ενός μηνύματος είναι εύκολη και δεν απαιτεί τίποτα περισσότερο από την κλήση δημοσιεύω() στην επιλεγμένη παρουσία καναλιού. Σημειώστε ότι το μήνυμα μπορεί να είναι οποιοσδήποτε τύπος αντικειμένου, αρκεί άλλοι πελάτες στο κανάλι να το καταλάβουν και ο διακομιστής έχει πρόσβαση στα αρχεία κατηγορίας μηνυμάτων (όπως περιγράφεται αναλυτικά στην ενότητα Χρήση του διαύλου μηνυμάτων)

Πρόσθετα προαιρετικά βήματα περιλαμβάνουν:

  • Καταργήστε την εγγραφή ενός ακροατή από ένα κανάλι.

     textChannel.unsubscribe (ChannelListener); 

    Αυτή η μέθοδος διαγράφει το όνομα Λίστα λιστών από το κανάλι, που σημαίνει ότι ο ακροατής δεν θα λάβει νέα μηνύματα. Οι ακροατές πρέπει να διαγραφούν με αυτόν τον τρόπο όταν δεν χρειάζονται πλέον.

  • Λάβετε μια λίστα με ονόματα καναλιών.

     Enumeration Channel.getChannelNames (); 

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

  • Εγγραφείτε για να λαμβάνετε κανάλια που προστέθηκαν πρόσφατα.

     Channel.subscribeChannelsUpdate (ChannelsUpdateListener); 

    ΕΝΑ ChannelsUpdateListener μπορούν να εγγραφούν για να λαμβάνουν ενημερώσεις όταν προστίθενται κανάλια στο μήνυμα διαύλου.

  • Διακοπή λήψης καναλιών που προστέθηκαν πρόσφατα.

     Channel.unsubscribeChannelsUpdate (ChannelsUpdateListener); 

    ΕΝΑ ChannelsUpdateListener μπορεί να διαγραφεί από τις ενημερώσεις προσθήκης καναλιού. Οι ακροατές πρέπει να διαγραφούν με αυτόν τον τρόπο όταν δεν χρειάζονται πλέον.

  • Προσθέστε περισσότερους ακροατές σε ένα κανάλι.

     textChannel.subscribe (ChannelListener); 

    Αυτή η μέθοδος επιτρέπει στον καλούντα να εγγραφεί επιπλέον ακροατές σε ένα κανάλι.

     Συμβολοσειρά textChannel.getName (); 

    Αυτή η μέθοδος επιστρέφει το όνομα αυτής της παρουσίας καναλιού.

Διεπαφή Λίστα λιστών

ο Λίστα λιστών διεπαφή πρέπει να εφαρμοστεί από οποιοδήποτε αντικείμενο που θέλει να ενημερωθεί όταν ένα μήνυμα εισέρχεται σε ένα συγκεκριμένο κανάλι.

δημόσια διεπαφή ChannelListener {public void messageReceived (Channel channel, Object message). } 

Στις περισσότερες περιπτώσεις, ένας πελάτης που ζητά ένα Κανάλι Το παράδειγμα θα εγγραφεί στο κανάλι και θα εφαρμόσει αυτή τη διεπαφή, αλλά δεν είναι απαραίτητο. Σύμφωνα με τους προσαρμογείς συμβάντων JDK 1.1, ένας πελάτης μπορεί να εγγραφεί άλλο αντικείμενο σε ένα κανάλι έτσι ώστε να καταναλώνει μηνύματα που δημιουργούνται από το κανάλι.

Στην πραγματικότητα, ένα αντικείμενο ακροατή μπορεί να εγγραφεί σε πολλά κανάλια, τα οποία θα καλούν τα ακροατήρια το μήνυμα ελήφθη() κάθε φορά που ένα μήνυμα εισέρχεται σε οποιοδήποτε από τα κανάλια. ο το μήνυμα ελήφθη () Η μέθοδος κλήσης παρέχει πρόσβαση στο κανάλι όπου εμφανίστηκε το μήνυμα, επιτρέποντας το μήνυμα ελήφθη () για να διαχωρίσετε τα μηνύματα από το κανάλι προέλευσης.

Διεπαφή ChannelsUpdateListener

ChannelsUpdateListener πρέπει να εφαρμοστεί από οποιοδήποτε αντικείμενο που θέλει να ενημερωθεί κατά την προσθήκη ενός καναλιού.

δημόσια διεπαφή ChannelsUpdateListener {public void channelAdded (Όνομα συμβολοσειράς); } 

Τάξη Κανάλι

ο Κανάλι η τάξη εξυπηρετεί δύο σκοπούς:

  • Παρέχει μια απλή αφαίρεση ως διεπαφή στον πελάτη χρησιμοποιώντας το Bus Bus
  • Διατηρεί την παγκόσμια κατάσταση σχετικά με τα διαθέσιμα κανάλια και μεταδίδει μηνύματα από κανάλια στο ΜήνυμαBus εφαρμογή και λαμβάνει ενημερώσεις από το ΜήνυμαBus εκτέλεση

Κανάλι οι παρουσίες δημιουργούνται και αποθηκεύονται από Κανάλιο στατικός κωδικός. Οι αναφορές σε αυτές διανέμονται από Channel.subscribe () όπως ζητήθηκε από τον πελάτη. Καθε Κανάλι Το παράδειγμα είναι μοναδικό στη διαδικασία JVM.

κανάλι δημόσιας τάξης {

προστατευμένο στατικό boolean busSet = false; προστατευμένο στατικό λεωφορείο MessageBus; προστατευμένα στατικά κανάλια Hashtable = νέο Hashtable (); προστατευμένο στατικό Vector ChannelsUpdateListeners = νέο διάνυσμα ();

δημόσιο στατικό συγχρονισμένο άκυρο setMessageBus (MessageBus mb) ρίχνει το IOException {if (! busSet) {bus = mb; bus.initBroker (); busSet = true; } άλλο System.out.println ("Δεν είναι δυνατή η ρύθμιση του MessageBus περισσότερες από μία φορές ανά χρόνο εκτέλεσης!"); }

δημόσιο στατικό String getBrokerName () {return bus.getBrokerName (); }

δημόσια στατική απαρίθμηση getChannelNames () {return Channels.keys (); }

Αυτές οι μέθοδοι κατηγορίας επιτρέπουν το ΜήνυμαBus για να ορίσετε μία φορά για κάθε χρόνο εκτέλεσης και να επιστρέψετε πληροφορίες σχετικά με τα ονόματα των λεωφορείων και των καναλιών, αντίστοιχα

 δημόσια στατική συγχρονισμένη εγγραφή καναλιού (όνομα συμβολοσειράς, ChannelListener cl) ρίχνει το IOException {Channel ch; if (Channels.containsKey (Όνομα)) ch = (Channel) Channels.get (Όνομα); αλλιώς {bus.addChannel (όνομα); ch = νέο κανάλι (όνομα); Channels.put (όνομα, ch); } ch.subscribe (cl); επιστροφή ch; } 

Αυτή η μέθοδος κλάσης επιστρέφει την παρουσία καναλιού που αντιστοιχεί στο όνομα του καναλιού. Δημιουργεί το κανάλι και τις κλήσεις ΜήνυμαBus για να το προσθέσετε στο σύστημα εάν δεν υπάρχει ήδη. Μόλις δημιουργηθεί το κανάλι, ο αρχικός ακροατής του εγγράφεται σε αυτό.

// κλήθηκαν από πελάτες για εγγραφή ChannelsUpdateListener public static void subscribeChannelsUpdates (ChannelsUpdateListener cul) {ChannelsUpdateListeners.addElement (cul); }

// ζητήθηκε από πελάτες να καταργήσουν την εγγραφή ChannelsUpdateListener public static void unsubscribeChannelsUpdates (ChannelsUpdateListener cul) {saluranUpdateListeners.removeElement (cul) }