Αντιδραστικός προγραμματισμός java. Αντιδραστικός Προγραμματισμός στο Στόχο-Γ

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

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

Αυτό περιγράφεται με πιο κατανοητούς όρους στο Reactive Manifesto παρακάτω, θα επαναλάβω τις κύριες διατάξεις από αυτό και η πλήρης μετάφραση δημοσιεύεται στο Habré. Σύμφωνα με τη Wikipedia, ο όρος αντιδραστικός προγραμματισμόςυπάρχει εδώ και πολύ καιρό και έχει πρακτικές εφαρμογέςδιαφορετικών βαθμών εξωτισμού, αλλά έλαβε μια νέα ώθηση για ανάπτυξη και διανομή πολύ πρόσφατα, χάρη στις προσπάθειες των συγγραφέων του Reactive Manifesto - μιας ομάδας πρωτοβουλίας από την Typesafe Inc. Η Typesafe είναι γνωστή στην κοινότητα του λειτουργικού προγραμματισμού ως η εταιρεία που ιδρύθηκε από τους συγγραφείς της εξαιρετικής γλώσσας Scala και της επαναστατικής παράλληλης πλατφόρμας Akka. Τώρα τοποθετούν την εταιρεία τους ως τον δημιουργό της πρώτης πλατφόρμας τζετ επόμενης γενιάς στον κόσμο. Η πλατφόρμα τους σας επιτρέπει να αναπτύξετε γρήγορα σύνθετα διεπαφές χρήστηκαι παρέχει ένα νέο επίπεδο αφαίρεσης σε σχέση με τον παράλληλο υπολογισμό και το multithreading, μειώνοντας τους εγγενείς κινδύνους τους με εγγυημένη προβλέψιμη κλιμάκωση. Εφαρμόζει τις ιδέες του Reactive Manifesto και επιτρέπει στον προγραμματιστή να συλλάβει και να δημιουργήσει εφαρμογές που ανταποκρίνονται στις σύγχρονες ανάγκες.

Μπορείτε να εξοικειωθείτε με το πλαίσιο και τον αντιδραστικό προγραμματισμό παρακολουθώντας το τεράστιο ανοιχτό διαδικτυακό μάθημα Αρχές Αντιδραστικού Προγραμματισμού. Αυτό το μάθημα αποτελεί συνέχεια των Αρχών του Λειτουργικού Προγραμματισμού στο Scala του Martin Odersky, το οποίο έχει πάνω από 100.000 συμμετέχοντες και έχει ένα από τα υψηλότερα ποσοστά επιτυχίας στον κόσμο για ένα τεράστιο ανοιχτό διαδικτυακό μάθημα από τους συμμετέχοντες. Μαζί με τον δημιουργό της γλώσσας Scala, το νέο μάθημα διδάσκεται από τον Eric Meyer, ο οποίος ανέπτυξε το περιβάλλον Rx για αντιδραστικό προγραμματισμό υπό το .NET, και τον Roland Kuhn, ο οποίος επί του παρόντος ηγείται της ομάδας ανάπτυξης Akka στο Typesafe. Το μάθημα καλύπτει τα βασικά στοιχεία του αντιδραστικού προγραμματισμού και δείχνει πώς χρησιμοποιούνται για τον σχεδιασμό συστημάτων που βασίζονται σε συμβάντα που είναι επεκτάσιμα και ανεκτικά σε σφάλματα. Εικονογραφείται εκπαιδευτικό υλικό σύντομα προγράμματακαι συνοδεύεται από ένα σύνολο εργασιών, καθεμία από τις οποίες είναι ένα έργο λογισμικού. Εάν όλες οι εργασίες ολοκληρωθούν επιτυχώς, οι συμμετέχοντες λαμβάνουν πιστοποιητικά (φυσικά, τόσο η συμμετοχή όσο και τα πιστοποιητικά είναι δωρεάν). Το μάθημα διαρκεί 7 εβδομάδες και ξεκινά αυτή τη Δευτέρα 4 Νοεμβρίου. Μια λεπτομερής περιγραφή, καθώς και ένα εισαγωγικό βίντεο, είναι διαθέσιμα στη σελίδα του μαθήματος: https://www.coursera.org/course/reactive.

Για όσους ενδιαφέρονται ή αμφιβάλλουν, προσφέρω μια συνοπτική περίληψη των βασικών εννοιών του Reactive Manifesto. Οι συντάκτες του σημειώνουν σημαντικές αλλαγές στις απαιτήσεις εφαρμογής τα τελευταία χρόνια. Σήμερα, οι εφαρμογές αναπτύσσονται σε οποιοδήποτε περιβάλλον από κινητές συσκευέςσε συμπλέγματα cloud με χιλιάδες επεξεργαστές πολλαπλών πυρήνων. Αυτά τα περιβάλλοντα θέτουν νέες απαιτήσεις λογισμικόκαι τεχνολογίες. Στις αρχιτεκτονικές προηγούμενης γενιάς, η έμφαση δόθηκε στους διαχειριζόμενους διακομιστές και κοντέινερ και η κλιμάκωση επιτυγχανόταν μέσω πρόσθετου ακριβού υλικού, ιδιόκτητων λύσεων και παράλληλων υπολογιστών μέσω πολλαπλών νημάτων. Μια νέα αρχιτεκτονική εξελίσσεται τώρα, στην οποία μπορούν να εντοπιστούν τέσσερα σημαντικά χαρακτηριστικά που επικρατούν ολοένα και περισσότερο τόσο σε καταναλωτικά όσο και σε εταιρικά βιομηχανικά περιβάλλοντα. Συστήματα με τέτοια αρχιτεκτονική είναι: βασισμένα σε συμβάντα, επεκτάσιμα, ανεκτικά σε σφάλματα και έχουν γρήγορη απόκριση, δηλ. ευαίσθητος. Αυτό παρέχει μια απρόσκοπτη εμπειρία χρήστη με αίσθηση σε πραγματικό χρόνο, που υποστηρίζεται από μια αυτο-θεραπεύσιμη, κλιμακούμενη στοίβα εφαρμογών έτοιμη για ανάπτυξη σε περιβάλλοντα πολλαπλών πυρήνων και cloud. Καθένα από τα τέσσερα χαρακτηριστικά της αντιδραστικής αρχιτεκτονικής ισχύει για ολόκληρη τη στοίβα τεχνολογίας, γεγονός που τα διακρίνει από συνδέσμους σε αρχιτεκτονικές με στρώσεις. Ας τα δούμε λίγο πιο αναλυτικά.


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

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

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

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

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

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

Εβδομάδα 1: Ανασκόπηση Αρχών Λειτουργικού Προγραμματισμού: μοντέλο υποκατάστασης, εκφράσεις για και πώς σχετίζονται με τις μονάδες. Εισάγει μια νέα εφαρμογή για-εκφράσεις: γεννήτριες τυχαίων τιμών. Δείχνει πώς μπορεί να χρησιμοποιηθεί σε τυχαιοποιημένες δοκιμές και δίνει μια επισκόπηση του ScalaCheck, ενός εργαλείου που υλοποιεί αυτήν την ιδέα.

Εβδομάδα 2: Λειτουργικός προγραμματισμός και μεταβλητή κατάσταση. Τι κάνει ένα αντικείμενο μεταβλητό; Πώς αυτό επηρεάζει το μοντέλο υποκατάστασης. Εκτεταμένο παράδειγμα: Προσομοίωση ψηφιακού κυκλώματος

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

Εβδομάδα 4: Επεξεργασία αντιδραστικής ροής. Γενίκευση συμβολαίων μελλοντικής εκπλήρωσης σε αντιδραστικούς υπολογισμούς μέσω ροών. Χειριστές ροής.

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

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

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

Ο κόσμος της ανάπτυξης OOP γενικά και η γλώσσα Java ειδικότερα ζουν μια πολύ δραστήρια ζωή. Υπάρχουν τάσεις της μόδας εδώ και σήμερα θα δούμε μια από τις κύριες τάσεις της σεζόν - το πλαίσιο ReactiveX. Εάν είστε ακόμα στο φράχτη για αυτό το κύμα, υπόσχομαι ότι θα το λατρέψετε! Είναι σίγουρα καλύτερο από το ψηλόμεσο τζιν :).

Αντιδραστικός Προγραμματισμός

Μόλις οι γλώσσες OOP έφθασαν σε μαζική υιοθέτηση, οι προγραμματιστές συνειδητοποίησαν πώς μερικές φορές έλειπαν οι δυνατότητες γλωσσών που μοιάζουν με C. Δεδομένου ότι η σύνταξη κώδικα σε στυλ λειτουργικού προγραμματισμού καταστρέφει σοβαρά την ποιότητα του κώδικα OOP και επομένως τη δυνατότητα συντήρησης του έργου, εφευρέθηκε ένα υβρίδιο - αντιδραστικός προγραμματισμός.

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

Ένα καλό παράδειγμα μιας ιδέας αντιδραστικού προγραμματισμού είναι ένα υπολογιστικό φύλλο Excel. Εάν συνδέσετε πολλά κελιά με έναν τύπο, το αποτέλεσμα του υπολογισμού θα αλλάζει κάθε φορά που αλλάζουν τα δεδομένα σε αυτά τα κελιά. Για τη λογιστική, τέτοιες δυναμικές αλλαγές στα δεδομένα είναι συνηθισμένες, αλλά για τους προγραμματιστές αυτό είναι μάλλον εξαίρεση.

A=3; b=4; c=a + b; F1(c); a=1; F2(c);

Σε αυτό το παράδειγμα, οι συναρτήσεις F1 και F2 θα λειτουργούν με διαφορετικές τιμές της μεταβλητής C. Συχνά απαιτείται και οι δύο συναρτήσεις να έχουν μόνο τα πιο πρόσφατα δεδομένα - ο αντιδραστικός προγραμματισμός θα σας επιτρέψει να καλέσετε αμέσως το F1 με νέες παραμέτρους χωρίς να αλλάξετε τη λογική των ίδιων των λειτουργιών. Αυτή η δομή κώδικα δίνει στην εφαρμογή τη δυνατότητα να ανταποκρίνεται άμεσα σε οποιεσδήποτε αλλαγές, γεγονός που την καθιστά γρήγορη, ευέλικτη και ανταποκρίνεται.

ReactiveX

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

Το πλαίσιο ReactiveX είναι ένα αντιδραστικό εργαλείο προγραμματισμού που λειτουργεί με όλες τις δημοφιλείς γλώσσες OOP. Οι ίδιοι οι δημιουργοί το αποκαλούν API πολλαπλών πλατφορμών για ασύγχρονη ανάπτυξη, με βάση το μοτίβο του Observer.

Εάν ο όρος «αντιδραστικός προγραμματισμός» είναι ένα είδος θεωρητικού μοντέλου, τότε το μοτίβο «Παρατηρητής» είναι ένας έτοιμος μηχανισμός για την παρακολούθηση αλλαγών σε ένα πρόγραμμα. Και πρέπει να τα παρακολουθείτε αρκετά συχνά: λήψη και ενημέρωση δεδομένων, ειδοποιήσεις για συμβάντα και ούτω καθεξής.

Το μοτίβο του Observer υπάρχει εδώ και περίπου όσο το ίδιο το OOP. Ένα αντικείμενο του οποίου η κατάσταση μπορεί να αλλάξει ονομάζεται εκδότης (δημοφιλής μετάφραση του όρου Παρατηρήσιμο). Όλοι οι άλλοι συμμετέχοντες που ενδιαφέρονται για αυτές τις αλλαγές είναι συνδρομητές (Παρατηρητής, Συνδρομητής). Για να λαμβάνουν ειδοποιήσεις, οι συνδρομητές εγγράφονται στον εκδότη παρέχοντας ρητά την ταυτότητά τους. Ο εκδότης από καιρό σε καιρό δημιουργεί ειδοποιήσεις που αποστέλλονται στη λίστα των εγγεγραμμένων συνδρομητών.

Στην πραγματικότητα, οι δημιουργοί του ReactiveX δεν βρήκαν τίποτα επαναστατικό, απλώς εφάρμοσαν εύκολα το μοτίβο. Και παρόλο που πολλές γλώσσες OOP, και συγκεκριμένα η Java, έχουν έτοιμες υλοποιήσεις του μοτίβου, αυτό το πλαίσιο περιέχει πρόσθετο «συντονισμό» που μετατρέπει το Observer σε ένα πολύ ισχυρό εργαλείο.

RxAndroid

Η θύρα της βιβλιοθήκης ReactiveX για τον κόσμο του Android ονομάζεται rxAndroid και συνδέεται, όπως πάντα, μέσω Gradle.

Μεταγλώττιση "io.reactivex:rxandroid:1.1.0"

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

Rx.Observable myObserv = rx.Observable.create(new rx.Observable.OnSubscribe () ( @Override public void call(Subscribersubscriber) ( subscriber.onNext("Hello"); subscriber.onNext("world"); subscriber.onCompleted(); ) ));

Σε αυτήν την περίπτωση, ο εκδότης myObserv θα στείλει πρώτα τις συμβολοσειρές hello και μήνυμα και, στη συνέχεια, ένα μήνυμα επιτυχίας. Ο εκδότης μπορεί να καλέσει τις μεθόδους onNext() , onCompleted() και oneEror(), επομένως οι συνδρομητές πρέπει να τις έχουν ορίσει.

Συνδρομητής mySub = νέος Συνδρομητής () (... @Override public void onNext(Τιμή συμβολοσειράς) (Log.e("got data", " " + value);) );

Όλα είναι έτοιμα να ξεκινήσουν. Το μόνο που μένει είναι να συνδέσουμε τα αντικείμενα μεταξύ τους - και "Γεια, κόσμο!" έτοιμο για αντιδραστικό προγραμματισμό!

MyObserv.subscribe(mySub);

Πρέπει να πω ότι αυτό ήταν ένα πολύ απλό παράδειγμα. Το ReactiveX έχει πολλές επιλογές για τη συμπεριφορά όλων των συμμετεχόντων στο μοτίβο: φιλτράρισμα, ομαδοποίηση, διαχείριση σφαλμάτων. Τα οφέλη του αντιδραστικού προγραμματισμού μπορούν να γίνουν αισθητά μόνο αν το δοκιμάσετε στην πράξη. Ας προχωρήσουμε σε ένα πιο σοβαρό έργο.

Η συνέχεια είναι διαθέσιμη μόνο στα μέλη

Επιλογή 1. Εγγραφείτε στην κοινότητα "ιστότοπων" για να διαβάσετε όλο το υλικό στον ιστότοπο

Η συμμετοχή στην κοινότητα εντός της καθορισμένης περιόδου θα σας δώσει πρόσβαση σε ΟΛΟ το υλικό των Hacker, θα αυξήσει την προσωπική σας αθροιστική έκπτωση και θα σας επιτρέψει να συγκεντρώσετε μια επαγγελματική βαθμολογία Xakep Score!

Πηγαίνω.

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

Σχεδόν όλες οι γλώσσες και τα πλαίσια χρησιμοποιούν αυτήν την προσέγγιση στο οικοσύστημά τους και οι τελευταίες εκδόσεις της Java δεν αποτελούν εξαίρεση. Σε αυτό το άρθρο, θα εξηγήσω πώς μπορείτε να εφαρμόσετε αντιδραστικό προγραμματισμό χρησιμοποιώντας την πιο πρόσφατη έκδοση του JAX-RS στη λειτουργικότητα Java EE 8 και Java 8.

Αντιδραστικό Μανιφέστο

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

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

Ο αντιδραστικός προγραμματισμός άρχισε να υιοθετείται σε Java 8 και Java EE 8. Η γλώσσα Java εισήγαγε έννοιες όπως το CompletionStage και την εφαρμογή του CompletableFuture και η Java άρχισε να χρησιμοποιεί αυτές τις δυνατότητες σε προδιαγραφές όπως το Reactive Client API στο JAX-RS.

JAX-RS 2.1 Reactive Client API

Ας δούμε πώς μπορεί να χρησιμοποιηθεί ο αντιδραστικός προγραμματισμός σε εφαρμογές Java EE 8 Για να κατανοήσετε τη διαδικασία, χρειάζεστε βασικές γνώσεις για το Java EE API.

Το JAX-RS 2.1 εισήγαγε έναν νέο τρόπο δημιουργίας πελάτη REST με υποστήριξη για αντιδραστικό προγραμματισμό. Η προεπιλεγμένη εφαρμογή invoker που προσφέρεται στο JAX-RS είναι σύγχρονη, πράγμα που σημαίνει ότι ο πελάτης που δημιουργείται θα στείλει μια κλήση αποκλεισμού στο τελικό σημείο του διακομιστή. Ένα παράδειγμα υλοποίησης παρουσιάζεται στη Λίστα 1.

Response response = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .get();
Από την έκδοση 2.0, το JAX-RS παρέχει υποστήριξη για τη δημιουργία ενός ασύγχρονου invoker στο API πελάτη με μια απλή κλήση στη μέθοδο async(), όπως φαίνεται στη Λίστα 2.

Μελλοντικός answer = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .async() .get();
Η χρήση ενός ασύγχρονου invoker στον πελάτη επιστρέφει μια μελλοντική παρουσία τύπου javax.ws.rs.core.Response. Αυτό θα μπορούσε να οδηγήσει σε δημοσκόπηση για απάντηση, κλήση του future.get() ή εγγραφή μιας επιστροφής κλήσης που θα καλείται όταν υπάρχει διαθέσιμη απόκριση HTTP. Και οι δύο υλοποιήσεις είναι κατάλληλες για ασύγχρονο προγραμματισμό, αλλά τα πράγματα τείνουν να γίνονται πιο περίπλοκα εάν θέλετε να ομαδοποιήσετε τις επιστροφές κλήσης ή να προσθέσετε περιπτώσεις υπό όρους σε αυτά τα ελάχιστα ασύγχρονης εκτέλεσης.

Το JAX-RS 2.1 παρέχει έναν αντιδραστικό τρόπο για να ξεπεραστούν αυτά τα προβλήματα με το νέο JAX-RS Reactive Client API για συναρμολόγηση πελάτη. Είναι τόσο απλό όσο η κλήση της μεθόδου rx() κατά την κατασκευή του προγράμματος-πελάτη. Στη λίστα 3, η μέθοδος rx() επιστρέφει έναν αντιδραστικό invoker που υπάρχει ενώ ο πελάτης εκτελείται και ο πελάτης επιστρέφει μια απόκριση με τύπο CompletionStage.rx() , που επιτρέπει τη μετάβαση από έναν σύγχρονο επικαλεστή σε έναν ασύγχρονο με έναν απλό κλήση.

Στάδιο Ολοκλήρωσης answer = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .rx() .get();
Στάδιο Ολοκλήρωσης<Т>είναι μια νέα διεπαφή που εισήχθη στην Java 8. Αντιπροσωπεύει έναν υπολογισμό που μπορεί να είναι ένα βήμα σε έναν μεγαλύτερο υπολογισμό, όπως υποδηλώνει το όνομα. Αυτός είναι ο μόνος εκπρόσωπος της αντιδραστικότητας Java 8 που το έκανε JAX-RS.
Αφού λάβω την παρουσία απόκρισης, μπορώ να καλέσω την AcceptAsync() όπου μπορώ να παράσχω ένα κομμάτι κώδικα που θα εκτελεστεί ασύγχρονα όταν η απάντηση γίνει διαθέσιμη, όπως φαίνεται στην Λίστα 4.

Response.thenAcceptAsync(res -> ( Θερμοκρασία t = res.readEntity(Temperature.class); //κάνω πράγματα με t ));
Προσθήκη αντιδραστικότητας σε τελικό σημείο REST

Η αντιδραστική προσέγγιση δεν περιορίζεται στην πλευρά του πελάτη στο JAX-RS. μπορεί να χρησιμοποιηθεί και από την πλευρά του διακομιστή. Για παράδειγμα, θα δημιουργήσω πρώτα ένα απλό σενάριο όπου μπορώ να ζητήσω μια λίστα τοποθεσιών για έναν μόνο προορισμό. Για κάθε θέση θα κάνω ξεχωριστή κλήση με τα δεδομένα τοποθεσίας σε διαφορετικό σημείο για να πάρω τις τιμές θερμοκρασίας. Η αλληλεπίδραση των προορισμών θα είναι όπως φαίνεται στο σχήμα 1.

Εικόνα 1. Αλληλεπίδραση μεταξύ προορισμών

Πρώτα ορίζω απλώς το μοντέλο εμβέλειας και μετά τις υπηρεσίες για κάθε μοντέλο. Η λίστα 5 δείχνει πώς ορίζεται μια κλάση Forecast, η οποία αναδιπλώνει τις κατηγορίες Location και Temperature.

Δημόσια κλάση Θερμοκρασία ( ιδιωτική Διπλή θερμοκρασία; ιδιωτική κλίμακα συμβολοσειράς; // λήπτες & ρυθμιστές ) δημόσια τάξη Τοποθεσία ( Όνομα συμβολοσειράς; δημόσια Τοποθεσία() () δημόσια Τοποθεσία (Όνομα συμβολοσειράς) ( αυτό.όνομα = όνομα; ) // λήπτες & ρυθμιστές ) δημόσια κλάση Πρόγνωση ( ιδιωτική τοποθεσία Τοποθεσία; ιδιωτική Θερμοκρασία θερμοκρασίας; δημόσια Πρόβλεψη (Τοποθεσία τοποθεσίας) ( this.location = τοποθεσία; ) δημόσια Πρόβλεψη setTemperature (τελική θερμοκρασία θερμοκρασίας) ( this.temperature = θερμοκρασία; επιστροφή αυτής; ) // getters )
Για την αναδίπλωση της λίστας προβλέψεων, η κλάση ServiceResponse υλοποιείται στη Λίστα 6.

Public class ServiceResponse ( private long processingTime; private List προβλέψεις = νέα ArrayList<>() δημόσιο κενό setProcessingTime(long processingTime) ( this.processingTime = processingTime; ) public ServiceResponse forecasts(List προβλέψεις) ( this.forecasts = προβλέψεις; επιστρέψτε αυτό; ) // getters )
Το LocationResource που εμφανίζεται στη Λίστα 7 ορίζει τρία δείγματα τοποθεσιών που επιστρέφονται με τη διαδρομή /location.

@Path("/location") δημόσια κλάση LocationResource ( @GET @Produces(MediaType.APPLICATION_JSON) δημόσια απάντηση getLocations() ( Λίστα τοποθεσίες = νέα ArrayList<>() locations.add(new Location("London")); locations.add(new Location("Istanbul")); locations.add(new Location("Prague")); return Response.ok(new GenericEntity >(τοποθεσίες)()).build(); ) )
Το TemperatureResource, που εμφανίζεται στη Λίστα 8, επιστρέφει μια τυχαία παραγόμενη τιμή θερμοκρασίας μεταξύ 30 και 50 για μια δεδομένη τοποθεσία. Μια καθυστέρηση 500 ms προστέθηκε στην υλοποίηση για την προσομοίωση της ανάγνωσης του αισθητήρα.

@Path("/temperature") δημόσια τάξη TemperatureResource ( @GET @Path("/(city)") @Produces(MediaType.APPLICATION_JSON) δημόσια απόκριση getAverageTemperature(@PathParam("city") String cityName) ( Θερμοκρασία = νέο Temperature(); temperature.setTemperature(double) (new Random().nextInt(20) + 30)); ( ignored.printStackTrace(); ) return Response.ok(temperature).build() ) )
Πρώτα θα δείξω μια υλοποίηση ενός σύγχρονου ForecastResource (βλ. Λίστα 9) που επιστρέφει όλες τις τοποθεσίες. Στη συνέχεια, για κάθε θέση, καλεί την υπηρεσία θερμοκρασίας για να πάρει τις τιμές σε βαθμούς Κελσίου.

@Path("/forecast") δημόσια κλάση ForecastResource ( @Uri("location") private WebTarget locationTarget; @Uri("temperature/(city)") private WebTarget temperatureTarget; @GET @Produces(MediaType.APPLICATION_JSON) δημόσια απόκριση getLocationsWithT () ( long startTime = System.currentTimeMillis(); ServiceResponse response = new ServiceResponse(); Λίστα locations = locationTarget .request() .get(new GenericType >()()); locations.forEach(location -> ( Θερμοκρασία θερμοκρασίας = temperatureTarget .resolveTemplate("city", location.getName()) .request() .get(Temperature.class); answer.getForecasts().add(new Forecast(location) .setTemperature(temperature)); long endTime = System.currentTimeMillis(); answer.setProcessingTime(endTime - startTime); επιστροφή Response.ok(response).build(); ) )
Όταν ερωτάται ένας προορισμός πρόβλεψης ως /forecast , θα λάβετε έξοδο παρόμοια με αυτή στη Λίστα 10. Λάβετε υπόψη ότι ο χρόνος επεξεργασίας του ερωτήματος χρειάστηκε 1,533 ms, κάτι που είναι λογικό, δεδομένου ότι η αναζήτηση τιμών θερμοκρασίας σύγχρονα από τρεις διαφορετικές τοποθεσίες ανέρχεται σε 1,5 Κυρία.

( "forecasts": [ ( "location": ( "name": "London"), "temperature": ( "scale": "Celsius", "temperature": 33 ) ), ( "location": ( "name ": "Κωνσταντινούπολη" ), "θερμοκρασία": ( "κλίμακα": "Κελσίου", "θερμοκρασία": 38 ) ), ( "τοποθεσία": ( "όνομα": "Πράγα" ), "θερμοκρασία": ( "κλίμακα" ": "Celsius", "θερμοκρασία": 46 ) ) ], "processingTime": 1533 )
Μέχρι στιγμής όλα πάνε σύμφωνα με το σχέδιο. Ήρθε η ώρα να εισαγάγουμε τον αντιδραστικό προγραμματισμό στην πλευρά του διακομιστή, όπου οι κλήσεις προς κάθε τοποθεσία μπορούν να πραγματοποιούνται παράλληλα μετά την ανάκτηση όλων των τοποθεσιών. Αυτό μπορεί σαφώς να βελτιώσει τη σύγχρονη ροή που παρουσιάστηκε νωρίτερα. Αυτό γίνεται στη Λίστα 11, η οποία δείχνει τον ορισμό μιας αντιδραστικής έκδοσης της υπηρεσίας πρόβλεψης.

@Path("/reactiveForecast") δημόσια κλάση ForecastReactiveResource ( @Uri("location") private WebTarget locationTarget; @Uri("temperature/(city)") private WebTarget temperatureTarget; @GET @Produces(MediaType.APPLICATION_JSON) public void getLoc (@Suspended final AsyncResponse async) ( long startTime = System.currentTimeMillis(); // Δημιουργία σταδίου για ανάκτηση τοποθεσιών CompletionStage > locationCS = locationTarget.request() .rx() .get(new GenericType >() ()); // Δημιουργώντας ένα ξεχωριστό στάδιο στο στάδιο τοποθεσιών // που περιγράφεται παραπάνω, συλλέξτε μια λίστα προβλέψεων // όπως σε ένα μεγάλο τελικό στάδιο CompletionStage CompletionStage > forecastCS = locationCS.thenCompose(locations -> ( // Δημιουργήστε ένα στάδιο για λήψη προβλέψεων // ως CompletionStage List > forecastList = // Μεταδώστε τοποθεσίες ροής και επεξεργαστείτε κάθε // από αυτές χωριστά locations.stream().map(location -> ( // Δημιουργήστε ένα στάδιο για να λάβετε // τιμές θερμοκρασίας μόνο για μία πόλη // με το όνομά της τελικό Στάδιο Ολοκλήρωσης tempCS = temperatureTarget .resolveTemplate("city", location.getName()) .request() .rx() .get(Temperature.class); // Στη συνέχεια δημιουργήστε ένα CompletableFuture που // περιέχει μια παρουσία πρόβλεψης // με θέση και τιμή θερμοκρασίας που επιστρέφει CompletableFuture.completedFuture(new Forecast(location)) .thenCombine(tempCS, Forecast::setTemperature); )).collect(Collectors.toList()); // Επιστρέψτε την τελική παρουσία CompletableFuture, // όπου όλα τα παρουσιαζόμενα ολοκληρωμένα μελλοντικά αντικείμενα // ολοκληρώνονται επιστρέφουν CompletableFuture.allOf(forecastList.toArray(new CompletableFuture)) .thenApply(v -> forecastList.stream() .map(CompletionStage: toCompletableFuture) .map(CompletableFuture::join) .collect(Collectors.toList())); )); // Δημιουργήστε μια παρουσία ServiceResponse που // περιέχει την πλήρη λίστα προβλέψεων // μαζί με τους χρόνους επεξεργασίας. // Δημιουργήστε το μέλλον του και συνδυάστε το με το // forecastCS για να λάβετε προβλέψεις // και εισαγάγετε το στην απόκριση υπηρεσίας CompletableFuture.completedFuture(new ServiceResponse()) .thenCombine(forecastCS, ServiceResponse::forecasts) .whenCompleteAsync((response), ) - > ( answer.setProcessingTime(System.currentTimeMillis() - startTime); async.resume(response); )); ) )
Η reactive υλοποίηση μπορεί να φαίνεται περίπλοκη με την πρώτη ματιά, αλλά μετά από μια πιο προσεκτική ματιά θα παρατηρήσετε ότι είναι αρκετά απλή. Στην υλοποίηση ForecastReactiveResource, δημιουργώ πρώτα μια κλήση πελάτη στις υπηρεσίες τοποθεσίας χρησιμοποιώντας το JAX-RS Reactive Client API. Όπως ανέφερα παραπάνω, αυτό είναι ένα πρόσθετο για Java EE 8 και σας βοηθά να δημιουργήσετε μια αντιδραστική κλήση απλά χρησιμοποιώντας τη μέθοδο rx().

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

Τώρα, ας συλλέξουμε προβλέψεις με τη μορφή μιας λίστας σταδίων ολοκλήρωσης που ορίζονται στη μεταβλητή forecastList. Για να δημιουργήσω ένα στάδιο ολοκλήρωσης για κάθε πρόβλεψη, περνάω τα δεδομένα τοποθεσίας και μετά δημιουργώ μια μεταβλητή tempCS, χρησιμοποιώντας ξανά το JAX-RS Reactive Client API, το οποίο καλεί την υπηρεσία θερμοκρασίας με το όνομα της πόλης. Εδώ χρησιμοποιώ τη μέθοδο solveTemplate() για τη δημιουργία του προγράμματος-πελάτη και αυτό μου επιτρέπει να μεταβιβάσω το όνομα της πόλης στο πρόγραμμα δημιουργίας ως παράμετρο.

Ως τελευταίο βήμα ροής, πραγματοποιώ μια κλήση στο CompletableFuture.completedFuture() , περνώντας το νέο παράδειγμα Forecast ως παράμετρο. Συνδυάζω αυτό το μέλλον με ένα στάδιο tempCS ώστε να έχω μια τιμή θερμοκρασίας για τις επαναλαμβανόμενες τοποθεσίες.

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

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

Φυσικά, ο αντιδραστικός προγραμματισμός αναγκάζει μόνο την πλευρά του διακομιστή να εκτελεί ασύγχρονα. η πλευρά του πελάτη θα αποκλειστεί έως ότου ο διακομιστής στείλει μια απάντηση στον αιτούντα. Για να ξεπεραστεί αυτό το πρόβλημα, τα Συμβάντα αποστολής διακομιστή (SSEs) μπορούν να χρησιμοποιηθούν για την αποστολή μερικής απόκρισης μόλις είναι διαθέσιμη, έτσι ώστε οι τιμές θερμοκρασίας για κάθε τοποθεσία να αποστέλλονται στον πελάτη μία προς μία. Η έξοδος του ForecastReactiveResource θα είναι παρόμοια με αυτή που εμφανίζεται στη Λίστα 12. Όπως φαίνεται στην έξοδο, ο χρόνος επεξεργασίας είναι 515 ms, που είναι ο ιδανικός χρόνος εκτέλεσης για την ανάκτηση τιμών θερμοκρασίας από μία μόνο τοποθεσία.

( "forecasts": [ ( "location": ( "name": "London"), "temperature": ( "scale": "Celsius", "temperature": 49 ) ), ( "location": ( "name ": "Κωνσταντινούπολη" ), "θερμοκρασία": ( "κλίμακα": "Κελσίου", "θερμοκρασία": 32 ) ), ( "τοποθεσία": ( "όνομα": "Πράγα" ), "θερμοκρασία": ( "κλίμακα" ": "Κελσίου", "θερμοκρασία": 45 ) ) ], "Χρόνος επεξεργασίας": 515 )
συμπέρασμα

Στα παραδείγματα αυτού του άρθρου, έδειξα αρχικά έναν σύγχρονο τρόπο λήψης προβλέψεων χρησιμοποιώντας υπηρεσίες τοποθεσίας και θερμοκρασίας. Στη συνέχεια, πέρασα σε μια αντιδραστική προσέγγιση για να επιτρέψω την ασύγχρονη επεξεργασία μεταξύ των κλήσεων υπηρεσίας. Όταν χρησιμοποιείτε το JAX-RS Reactive Client API σε Java EE 8 μαζί με τις κλάσεις CompletionStage και CompletableFuture που είναι διαθέσιμες στην Java 8, η δύναμη της ασύγχρονης επεξεργασίας απελευθερώνεται μέσω του αντιδραστικού προγραμματισμού.

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

Σας ευχαριστώ για την προσοχή σας. Όπως πάντα, χαιρετίζουμε τα σχόλια και τις ερωτήσεις σας.

Μπορείτε να βοηθήσετε και να μεταφέρετε κάποια χρήματα για την ανάπτυξη του ιστότοπου

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

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

Αυτό το άρθρο πρέπει να έχει Wikified. Μορφοποιήστε το σύμφωνα με τους κανόνες μορφοποίησης του άρθρου. Αυτός ο όρος έχει άλλες έννοιες, βλέπε Elektromash (έννοιες) ... Wikipedia

ξένες ψυχοθεραπευτικές τεχνικές- ΤΕΧΝΙΚΕΣ ΒΑΘΟΥΣ Ενεργητική ψυχοθεραπεία (Από τον Reichmann). Ανάλυση του Είναι (Binswanger). Ανάλυση της μοίρας (Sondi). Ανάλυση χαρακτήρων (W. Reich). Self Analysis (H. Kohut, E. Erikson). Αναλυτική παιγνιοθεραπεία (M. Klein). Αναλυτική Οικογενειακή Θεραπεία (Richter).... ... Μεγάλη ψυχολογική εγκυκλοπαίδεια

Βιβλία

  • Αντιδραστικός προγραμματισμός σε C++. Σχεδιασμός παράλληλων και ασύγχρονων εφαρμογών με χρήση , Pai Prasidh, Abraham Peter. Σχεδιασμός παράλληλων και ασύγχρονων εφαρμογών με χρήση της βιβλιοθήκης RxCpp και σύγχρονων εργαλείων προγραμματισμού παράλληλου προγραμματισμού C++17 που υποστηρίζονται από το γλωσσικό πρότυπο Collaborative…
  • , Nurkiewicz T., Christensen B.. Στις μέρες μας, που τα προγράμματα είναι ασύγχρονα και η γρήγορη απόκριση είναι η πιο σημαντική ιδιότητα, ο αντιδραστικός προγραμματισμός θα σας βοηθήσει να γράψετε πιο αξιόπιστο, καλύτερα επεκτάσιμο και ταχύτερο εκτελούμενο κώδικα.…
  • Αντιδραστικός προγραμματισμός με χρήση RxJava, Nurkiewicz Tomasz, Christensen Ben. Σε μια εποχή όπου τα προγράμματα είναι ασύγχρονα και η ανταπόκριση είναι πρωταρχικής σημασίας, ο αντιδραστικός προγραμματισμός μπορεί να σας βοηθήσει να γράψετε πιο αξιόπιστο, καλύτερα επεκτάσιμο και ταχύτερο εκτελούμενο κώδικα.…

Οι αρχές του αντιδραστικού προγραμματισμού δεν είναι καινούριες και μπορούν να εντοπιστούν στις δεκαετίες του '70 και του '80 στο θεμελιώδες έργο των Jim Gray και Pat Helland για το σύστημα tandem.

Αυτοί οι άνθρωποι ήταν πολύ μπροστά από την εποχή τους. Μόνο τα τελευταία 5-10 χρόνια η τεχνολογική βιομηχανία αναγκάστηκε να επανεξετάσει τις υπάρχουσες «βέλτιστες πρακτικές» για την ανάπτυξη επιχειρηματικών συστημάτων. Έμαθε να εφαρμόζει τη γνώση των αντιδραστικών αρχών του σημερινού κόσμου πολυπύρηνων και υπολογιστικού νέφους.

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

Βασικές αρχές αντιδραστικού προγραμματισμού

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

Κύριες λειτουργίες των εξαρτημάτων:

  1. Τα παρατηρήσιμα δεν είναι τίποτα άλλο από ροές δεδομένων. Ένα παρατηρήσιμο πακέτο δεδομένων που μπορούν να περάσουν από το ένα νήμα στο άλλο. Ουσιαστικά εκπέμπουν δεδομένα περιοδικά ή μόνο μία φορά στον κύκλο ζωής τους με βάση τις διαμορφώσεις. Υπάρχουν διάφοροι χειριστές που μπορούν να βοηθήσουν τον παρατηρητή να στείλει ορισμένα συγκεκριμένα δεδομένα με βάση ορισμένα γεγονότα.
  2. Οι παρατηρητές καταναλώνουν τη ροή δεδομένων που εκπέμπεται από το παρατηρούμενο. Οι παρατηρητές εγγράφονται χρησιμοποιώντας τη μέθοδο αντιδραστικού προγραμματισμού subscribeOn() για να λαμβάνουν δεδομένα που διαβιβάζονται στα παρατηρήσιμα στοιχεία. Κάθε φορά που ένα παρατηρήσιμο υποβάλλει δεδομένα, όλοι οι εγγεγραμμένοι παρατηρητές λαμβάνουν τα δεδομένα στην επανάκληση onNext(). Εδώ μπορούν να εκτελέσουν διάφορες λειτουργίες, όπως ανάλυση μιας απάντησης JSON ή ενημέρωση της διεπαφής χρήστη. Εάν υπάρχει σφάλμα που προκαλείται από το παρατηρήσιμο, ο παρατηρητής θα το λάβει στο oneError().
  3. Οι προγραμματιστές (χρονοδιάγραμμα) είναι ένα στοιχείο στο Rx που λέει στα παρατηρήσιμα και στους παρατηρητές ποιο νήμα πρέπει να δουλέψουν. Μπορείτε να χρησιμοποιήσετε τη μέθοδο observOn() για να πείτε στους παρατηρητές ποιο νήμα πρέπει να παρατηρήσουν. Επιπλέον, μπορείτε να χρησιμοποιήσετε το schedOn() για να πείτε στο παρατηρήσιμο σε ποιο νήμα πρέπει να τρέχουν.

Ο αντιδραστικός προγραμματισμός με χρήση RxJava παρέχει προεπιλεγμένα νήματα πυρήνα όπως το Schedulers.newThread() θα δημιουργήσει ένα νέο φόντο. Το Schedulers.io() θα εκτελέσει τον κώδικα στο νήμα I/O.

Τα κύρια πλεονεκτήματα του Rx είναι η αυξημένη χρήση υπολογιστών σε υλικό πολλαπλών πυρήνων και πολυεπεξεργαστών, βελτιωμένη απόδοση με μείωση πόντων και βελτιωμένη απόδοση με μείωση σημείων σειριοποίησης σύμφωνα με τον νόμο του Amdahl και τον νόμο γενικής επεκτασιμότητας του Gunter.

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

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

Έτσι, τα κύρια πλεονεκτήματα του συστήματος είναι:

  1. Αυξημένη παραγωγικότητα - χάρη στην ικανότητα γρήγορης και συνεπούς επεξεργασίας τεράστιου όγκου δεδομένων.
  2. Βελτιωμένο UX - λόγω της μεγαλύτερης απόκρισης της εφαρμογής στον χρήστη.
  3. Απλοποιημένες τροποποιήσεις και ενημερώσεις - χάρη στον πιο ευανάγνωστο και πιο εύκολο στην πρόβλεψη κώδικα.

Όμως, παρόλο που ο Reactive Programming είναι πολύ χρήσιμος στη δημιουργία σύγχρονου λογισμικού, για να σκεφτείτε το σύστημα σε υψηλότερο επίπεδο, πρέπει να χρησιμοποιήσετε ένα άλλο εργαλείο - την Reactive Architecture για τη διαδικασία σχεδιασμού αντιδραστικού συστήματος. Επίσης, είναι σημαντικό να θυμάστε ότι υπάρχουν πολλά παραδείγματα προγραμματισμού και το Rx είναι μόνο ένα από αυτά, όπως κάθε εργαλείο, δεν έχει σχεδιαστεί για όλες τις περιπτώσεις χρήσης.

Σταθερότητα αντιδρώντων συστημάτων

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

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

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

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

Τα αντιδραστικά συστήματα αντιπροσωπεύουν την αρχιτεκτονική συστήματος υψηλότερης απόδοσης, στο πλαίσιο αρχιτεκτονικών πολλαπλών πυρήνων, cloud και φορητών συσκευών:

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

Οι εφαρμογές Ιστού μπορούν να επωφεληθούν πολύ από το στυλ ανάπτυξης Rx, το οποίο επιτρέπει τη σύνθεση ροών εργασίας αιτήματος-απόκρισης που περιλαμβάνουν διακλάδωση σε κλήσεις υπηρεσίας, ασύγχρονη ανάκτηση πόρων και σύνταξη απαντήσεων και, στη συνέχεια, ταξινόμηση τους στον πελάτη. Πιο πρόσφατα, τα συμβάντα push-to-server και οι δικτυακές υποδοχές χρησιμοποιούνται όλο και περισσότερο στην πράξη, και για να γίνει αυτό σε κλίμακα απαιτείται ένας αποτελεσματικός τρόπος αποθήκευσης πολλών ανοιχτών συνδέσεων και όπου το IO δεν εμποδίζει.

Υπάρχουν εργαλεία για αυτό, όπως τα Streams και τα Futures, που διευκολύνουν τους μη αποκλεισμούς και τους ασύγχρονους μετασχηματισμούς και τους ωθούν στους πελάτες. Αντιδραστικός προγραμματισμός με επίπεδο πρόσβασης δεδομένων - ενημερώσεις και ερωτήματα δεδομένων σε αποτελεσματικό πόρο, κατά προτίμηση χρησιμοποιώντας βάσεις δεδομένων SQL ή NoSQL με ασύγχρονα προγράμματα οδήγησης.

Οι εφαρμογές Ιστού επωφελούνται επίσης από την ανάπτυξη ενός αντιδραστικού συστήματος για πράγματα όπως η κατανεμημένη προσωρινή αποθήκευση, η συνέπεια δεδομένων και οι ειδοποιήσεις πολλών κόμβων. Οι παραδοσιακές διαδικτυακές εφαρμογές χρησιμοποιούν συνήθως μόνιμους κόμβους. Αλλά μόλις οι προγραμματιστές αρχίσουν να χρησιμοποιούν τα Server-Sent-Events (SSE) και τα WebSockets, αυτοί οι κόμβοι γίνονται λειτουργικοί επειδή, τουλάχιστον, διατηρούν την κατάσταση σύνδεσης πελάτη και οι ειδοποιήσεις push δρομολογούνται σε αυτούς ανάλογα. Αυτό απαιτεί την ανάπτυξη ενός αντιδραστικού συστήματος, καθώς αυτός είναι ένας τομέας όπου η απεύθυνση στους παραλήπτες μέσω μηνυμάτων είναι σημαντική.

Η ουσία του αντιδραστικού προγραμματισμού Java

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

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

Στην Java, έναν εκπρόσωπο παλαιότερου αντικειμενοστρεφούς προγραμματισμού, ο ασύγχρονος μπορεί να γίνει πολύ περίπλοκος και να κάνει τον κώδικα δύσκολο να κατανοηθεί και να διατηρηθεί. Έτσι, το Rx είναι ιδιαίτερα χρήσιμο για αυτό το «καθαρά» αντικειμενοστραφή περιβάλλον επειδή διευκολύνει την εργασία με ασύγχρονα νήματα.

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

Σε μια τυπική εφαρμογή, είναι σύνηθες να εκτελούνται επανειλημμένα ορισμένες λειτουργίες αντιδραστικού προγραμματισμού χρησιμοποιώντας RxJava, επομένως πρέπει να συγκρίνετε την ταχύτητα, τη χρήση της CPU και της μνήμης με τις ίδιες λειτουργίες που εφαρμόστηκαν και με τις κορουτίνες Kotlin και RxJava. Αυτό είναι ένα αρχικό τεστ απόδοσης.

Κάθε φορά που εισάγεται ένα νέο εργαλείο που θα χρησιμοποιηθεί εκτενώς σε ολόκληρο τον κώδικα, είναι σημαντικό να κατανοήσουμε εάν θα επηρεάσει τη συνολική απόδοση της εφαρμογής προτού αποφασίσετε εάν έχει νόημα να το χρησιμοποιήσετε. Στην πράξη, η σύντομη απάντηση είναι ότι στις περισσότερες περιπτώσεις, οι χρήστες θα πρέπει να εξετάσουν το ενδεχόμενο αντικατάστασης του RxJava με κορουτίνες Kotlin, ειδικά στο Android.

Ο αντιδραστικός προγραμματισμός με χρήση RxJava μπορεί ακόμα να χρησιμοποιηθεί σε περιορισμένο αριθμό περιπτώσεων και σε αυτές τις περιπτώσεις είναι δυνατός ο συνδυασμός RxJava και κορουτίνες.

Απλοί λόγοι:

  1. Παρέχει πολύ μεγαλύτερη ευελιξία από το κανονικό Rx.
  2. Παρέχει ένα πλούσιο σύνολο τελεστών σε συλλογές που θα έχουν την ίδια εμφάνιση με τους τελεστές RxJava.
  3. Ο αντιδραστικός προγραμματισμός Kotlin μπορεί να διαλειτουργήσει όπως απαιτείται χρησιμοποιώντας το rxjava.
  4. Είναι πολύ ελαφριά και αποτελεσματικά δεδομένης της υψηλότερης χρήσης CPU για τη συλλογή σκουπιδιών όλων των αντικειμένων που δημιουργούνται από την RxJava.

Αντιδραστικές επεκτάσεις

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

Οι αντιδραστικές επεκτάσεις είναι διαθέσιμες σε πολλές γλώσσες. Οι προγραμματιστές ενδιαφέρονται ιδιαίτερα για το RxJava και το RxAndroid, καθώς το Android είναι η πιο εστιασμένη περιοχή.

Ο Reactive Programming με χρήση RxJava είναι μια υλοποίηση της Java Reactive Extension από το Netflix. Βασικά είναι μια βιβλιοθήκη που συνθέτει ασύγχρονα συμβάντα ακολουθώντας ένα μοτίβο παρατηρητή.

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

Multithreading σε εφαρμογές Android

Android" class="if uuid-2938324" src="/misc/i/gallery/73564/2938324.jpg" />

Ο Αντιδραστικός Προγραμματισμός Android (RxAndroid) είναι συγκεκριμένος για την πλατφόρμα Android με μερικές πρόσθετες κλάσεις πάνω από το RxJava. Πιο συγκεκριμένα, οι προγραμματιστές εισάγονται στο RxAndroid (AndroidSchedulers.mainThread()), το οποίο παίζει σημαντικό ρόλο στην υποστήριξη της έννοιας του multithreading σε εφαρμογές Android.

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

Ακολουθεί μια λίστα με τους προγραμματιστές και το σύντομο περιεχόμενό τους:

  1. Schedulers.io() - Χρησιμοποιείται για την εκτέλεση μη εντατικών λειτουργιών, όπως κλήσεις δικτύου, αναγνώσεις δίσκου/αρχείων, λειτουργίες βάσης δεδομένων και υποστηρίζει μια ομάδα νημάτων.
  2. AndroidSchedulers.mainThread() - Παρέχει πρόσβαση στο κύριο θέμα Thread/UI. Συνήθως, λειτουργίες όπως η ενημέρωση της διεπαφής χρήστη, η αλληλεπίδραση με τον χρήστη εμφανίζονται σε αυτό το νήμα. Οι ειδικοί συμβουλεύουν τους χρήστες ότι δεν πρέπει να εκτελούν εντατικές λειτουργίες σε αυτό το νήμα, καθώς μπορεί να προκληθεί διακοπή λειτουργίας της εφαρμογής ή ένα παράθυρο διαλόγου ANR.
  3. Schedulers.newThread() - Χρησιμοποιώντας αυτό, ένα νέο νήμα θα δημιουργείται κάθε φορά που προγραμματίζεται μια εργασία. Γενικά προτείνεται να μην χρησιμοποιείτε πρόγραμμα για πολύ μεγάλες δουλειές. Τα νήματα που δημιουργούνται με τη χρήση newThread() δεν θα επαναχρησιμοποιηθούν.
  4. Schedulers.computation() - Αυτό το χρονοδιάγραμμα μπορεί να χρησιμοποιηθεί για λειτουργίες έντασης CPU, τεράστια επεξεργασία δεδομένων του Reactive Programming Center, επεξεργασία bitmap. Ο αριθμός των νημάτων που δημιουργούνται χρησιμοποιώντας αυτόν τον προγραμματιστή εξαρτάται εξ ολοκλήρου από τον αριθμό των διαθέσιμων πυρήνων της CPU.
  5. Schedulers.single() - Αυτός ο προγραμματιστής θα εκτελέσει όλες τις εργασίες με την ακόλουθη σειρά, η οποία μπορεί να χρησιμοποιηθεί όταν απαιτείται διαδοχική εκτέλεση.
  6. Schedulers.immediate() - Αυτός ο χρονοπρογραμματιστής εκτελεί την εργασία αμέσως μπλοκάροντας συγχρονισμένα το κύριο νήμα.
  7. Schedulers.trampoline() - Εκτελεί εργασίες σε λειτουργία First In-First Out. Όλες οι προγραμματισμένες εργασίες θα εκτελούνται η μία μετά την άλλη, περιορίζοντας τον αριθμό των νημάτων φόντου σε ένα.
  8. Schedulers.from() - σας επιτρέπει να δημιουργήσετε έναν προγραμματιστή από έναν εκτελεστή, περιορίζοντας τον αριθμό των νημάτων που δημιουργούνται. Όταν η ομάδα νημάτων είναι απασχολημένη, οι εργασίες θα μπουν στην ουρά.

Τώρα που έχετε καλές θεωρητικές γνώσεις σχετικά με το RxJava και το RxAndroid, μπορείτε να προχωρήσετε σε μερικά παραδείγματα κώδικα για να κατανοήσετε καλύτερα την έννοια. Για να ξεκινήσετε, πρέπει να προσθέσετε τις εξαρτήσεις RxJava και RxAndroid στα έργα build.gradle και να συγχρονίσετε το έργο.

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

Το Observer είναι εγγεγραμμένο στο Observable ώστε να μπορεί να αρχίσει να λαμβάνει δεδομένα χρησιμοποιώντας δύο μεθόδους:

  1. SubscribeOn(Schedulers.io()) - Λέει στο Observable να εκτελέσει την εργασία σε ένα νήμα φόντου.
  2. ObservOn(AndroidSchedulers.mainThread()) - Λέει στον Observer να λαμβάνει δεδομένα στο νήμα του Android UI.

Αυτό ήταν, με αυτόν τον τρόπο ένας προγραμματιστής μπορεί να γράψει το πρώτο του πρόγραμμα αντιδραστικού προγραμματισμού με RxJava.

Οι επιχειρήσεις και οι πάροχοι ενδιάμεσου λογισμικού άρχισαν να χρησιμοποιούν το Reactive και το 2016 - 2018 παρατηρήθηκε τεράστια αύξηση στο εταιρικό ενδιαφέρον για την υιοθέτηση αυτού του παραδείγματος.

Το Rx προσφέρει παραγωγικότητα προγραμματιστή μέσω αποδοτικότητας πόρων σε επίπεδο στοιχείου για εσωτερική λογική και μετασχηματισμό ροής δεδομένων, ενώ τα αντιδραστικά συστήματα προσφέρουν παραγωγικότητα αρχιτέκτονα και DevOps μέσω ανθεκτικότητας και ελαστικότητας σε επίπεδο συστήματος. Χρησιμοποιούνται για τη δημιουργία "Cloud Native" και άλλων μεγάλης κλίμακας κατανεμημένων συστημάτων. Στην πράξη, τα βιβλία σχετικά με τον αντιδραστικό προγραμματισμό Java χρησιμοποιούνται επίσης ευρέως με μεθόδους που σας επιτρέπουν να συνδυάσετε τις αρχές του σχεδιασμού αντιδραστικών συστημάτων.



Φόρτωση...
Μπλουζα