NodeJS: Βέλτιστες πρακτικές παραγωγής

Αυτή είναι μια προσπάθεια να εξαχθούν οι πιο σημαντικές πρακτικές για την ανάπτυξη και την ανάπτυξη σε NodeJs.

Έχω δουλέψει για την τεχνολογία αυτή για λίγο. Αντιλαμβάνομαι το τεράστιο δυναμικό της και τη θέση της στη διαδικασία ανάπτυξης. Με σκληρό ανταγωνισμό από γλώσσες όπως η Python και το Golang, το NodeJS έχει αποδείξει τη χρησιμότητά του σε κατάλληλες περιπτώσεις χρήσης.

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

Τι είναι οι μικροεπιχειρήσεις;

Η Microservices - γνωστή και ως αρχιτεκτονική μικροεπιχειρήσεων - είναι ένα αρχιτεκτονικό στυλ που διαρθρώνει μια εφαρμογή ως μια συλλογή υπηρεσιών που είναι:

  • Εξαιρετικά διατηρήσιμο και δοκιμαστικό
  • Χαλαρά συνδεδεμένο
  • Ανεξάρτητη ανάπτυξη
  • Οργανωμένη γύρω από τις επιχειρηματικές δυνατότητες.

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

Πώς να αποφασίσετε εάν χρειάζεστε μικροεπιχειρήσεις

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

Ένα βιβλίο που προτείνω ιδιαίτερα είναι από τον Chris Richardson εδώ: http://bit.ly/2EmJDYt.

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

Θα ήταν άδικο αν συνεχίσω χωρίς να αναφερθώ στο Σχεδιασμό Οχημάτων (DDD). Είναι μια πολύ δημοφιλής στρατηγική για την αποσύνθεση του προϊόντος σας σε λειτουργικές μονάδες. Ως εκ τούτου, είναι πολύ χρήσιμο να δημιουργήσετε μικροεπιχειρήσεις.

Έτσι, τι είναι ένας τομέας σύμφωνα με το DDD;

Κάθε πρόβλημα που προσπαθείτε να επιλύσετε είναι ένας τομέας.

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

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

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

Ο στόχος είναι να επιτευχθεί ένα πολύ συνεκτικό και χαλαρά συνδεδεμένο μοντέλο τομέα. Για αυτό ακολουθεί αυτή η προσέγγιση:

Αυτή ήταν μια σύντομη εισαγωγή στο DDD. Για να μάθετε περισσότερα γι 'αυτό, σας συνιστώ εντόνως να διαβάσετε το εξαιρετικό βιβλίο του Eric Evans http://bit.ly/2Eoy17l.

Προχωράω.

Ελπίζω να κρατάτε μαζί μου.

Συνεπώς, από εδώ και στο εξής, θα μιλήσω περισσότερο για τις πρακτικές που αφορούν ειδικά το NodeJS. Και αυτό που εννοώ είναι ότι οι μικροεπιχειρήσεις και το DDD σας βοηθούν να συγκρίνετε τις πραγματικές δυνατότητες του NodeJS παρ 'όλα αυτά. Είναι πλήρης από μόνη της. Πως? Θα δούμε.

Ποιο σχέδιο μοτίβου πρέπει να χρησιμοποιήσετε κατά τη χρήση του NodeJs

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

Υπάρχουν διάφορα σχέδια σχεδιασμού που μπορούμε να χρησιμοποιήσουμε. Θα ήθελα να παρουσιάσω και / ή να ανακεφαλαιώσω για προγραμματιστές που γνωρίζουν ήδη ένα πρότυπο που ονομάζεται Pattern Repository.

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

Αποτελείται απο:

  1. Ελεγκτής: Διαχειρίζεται μόνο την αίτηση και την απόκριση και τα σχετικά χαρακτηριστικά. Δεν θα έχει καμία επιχειρησιακή λογική ή ορισμό μοντέλου ή συσχετίσεις μοντέλων. (όνομα φακέλου: ελεγκτές)
  2. Υπηρεσία: Περιέχει επιχειρησιακή λογική για τη μικροεπηρεσία σας. Ο έλεγχος περνά από τον ελεγκτή σε μια υπηρεσία. Είναι μια σχέση 1: 1 μεταξύ ενός ελεγκτή και της υπηρεσίας του και μιας σχέσης 1: πολλές μεταξύ υπηρεσίας και αποθετηρίων. (όνομα φακέλου: υπηρεσίες)
  3. Αποθήκη: Αλληλεπίδραση με τα μοντέλα που αποτελούν μέρος του φακέλου μοντέλου. Κάθε ερώτημα στη βάση δεδομένων μέσω του στρώματος μοντέλου θα διαμορφωθεί εδώ. Δεν θα έχει καμία επιχειρηματική λογική. (όνομα φακέλου: αποθετήρια)
  4. Μοντέλο: Περιέχει τον ορισμό του μοντέλου, τις ενώσεις, τις εικονικές λειτουργίες (π.χ.
  5. Βοηθητικά προγράμματα: Αυτό θα περιλαμβάνει βοηθητικές κλάσεις / λειτουργίες που μπορούν να χρησιμοποιηθούν ως υπηρεσίες. Π.χ. ένα βοηθητικό πρόγραμμα Redis που διαθέτει όλες τις λειτουργίες που απαιτούνται για την αλληλεπίδραση με το Redis. (όνομα φακέλου: βοηθητικά προγράμματα)
  6. Δοκιμαστική περίπτωση: Αυτό θα περιλαμβάνει περιπτώσεις δοκιμής μονάδας έναντι μεθόδων ελέγχου για να εξασφαλιστεί η μέγιστη κάλυψη του κώδικα. (όνομα φακέλου: spec)

Για να διαβάσετε περισσότερα σχετικά με αυτό, μπορείτε να ανατρέξετε σε αυτόν τον σύνδεσμο: http://bit.ly/2TrSyRS

Εντάξει, πες μου για τις ενότητες συμπλέγματος

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

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

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

Πώς να χειριστείτε τη ροή ελέγχου στο NodeJS

Ενώ χρησιμοποιείτε επανακλήσεις ή υποσχέσεις, οι ακόλουθες βιβλιοθήκες θα μπορούσαν να είναι χρήσιμες:

  1. Async (https://www.npmjs.com/package/async)
  2. Vasync (με καλύτερη παρακολούθηση της λειτουργίας) https://www.npmjs.com/package/vasync
  3. Bluebird (χειρίζεται υποσχέσεις π.χ. Promise.all κ.λπ.) https://www.npmjs.com/package/bluebird

Και βρόχοι;

  • Σειρά βρόχου: Εκτέλεση κάθε βήματος ένα προς ένα στη σειρά
  • Καθυστερημένος βρόχος: βρόχος με χρονικό όριο
  • Παράλληλος βρόχος: συλλέγει όλες τις υποσχέσεις σε ένα βρόχο και εκτελεί παράλληλα

Και ποια είναι τα χρήσιμα εργαλεία χνούδι;

Τα εργαλεία Linting αναλύουν τον κώδικα σας στατικά (χωρίς να τρέχουν). Εντοπίζουν πιθανά σφάλματα ή επικίνδυνα μοτίβα. Μοτίβα όπως η χρήση μη δηλωμένων μεταβλητών ή δηλώσεων "case" μέσα σε έναν διακόπτη χωρίς δήλωση "break".

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

Παραδείγματα γραμμενιστών είναι το χνούδι Javascript και το χνούδι JS.

Εντάξει, πώς αντιμετωπίζουμε την καταγραφή;

Ορισμένα πακέτα npm που χρησιμοποιούνται συνήθως είναι:

  • Winston (https://www.npmjs.com/package/winston)
  • Bunyan (https://www.npmjs.com/package/bunyan)

Πιθανή μορφή καταγραφής:

Για κατανεμημένα συστήματα όπως οι μικροεπιχειρήσεις, θα θέλατε να εξερευνήσετε τον κατανεμημένο εντοπισμό χρησιμοποιώντας το ZipKin κ.λπ.

Μια σημείωση σχετικά με τα πακέτα NPM: Θα πρέπει να χρησιμοποιήσετε ένα πακέτο μόνο εάν λύσει ένα πρόβλημα για εσάς που δεν μπορείτε να λύσετε τον εαυτό σας. Εκτελέστε τακτικά ελέγχους npm για να βρείτε κρίσιμα ζητήματα με τις εξαρτήσεις σας npm.

Αντιμετώπιση αβέβαιων εξαιρέσεων

Από προεπιλογή, το Node.js χειρίζεται αυτές τις εξαιρέσεις εκτυπώνοντας το ίχνος στοίβας στο stderr και βγαίνοντας με τον κωδικό 1, παρακάμπτοντας κάθε προηγουμένως καθορισμένο process.exitCode

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

Εναλλακτικά, αλλάξτε το process.exitCode στον χειριστή 'uncaughtException' που θα οδηγήσει στην έξοδο της διαδικασίας με τον παρεχόμενο κωδικό εξόδου. Διαφορετικά, με την παρουσία ενός τέτοιου χειριστή, η διαδικασία θα εξέλθει με 0.

process.exit (0) - επιτυχής τερματισμός
process.exit (1) - ανεπιτυχής τερματισμός

Διαχείριση χειριζόμενων απορρίψεων

Οι υποσχέσεις είναι πανταχού παρούσες στον κώδικα Node.js και μερικές φορές συνδέονται με έναν πολύ μακρύ κατάλογο λειτουργιών που επιστρέφουν υποσχέσεις και ούτω καθεξής.

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

Έξτρα Συμβουλή:

console.time () και console.timeEnd ()

Το αντικείμενο κονσόλας έχει τις μεθόδους time () και timeEnd () που βοηθούν στην ανάλυση της απόδοσης των κομματιών του κώδικα σας.

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

Ευχαριστώ πολύ για τον χρόνο σου.
Εγγραφείτε στο ενημερωτικό δελτίο μου

Άλλα υπέροχα άρθρα σχετικά με παρόμοια θέματα:

  1. https://microservices.io
  2. https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/ddd-oriented-microservice