Την περασμένη εβδομάδα, αποτόλμησα να ασχοληθώ με την ανάπτυξη λογισμικού ερευνώντας την έννοια των εικονικών ηθοποιών. Κατέληξα να ψάχνω σε δύο διαφορετικά πλαίσια: το Dapr και την Ορλεάνη.
Και τα δύο είναι πολύ συνοπτικά έργα με τόνους ενδιαφέρουσες περιπτώσεις χρήσης. Και οι δύο χρησιμοποιούν την ιδέα των «εικονικών» ηθοποιών. Ένας εικονικός παράγοντας είναι μια κατάσταση και μια λογική μονάδα που:
- Μπορεί να αναγνωριστεί μοναδικά με αναγνωριστικό
- Είναι μονής κλωστής
- Μπορεί να είναι στη μνήμη ή μόνιμο - ο κύκλος ζωής του διαχειρίζεται από το πλαίσιο
Μου αρέσει πολύ η ιδέα των εικονικών ηθοποιών και τους βρίσκω πολύ χρήσιμους στην εξερεύνηση της δημιουργίας επεκτάσιμων και αξιόπιστων εργαλείων για τη διαχείριση πολύπλοκων ροών εργασίας εργασιών. Εάν κάθε εργασία είναι ένας εικονικός συμμετέχων ενός νήματος, το πρόβλημα της συνθήκης αγώνα εξαφανίζεται.
Επειδή η Ορλεάνη και το Dapr είναι και τα δύο έργα της Microsoft, οραματίζομαι μια μέρα σε μια αναμέτρηση σε στυλ Western Story στην καφετέρια της Microsoft.
Ορλεάνη
Ξεκίνησα με την Ορλεάνη γιατί ήταν στο ραντάρ μου για λίγο αφού είδα μερικά βίντεο σχετικά με αυτήν στο YouTube. Ξεκίνησε πολύ άσχημα γιατί νόμιζα ότι θα χρησιμοποιούσα την έκδοση 4.x όλων των πακέτων NuGet τους. Ωστόσο, καμία απολύτως από τις τεκμηρίωσή τους δεν λειτουργεί με το πακέτο 4.x. Κατέληξα να χρησιμοποιήσω την έκδοση 3.6.2.
Κόκκοι / Κατάσταση / Χρονόμετρα
Η δημιουργία ενός κόκκου που παρακολουθεί τη δική του κατάσταση και εκτελεί ενέργειες είναι πολύ απλή. Μπόρεσα ακόμη και να ακολουθήσω την τεκμηρίωση για την επιμονή των κόκκων και να δημιουργήσω τη δική μου εφαρμογή CosmosDB (SQL API) του IGrainStorage.
Υπενθυμίσεις
Οι υπενθυμίσεις είναι επίσης εύκολο να ρυθμιστούν. Μέχρι που προσπάθησα να διαμορφώσω την επιμονή στον πραγματικό κόσμο για αυτούς. Σε αυτό το σημείο της έρευνάς μου, προσπαθώ να κρατήσω τα πάντα τακτοποιημένα και να αποθηκεύσω τα πάντα στο ComsosDB. Δυστυχώς, δεν μπορώ να κάνω το πακέτο υπενθύμισης επιμονής της Ορλεάνης να λειτουργήσει καθόλου. Κατέληξα να μεταβώ στο πακέτο AzureStorage. Τώρα λοιπόν τα δεδομένα μου είναι τα μισά στον λογαριασμό SQL API και τα μισά στον λογαριασμό API του πίνακα.
Ροές
Εκεί δεν πήγα καλά. Στην Ορλεάνη, οι ροές αναγνωρίζονται από ένα GUID και έναν προαιρετικό χώρο ονομάτων. Είμαι σίγουρος ότι υπάρχει ένας καλός λόγος για τον οποίο οι ροές πρέπει να αναγνωρίζονται από ένα GUID, αλλά ουάου, αυτό δεν είναι πρακτικό.
Είμαι πολύ απογοητευμένος με τις ροές γιατί μπόρεσα να τις δημιουργήσω εύκολα, αλλά μόλις σταματήσω και επανεκκινήσω το έργο μου και ενεργοποιήσω ένα νέο συμβάν, όλα κολλάνε.
Ακολουθεί μια πολύ πολύτιμη πληροφορία, καθώς μου πήρε 8 ώρες για να αναστρέψω τον κώδικα της Ορλεάνης για να τον καταλάβω:
Όταν ένας κόκκος είναι συνδρομητής ροής, ο κόκκος πρέπει να καλέσει το ResumeAsync στη λαβή συνδρομής με τη μέθοδο OnActivateAsync, διαφορετικά θα διακοπεί με ένα μη αναγνωρισμένο σφάλμα.
Είχα επίσης το πρόβλημα της αντιγραφής της ίδιας συνδρομής, οπότε χρησιμοποίησα τον κώδικα για να διαγράψω όλες τις συνδρομές του κόκκου και στη συνέχεια τον δημιούργησα ξανά:
Άλλα Orleans Gotchas / Συμβουλές
Οι ροές λειτουργούν καλά με τα Κέντρα συμβάντων Azure (μέσω του AddEventHubStreams).
Μην χρησιμοποιείτε / ή άλλους ειδικούς χαρακτήρες στο όνομα Grain του CosmosDB SQL API!
Συμπέρασμα της Ορλεάνης
Μου αρέσει η Ορλεάνη και νομίζω ότι έχει δυνατότητες. Ωστόσο, έχει μια πολύ απότομη καμπύλη εκμάθησης. Λόγω του μακροχρόνιου αγώνα μου με το streaming, δεν έχω χρόνο να μελετήσω πώς λειτουργούν τα clusters/deployments.
Νταπρ
Βρήκα το Dapr αναζητώντας εναλλακτικές λύσεις για την Ορλεάνη. Είναι λίγο περίεργο που είναι επίσης ένα έργο που χρηματοδοτείται από τη Microsoft. Ίσως είναι εδώ για να ακολουθήσουν μια προσέγγιση επιβίωσης του ισχυρότερου. Αν ναι, νομίζω ότι ο Dapr θα είναι επιζών.
Πρώτον, ο σχεδιασμός του Dapr που βασίζεται σε REST/gRPC επιτρέπει στους ηθοποιούς να υλοποιούνται χρησιμοποιώντας οποιαδήποτε γλώσσα προγραμματισμού. Βρήκα επίσης ασήμαντο να τρέχω τα πάντα (συμμετέχοντες, καταστάσεις, χρονόμετρα, υπενθυμίσεις, συμβάντα) σε μία μόνο περίπτωση Redis. Επιπλέον, μου πήρε μόνο περίπου το ένα τρίτο του χρόνου για να αρχίσω να χρησιμοποιώ το Dapr. Ένας τόσο γρήγορος χρόνος εκκίνησης οφείλεται στην εξαιρετική τεκμηρίωση του Dapr.
Ηθοποιοί / Χρονόμετρα / Υπενθυμίσεις
Είπα απλώς ότι η τεκμηρίωση του Dapr είναι εξαιρετική; Λοιπόν, είναι παντού, εκτός από παραδείγματα JavaScript. Περνάω τον περισσότερο χρόνο μου στο Dapr, προσπαθώντας να καταλάβω πώς να καλέσω μεθόδους στους ηθοποιούς. Ο κώδικας για το δείγμα Dapr Javascript έχει ως εξής:
Αυτό είναι σαφώς ξεπερασμένο. Έπρεπε να αφιερώσω πολύ χρόνο για να πείσω αυτές τις τρεις γραμμές μέσω της εξερεύνησης κώδικα δοκιμής/δείγματος του Dapr
Τα παραδείγματα κώδικα για τη λήψη/ρύθμιση κατάστασης έχουν παρόμοια προβλήματα, επομένως δημιούργησα ένα ζήτημα GitHub για αυτά.
Εκτός από αυτά τα μικρά προβλήματα, το στήσιμο των ηθοποιών είναι παιχνιδάκι.
Η ρύθμιση χρονόμετρων και υπενθυμίσεων για το καστ μου είναι επίσης πολύ εύκολη.
Κράτος
Κατάφερα να ρυθμίσω το Dapr ώστε να επιμένει στο Postgres πολύ εύκολα.
Ένα πράγμα που έχω παρατηρήσει είναι ότι μπορεί να υπάρχουν προβλήματα επεκτασιμότητας με τον τρόπο αποθήκευσης των υπενθυμίσεων. Το Dapr αποθηκεύει όλες τις ειδοποιήσεις για έναν συγκεκριμένο τύπο συμμετέχοντα σε έναν μόνο πίνακα JSON. Τι συμβαίνει αν κάποιος έχει έναν τόνο υπενθυμίσεων;
Άλλα Dapr Gotchas / Συμβουλές
Ένα πράγμα που παρατήρησα κατά την περιήγηση στον κώδικα για το JavaScript SDK είναι ότι δεν υπάρχουν καθόλου πολλά σχόλια στη βάση κώδικα. Αυτό καθιστά σχεδόν αδύνατο να καταλάβουμε κάτι. Για παράδειγμα, στη μέθοδο addOrUpdateState του διαχειριστή κατάστασης, υπάρχει μια τρίτη παράμετρος που ονομάζεται updateValueFactory. Εάν δεν υπάρχουν σχόλια στον κώδικα, είναι σχεδόν αδύνατο να πούμε σε τι χρησιμεύει η επανάκληση.
Επίσης, δεν είμαι σίγουρος πόσο μου αρέσει η εντολή "dapr init" που προσπαθεί να ρυθμίσει και να εκτελέσει ένα κοντέινερ redis για μένα. Τι γίνεται αν έχω ήδη ένα δοχείο redis; Τι γίνεται αν θέλω να χρησιμοποιήσω το postgres; Δεν μπορώ να βρω τεκμηρίωση που να εξηγεί πώς να αλλάξω τη δυνατότητα dapr init.
Μια σημείωση για όποιον αντιμετωπίζει προβλήματα με τη χρήση του pubsub. Πρέπει να χρησιμοποιήσετε το "dapr run" για να εκτελέσετε τόσο τον εκδότη όσο και τον συνδρομητή σας:
Για τους ηθοποιούς και το pubsub, σημειώστε ότι είναι σημαντικό να χρησιμοποιήσετε την παράμετρο --app-port για να ενημερώσετε το dapr σε ποια θύρα εκτελείται η υπηρεσία σας. Τα συμβάντα pubsub και οι κλήσεις ηθοποιών αποστέλλονται στην υπηρεσία σας από το πλαϊνό καρότσι Dapr μέσω κλήσεων http, επομένως πρέπει να γνωρίζει πού να τις στείλει:
Δοκίμασα ένα μικρό αυτο-φιλοξενούμενο "σύμπλεγμα" Dapr εκκινώντας την παρουσία συνδρομητή pubsub σε δύο διαφορετικά μηχανήματα στο οικιακό μου δίκτυο. Απλώς λειτούργησε!
Συμπέρασμα Dapr
Αν θέλετε να μάθετε περισσότερες ιδέες για κατανεμημένες εφαρμογές ή εικονικούς ηθοποιούς, σας συνιστώ να ξεκινήσετε με το Dapr. Η Ορλεάνη ήταν ο αρχικός πρωτοπόρος, ενώ ο Dapr ήταν μια επανεκκίνηση που πήγε τα πράγματα στο επόμενο επίπεδο.
Αρχικός σύνδεσμος:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
|