Ο παλαιός κώδικας είναι παντού. Και καθώς ο ρυθμός με τον οποίο πολλαπλασιάζεται ο κώδικας συνεχίζει να αυξάνεται εκθετικά, όλο και περισσότερος από αυτόν τον κώδικα υποβιβάζεται σε κατάσταση παλαιού τύπου. Σε πολλούς μεγάλους οργανισμούς, η συντήρηση παλαιών συστημάτων καταναλώνει περισσότερο από το 90% των πόρων των συστημάτων πληροφοριών.
διαφορά c corp και s corp
Η ανάγκη εκσυγχρονισμού παλαιού κώδικα και συστημάτων για την κάλυψη των τρεχουσών επιδόσεων και απαιτήσεων επεξεργασίας είναι ευρέως διαδεδομένη. Αυτή η ανάρτηση παρέχει μια μελέτη περίπτωσης της χρήσης του Έρλανγκ γλώσσα προγραμματισμού και το Erlang CloudI Service Oriented Architecture (SOA), για την προσαρμογή του παλαιού κώδικα - ιδίως μιας δεκαετίας συλλογής πηγαίου κώδικα C - στον 21ο αιώνα.
Πριν από χρόνια, ήμουν μεγάλος οπαδός των διαδικτυακών παιχνιδιών για πολλούς παίκτες που βασίζονται σε κείμενο γνωστά ως Multi-User Dungeons ( MUDs ). Αλλά ήταν πάντα γεμάτοι προβλήματα απόδοσης. Αποφάσισα να βουτήξω σε έναν σωρό πηγαίου κώδικα δεκαετιών και να δω πώς θα μπορούσαμε να εκσυγχρονίσουμε αυτόν τον παλαιό κώδικα και να ωθήσω αυτά τα πρώιμα διαδικτυακά παιχνίδια στα όριά τους. Σε υψηλό επίπεδο, αυτό το έργο ήταν ένα εξαιρετικό παράδειγμα χρησιμοποιώντας τον Erlang για την προσαρμογή παλαιού λογισμικού ώστε να πληροί τις απαιτήσεις του 21ου αιώνα.
Μια σύντομη περίληψη:
Όλα τα Παιχνίδια Μαζικά Πολλαπλών Παιχνιδιών Ρόλων ( MMORPG ) - όπως το World of Warcraft και το EverQuest - έχουν αναπτύξει δυνατότητες των οποίων η αρχική προέλευση μπορεί να εντοπιστεί σε παλαιότερα διαδικτυακά παιχνίδια για πολλούς παίκτες που βασίζονται σε κείμενο γνωστά ως Multi-User Dungeons ( MUDs ).
Το πρώτο MUD ήταν το Essex MUD του Roy Trubshaw (ή MUD1 ) που αναπτύχθηκε αρχικά το 1978 χρησιμοποιώντας τη γλώσσα συναρμολόγησης MARO-10 σε DEC PDP-10, αλλά μετατράπηκε σε BCPL, προκάτοχο της γλώσσας προγραμματισμού C (και έτρεχε μέχρι το 1987). (Όπως μπορείτε να δείτε, αυτά τα πράγματα είναι παλαιότερα από τους περισσότερους προγραμματιστές.)
Τα MUD σταδιακά κέρδισαν δημοτικότητα στα τέλη της δεκαετίας του 1980 και στις αρχές της δεκαετίας του 1990 με διάφορες βάσεις κώδικα MUD γραμμένες στο C. Η βάση δεδομένων DikuMUD, για παράδειγμα, είναι γνωστή ως η ρίζα μιας από τις μεγαλύτερες δέντρα του παραγόμενου πηγαίου κώδικα MUD, με τουλάχιστον 51 μοναδικές παραλλαγές, όλες βασισμένες στον ίδιο πηγαίο κώδικα DikuMUD. (Κατά τη διάρκεια αυτού του χρονικού πλαισίου, παρεμπιπτόντως, οι MUD έγιναν εναλλακτικά γνωστοί ως 'Πολυ-προπτυχιακοί καταστροφείς' λόγω του αριθμού των προπτυχιακών φοιτητών που απέτυχαν εκτός σχολείου λόγω της εμμονής τους μαζί τους.)
Ο ιστορικός πηγαίος κώδικας C MUD (συμπεριλαμβανομένου του DikuMUD και των παραλλαγών του) είναι γεμάτος προβλήματα απόδοσης λόγω των υφιστάμενων περιορισμών κατά τη στιγμή της δημιουργίας του.
τι είναι η σχεδιαστική σκέψη στην επιχείρηση
Τότε, δεν υπήρχε εύκολα προσβάσιμη βιβλιοθήκη με θέματα. Επιπλέον, το νήμα θα έκανε τον πηγαίο κώδικα πιο δύσκολο να διατηρηθεί και να τροποποιηθεί. Ως αποτέλεσμα, αυτά τα MUD ήταν όλα με ένα νήμα.
Κατά τη διάρκεια ενός μόνο «τικ» (αύξηση του εσωτερικού ρολογιού που παρακολουθεί την εξέλιξη όλων των γεγονότων του παιχνιδιού), πρέπει να επεξεργαστεί ο πηγαίος κώδικας MUD κάθε εκδήλωση παιχνιδιού για κάθε συνδεδεμένη πρίζα. Με άλλα λόγια: κάθε κομμάτι κώδικα επιβραδύνει την επεξεργασία ενός μεμονωμένου κρότου. Και αν κάποιος υπολογισμός αναγκάσει την επεξεργασία να διαρκέσει περισσότερο από ένα μεμονωμένο τσιμπούρι, το MUD καθυστερεί, επηρεάζοντας κάθε συνδεδεμένη συσκευή αναπαραγωγής.
Με αυτήν την καθυστέρηση, το παιχνίδι γίνεται αμέσως λιγότερο ελκυστικό. Οι παίκτες κοιτάζουν αβοήθητα καθώς οι χαρακτήρες τους πεθαίνουν, με τις δικές τους εντολές να παραμένουν ανεπεξέργαστες.
Για τους σκοπούς αυτού του πειράματος εκσυγχρονισμού εφαρμογών παλαιού τύπου, επέλεξα SillyMUD , ένα ιστορικό παράγωγο του DikuMUD που έχει επηρεάσει τα σύγχρονα MMORPG και τα προβλήματα απόδοσης που μοιράζονται. Κατά τη διάρκεια της δεκαετίας του 1990, έπαιξα ένα MUD που προήλθε από τη βάση κώδικα SillyMUD, οπότε ήξερα ότι ο πηγαίος κώδικας θα ήταν ένα ενδιαφέρον και κάπως γνωστό σημείο εκκίνησης.
χειρισμός σφαλμάτων κόμβου js express
Ο πηγαίος κώδικας SillyMUD είναι παρόμοιος με αυτόν των άλλων ιστορικών C MUD στο ότι περιορίζεται σε περίπου 50 ταυτόχρονες συσκευές αναπαραγωγής (64, για να είμαστε ακριβείς, με βάση τον πηγαίο κώδικα).
Ωστόσο, παρατήρησα ότι ο πηγαίος κώδικας είχε τροποποιηθεί για λόγους απόδοσης (δηλαδή, για να προωθήσει τον ταυτόχρονο περιορισμό του προγράμματος αναπαραγωγής). ΕΙΔΙΚΑ:
CloudI ήταν συζητήθηκε προηγουμένως ως λύση για την ανάπτυξη πολυγλωττών λόγω της ανοχής σφαλμάτων και της επεκτασιμότητας που παρέχει.
Το CloudI παρέχει μια αφαίρεση υπηρεσίας (για να παρέχει μια αρχιτεκτονική προσανατολισμένη στην υπηρεσία ( ΕΤΣΙ, ΕΝΑ )) σε Erlang, C / C ++, Java, Python και Ruby, διατηρώντας ταυτόχρονα τα σφάλματα λογισμικού απομονωμένα στο πλαίσιο CloudI. Η ανοχή σφαλμάτων παρέχεται μέσω της εφαρμογής Erlang του CloudI, στηριζόμενη στις ανεκτές λειτουργίες της Erlang και στην εφαρμογή της Μοντέλο ηθοποιού . Αυτή η ανοχή σφαλμάτων αποτελεί βασικό χαρακτηριστικό της εφαρμογής Erlang του CloudI, όπως όλο το λογισμικό περιέχει σφάλματα .
Το CloudI παρέχει επίσης έναν διακομιστή εφαρμογών για τον έλεγχο της διάρκειας εκτέλεσης της υπηρεσίας και της δημιουργίας διεργασιών υπηρεσίας (είτε ως διαδικασίες λειτουργικού συστήματος για γλώσσες προγραμματισμού εκτός Erlang είτε ως διαδικασίες Erlang για υπηρεσίες που υλοποιούνται στο Erlang), έτσι ώστε η εκτέλεση υπηρεσίας να πραγματοποιείται χωρίς να επηρεάζεται η εξωτερική κατάσταση αξιοπιστία. Για περισσότερα, δείτε το δικό μου προηγούμενη ανάρτηση .
Ο ιστορικός πηγαίος κώδικας C MUD παρέχει μια ενδιαφέρουσα ευκαιρία για την ενσωμάτωση του CloudI, δεδομένων των προβλημάτων αξιοπιστίας του:
Με την ενσωμάτωση CloudI, τα σφάλματα σταθερότητας του διακομιστή μπορούν να διορθωθούν κανονικά, αλλά η επίδρασή τους είναι περιορισμένη, έτσι ώστε η λειτουργία του διακομιστή παιχνιδιών να μην επηρεάζεται πάντα όταν ένα σφάλμα που δεν έχει ανακαλυφθεί προηγουμένως προκαλεί αποτυχία ενός εσωτερικού συστήματος παιχνιδιών. Αυτό παρέχει ένα εξαιρετικό παράδειγμα της χρήσης του Erlang για την επιβολή ανοχής σφαλμάτων σε μια παλιά βάση κώδικα.
γράφοντας περιπτώσεις δοκιμών junit σε java
Η αρχική βάση κώδικα γράφτηκε ότι είναι μονόκλωνη και εξαρτάται σε μεγάλο βαθμό από καθολικές μεταβλητές. Ο στόχος μου ήταν να διατηρήσω τη λειτουργικότητα του πηγαίου κώδικα πηγαίου κώδικα, ενώ τον εκσυγχρονίζω για τη σημερινή χρήση.
Με το CloudI, μπόρεσα να διατηρήσω τον πηγαίο κώδικα με ένα νήμα, παρέχοντας παράλληλα δυνατότητα κλιμάκωσης σύνδεσης.
Στόχος μου ήταν να διατηρήσω τη λειτουργικότητα του πηγαίου κώδικα πηγαίου κώδικα, ενώ την προσαρμόστηκα για σύγχρονη χρήση.Ας εξετάσουμε τις απαραίτητες αλλαγές:
Το buffering της εξόδου κονσόλας SillyMUD (οθόνη τερματικού, συχνά συνδεδεμένη με Telnet ) ήταν ήδη σε ισχύ, αλλά κάποια άμεση χρήση περιγραφικού αρχείου απαιτούσε προσωρινή αποθήκευση (έτσι ώστε η έξοδος της κονσόλας να μπορούσε να γίνει η απόκριση σε ένα αίτημα υπηρεσίας CloudI).
Ο χειρισμός της υποδοχής στον αρχικό πηγαίο κώδικα βασίστηκε σε ένα select()
Λειτουργία κλήσης για τον εντοπισμό εισόδου, σφαλμάτων και την πιθανότητα εξόδου, καθώς και για παύση για ένα τσεκ παιχνιδιού 250 χιλιοστών του δευτερολέπτου πριν από τον χειρισμό εκκρεμών γεγονότων παιχνιδιού.
πώς να φτιάξετε ένα λογιστικό σχέδιο
Η ενσωμάτωση CloudI SillyMUD βασίζεται σε εισερχόμενα αιτήματα υπηρεσίας για εισαγωγή, ενώ κάνει παύση με το C CloudI API's cloudi_poll
συνάρτηση (για τα 250 χιλιοστά του δευτερολέπτου προτού χειριστείτε τα ίδια εκκρεμή γεγονότα παιχνιδιού). Ο πηγαίος κώδικας SillyMUD έτρεχε εύκολα στο CloudI ως υπηρεσία CloudI μετά την ενσωμάτωσή του στο C CloudI API (αν και Το CloudI παρέχει API C και C ++ , χρησιμοποιώντας το C API καλύτερη διευκόλυνση της ενσωμάτωσης με τον πηγαίο κώδικα C του SillyMUD).
Η ενσωμάτωση CloudI προσυπογράφει τρία κύρια μοτίβα ονομάτων υπηρεσιών για τη διαχείριση συμβάντων σύνδεσης, αποσύνδεσης και παιχνιδιού. Αυτά τα μοτίβα ονομάτων προέρχονται από τις κλήσεις API C CloudI Εγγραφείτε στον πηγαίο κώδικα ενοποίησης. Κατά συνέπεια, είτε οι συνδέσεις WebSocket είτε οι συνδέσεις Telnet έχουν προορισμούς ονόματος υπηρεσίας για την αποστολή αιτημάτων υπηρεσίας όταν πραγματοποιούνται συνδέσεις.
Η υποστήριξη WebSocket και Telnet στο CloudI παρέχεται από εσωτερικές υπηρεσίες CloudI (cloudi_service_http_cowboy
για υποστήριξη WebSocket και cloudi_service_tcp
για υποστήριξη Telnet). Δεδομένου ότι οι εσωτερικές υπηρεσίες CloudI είναι γραμμένες στο Erlang, είναι σε θέση να αξιοποιήσουν την ακραία επεκτασιμότητα της Erlang, ενώ ταυτόχρονα χρησιμοποιούν το CloudI άντληση υπηρεσίας που παρέχει τις λειτουργίες CloudI API.
Αποφεύγοντας το χειρισμό της πρίζας, σημειώθηκε λιγότερη επεξεργασία σε σφάλματα υποδοχής ή καταστάσεις όπως συνδέουν τον θάνατο (στην οποία οι χρήστες αποσυνδέονται από το διακομιστή). Έτσι, η αφαίρεση του χειρισμού υποδοχών χαμηλού επιπέδου αντιμετώπισε το κύριο πρόβλημα κλιμάκωσης.
Η αφαίρεση του χειρισμού υποδοχών χαμηλού επιπέδου αντιμετώπισε το κύριο πρόβλημα επεκτασιμότητας.Ωστόσο, παραμένουν προβλήματα κλιμάκωσης. Για παράδειγμα, το MUD χρησιμοποιεί το σύστημα αρχείων ως τοπική βάση δεδομένων τόσο για στατικά όσο και για δυναμικά στοιχεία παιχνιδιού (δηλαδή, παίκτες και την πρόοδό τους, μαζί με τις παγκόσμιες ζώνες, αντικείμενα και τέρατα). Η αναδιαμόρφωση του παλαιού κώδικα του MUD για να βασιστείτε σε μια υπηρεσία CloudI για μια βάση δεδομένων θα παρέχει περαιτέρω ανοχή σφαλμάτων. Εάν χρησιμοποιούσαμε μια βάση δεδομένων και όχι ένα σύστημα αρχείων, πολλές διαδικασίες υπηρεσίας SillyMUD CloudI θα μπορούσαν να χρησιμοποιηθούν ταυτόχρονα ως ξεχωριστοί διακομιστές παιχνιδιών, διατηρώντας τους χρήστες απομονωμένους από σφάλματα χρόνου εκτέλεσης και μειώνοντας τον χρόνο διακοπής λειτουργίας.
Υπήρχαν τρεις κύριοι τομείς βελτίωσης:
Έτσι, με την απλή ενσωμάτωση CloudI, ο αριθμός των συνδέσεων κλιμακώθηκε κατά τρεις τάξεις μεγέθους, παρέχοντας παράλληλα ανοχή σφαλμάτων και αυξάνοντας την αποτελεσματικότητα του ίδιου παλαιού παιχνιδιού.
Η Erlang έχει παράσχει 99,9999999% χρόνο λειτουργίας (λιγότερο από 31.536 χιλιοστά του δευτερολέπτου χρόνου διακοπής ανά έτος) για συστήματα παραγωγής. Με το CloudI, προσφέρουμε την ίδια αξιοπιστία σε άλλες γλώσσες και συστήματα προγραμματισμού.
Πέρα από την απόδειξη της βιωσιμότητας αυτής της προσέγγισης για τη βελτίωση του στάσιμου πηγαίου κώδικα διακομιστή παιχνιδιού παλαιού τύπου (το SillyMUD τροποποιήθηκε τελευταία πριν από 20 χρόνια το 1993!), Αυτό το έργο δείχνει σε ευρύτερο επίπεδο πώς μπορούν να αξιοποιηθούν οι Erlang και CloudI για τον εκσυγχρονισμό εφαρμογών παλαιού τύπου και για την παροχή σφάλματος - ανοχή, βελτιωμένη απόδοση και γενικά υψηλή διαθεσιμότητα. Αυτά τα αποτελέσματα διατηρούν πολλά υποσχόμενες δυνατότητες προσαρμογής του παλαιού κώδικα στον 21ο αιώνα χωρίς να απαιτείται σημαντική αναθεώρηση λογισμικού.