Le développement croissant de JavaScript a entraîné de nombreux changements, et le visage du développement Web aujourd'hui est devenu complètement différent. Il y a quelques années, il aurait été inimaginable d'exécuter du JavaScript sur un serveur.
Avant de vous plonger dans Node.js, vous souhaiterez peut-être comprendre les avantages de l'utilisation du JavaScript cross-stack, qui unifie le langage et le format de données (JSON), Vous permet de réutiliser les ressources des développeurs de la meilleure façon possible. L'intégration de Node.js dans la pile technologique constitue un avantage clé.
Node.js est un environnement d'exécution JavaScript construit sur le moteur JavaScript de Chrome appelé V8. Il convient de noter que l'objectif du créateur de Node.js, Ryan Dahl, était de développer un site Web doté de capacités push en temps réel "inspirées d'applications comme Gmail". Dans Node.js, il fournit une fonctionnalité permettant de gérer les E/S non bloquantes basées sur des événements. [Recommandation du tutoriel vidéo : tutoriel nodejs ]
Pour résumer en une phrase : Node.js brille dans les applications web temps réel basées sur la technologie push websockets. Après plus de 20 ans d'utilisation d'applications Web sans état basées sur le modèle requête-réponse sans état, nous disposons enfin d'applications Web capables d'établir des connexions bidirectionnelles en temps réel, où le client et le serveur peuvent initier une communication et leur permettre d'échanger librement des données. .
Cela contraste fortement avec le modèle de réponse Web typique où la communication est toujours initiée par le client. De plus, il s'appuie également sur la pile technologique web ouverte (HTML, CSS et JS) fonctionnant sur le port standard 80.
On pourrait affirmer que nous faisons cela depuis des années sous la forme d'applets Flash et Java - mais en réalité, ce ne sont que des environnements en bac à sable qui utilisent le Web comme protocole de transport pour transmettre les données au client. De plus, ils s'exécutent de manière isolée, souvent sur des ports non standard, ce qui peut nécessiter des autorisations supplémentaires.
Grâce à ses atouts, Node.js joue un rôle clé dans la pile technologique de nombreuses entreprises de renom qui s'appuient sur ses avantages uniques. La Fondation Node.js a rassemblé à peu près toutes les meilleures idées, et un court PPT expliquant pourquoi les entreprises devraient envisager Node.js peut être trouvé sur la Page d'études de cas de la Fondation Node.js.
Dans cet article, j'expliquerai non seulement comment utiliser ces avantages, mais aussi pourquoi vous pourriez vouloir utiliser Node.js, en utilisant certains modèles d'applications Web classiques comme exemples.
L'idée principale de Node.js est d'utiliser des E/S non bloquantes et basées sur des événements pour garantir légèreté et efficacité face à des programmes en temps réel gourmands en données exécutés sur des appareils distribués.
C'est une bouchée à lire.
Cela signifie que Node.js n'est pas une nouvelle plateforme à tout résoudre qui est sur le point de dominer le monde du développement Web. Il s’agit plutôt d’une plateforme qui répond à un besoin précis. Comprendre cela est absolument nécessaire. Vous ne voulez jamais utiliser Node.js pour des opérations gourmandes en CPU ; en fait, l’utiliser pour de nombreux calculs lourds éliminera presque tous ses avantages. Là où Node.js brille vraiment, c'est dans la création d'applications Web rapides et évolutives en raison de sa capacité à gérer un grand nombre de connexions simultanées à haut débit, ce qui équivaut à une évolutivité élevée.
La façon dont cela fonctionne sous le capot est assez intéressante. La technologie de service Web traditionnelle génère un nouveau thread pour chaque connexion (requête), occupant la mémoire système et étant finalement limitée par la mémoire maximale disponible, tandis que Node.js s'exécute sur un seul thread, en utilisant des appels d'E/S non bloquants, ce qui lui permet de prendre en charge des dizaines de milliers de connexions simultanées (maintenues dans la boucle d'événements).
Calcul rapide : en supposant que chaque thread nécessite 2 Mo de mémoire, fonctionner sur un système avec 8 Go de mémoire permettrait théoriquement jusqu'à 4000 connexions simultanées (calcul à partir de l'article de Michael Abernethy « Qu'est-ce que Node .js ? » , publié sur IBM DeveloperWorks en 2011 ; malheureusement, le lien vers cet article est maintenant mort) , et cela n'inclut pas le coût du changement de contexte entre les threads . C’est le scénario auquel vous êtes généralement confronté dans la technologie de serveur Web traditionnelle. En évitant tous ces problèmes, Node.js atteint des niveaux dépassant 1 million de connexions simultanées et 600 000 connexions Websockets simultanées.
Bien sûr, un piège potentiel lors de l'écriture d'applications Node.js est le problème du partage d'un seul thread entre les requêtes des clients. Premièrement, des calculs lourds peuvent bloquer un seul thread d'un nœud et causer des problèmes à tous clients (nous en parlerons plus tard), car les requêtes entrantes seront bloquées jusqu'à ce que le calcul soit terminé. Deuxièmement, les développeurs doivent être très prudents de ne pas laisser les exceptions remonter jusqu'à la boucle d'événements Node.js principale (la plus haute), ce qui entraînerait la fin de l'instance Node.js (plantage du programme).
Pour éviter les exceptions de propagation au niveau supérieur, une technique courante consiste à renvoyer les erreurs à l'appelant en tant que paramètres de rappel (plutôt que de les renvoyer comme dans d'autres contextes). Même si certaines exceptions non gérées remontent au niveau supérieur, il existe des outils pour surveiller le processus Node.js et effectuer la récupération après un crash (bien que la récupération à l'état actuel de la session utilisateur puisse ne pas être possible ), le plus souvent Module Forever.
Une chose qui ne doit absolument pas être ignorée lorsque l'on parle de Node.js est la prise en charge de la gestion des packages à l'aide de l'outil npm intégré, par défaut pour chaque nœud. js sera installé. Le concept des modules npm est très similaire à Ruby Gems : un ensemble de composants réutilisables avec gestion des versions et des dépendances qui peuvent être facilement installés via un référentiel en ligne.
Une liste complète des modules packagés peut être trouvée sur le site Web npm ou est accessible à l'aide de l'outil CLI npm qui est automatiquement installé avec Node.js. L'écosystème de modules est ouvert à tous, chacun peut publier ses propres modules et les modules publiés apparaîtront dans le référentiel npm. Pour une introduction à npm, consultez le Guide du débutant et le Tutoriel de publication npm pour la section sur les modules de publication.
Quelques modules npm utiles sont :
La liste ne cesse de s'allonger. Il existe de nombreux packages utiles que tout le monde peut utiliser.
Le chat en ligne est l'application multi-utilisateurs en temps réel la plus typique et le meilleur cas de Node.js : c'est un applications légères, à fort trafic et gourmandes en données (mais peu de traitement et de calcul) qui s'exécutent de manière distribuée sur les appareils. C'est également un excellent cas d'étude car il est simple mais couvre la plupart des paradigmes que vous utiliseriez dans un programme Node.js typique.
Essayons d'imaginer comment cela fonctionne.
Supposons le scénario le plus simple, il y a un salon de discussion sur notre site Web, les gens peuvent échanger des messages de manière un à plusieurs (en fait avec tout le monde).
Côté serveur, nous avons un simple programme Express.js, qui implémente deux choses : 1) Un gestionnaire de requêtes GET, qui fournit un forum de messages et une interface utilisateur. Un "Envoyer" fonction de bouton pour initialiser la saisie de nouveaux messages, et 2) un serveur Websockets pour écouter les nouveaux messages des clients Websocket.
Côté client, nous avons une page HTML avec quelques gestionnaires configurés, un pour l'événement de clic du bouton "Envoyer", qui reçoit le message d'entrée et l'envoie au websocket, et un autre un avec Utilisé pour écouter les nouveaux messages entrants et les afficher sur le client websockets (c'est-à-dire les messages envoyés par d'autres utilisateurs que le serveur souhaite que le client affiche).
Lorsque l'un des clients publie un message, ce qui suit se produit :
C'est l'exemple le plus simple. Pour une solution plus robuste, vous pouvez utiliser un simple cache basé sur Redis. Ou, dans une solution plus avancée, une file d'attente de messages peut être utilisée comme route de messages et un mécanisme de livraison plus puissant peut être implémenté, tel que le stockage des messages lorsque la connexion est perdue ou que le client est hors ligne. Mais quelles que soient les améliorations que vous apportez, Node.js fonctionnera toujours selon les mêmes principes de base : réagir aux événements, gérer de nombreuses connexions simultanées et garantir la fluidité de l'expérience utilisateur.
Bien que Node.js soit certainement idéal pour développer des applications en temps réel, il est également idéal pour exposer les données de bases de données d'objets telles que MongoDB. Les données stockées JSON permettent à Node.js de bien fonctionner avec des objets cohérents avec les données stockées et sans conversion de données.
Par exemple, si vous utilisez Rails, vous devez alors convertir JSON en modèles binaires, puis les convertir en JSON via HTTP pour une utilisation dans React.js ou Angular.js, ou même avec un simple jQuery Appels AJAX. Avec Node.js, vous pouvez exposer directement vos objets JSON pour la consommation client via une API REST. De plus, vous n'avez pas à vous soucier de la conversion entre JSON et autre chose lors de la lecture ou de l'écriture dans la base de données (si vous utilisez MongoDB). En bref, l'utilisation d'un format de sérialisation des données unifié dans le client, le serveur et la base de données peut éviter les problèmes liés aux conversions multiples.
Si vous recevez beaucoup de données simultanées, votre base de données peut devenir un goulot d'étranglement. Comme mentionné ci-dessus, Node.js peut facilement gérer seul les connexions simultanées. Mais comme l’accès à la base de données est une opération bloquante (dans ce cas), nous rencontrons des problèmes. La solution consiste à confirmer le comportement du client avant que les données ne soient réellement écrites dans la base de données.
Grâce à cette approche, le système peut maintenir sa réactivité sous une charge élevée, ce qui est particulièrement utile lorsque le client n'a pas besoin de confirmer que les données ont été écrites avec succès. Des exemples typiques incluent : le traitement par lots lors de la journalisation ou de l'écriture des données de suivi des utilisateurs ; et la cohérence éventuelle (souvent utilisée dans le monde NoSQL) qui est acceptable pour les opérations qui ne nécessitent pas de réflexion immédiate (telles que la mise à jour du nombre de "J'aime" de Facebook ).
Les données sont mises en file d'attente via une sorte de cache ou de file d'attente de messages (par exemple, RabbitMQ, ZeroMQ) et transmises via un processus d'écriture par lots distinct dans la base de données, ou digérées par un service backend à forte intensité de calcul et mieux écrites. Une plateforme capable d'accomplir de telles tâches. Un comportement similaire peut être implémenté dans d'autres langages ou frameworks, mais pas sur le même matériel pour maintenir le même débit élevé.
En bref : en utilisant Node, vous pouvez écrire des écritures dans la base de données à un seul endroit et les traiter plus tard comme si elles avaient été traitées avec succès.
Sur les plateformes Web plus traditionnelles, les requêtes et réponses HTTP sont considérées comme des événements isolés, alors qu'il s'agit en fait de flux. Vous pouvez utiliser cette propriété dans Node.js pour créer des fonctionnalités intéressantes. Par exemple, les fichiers peuvent être téléchargés et traités en même temps. Étant donné que les données arrivent via le flux, nous pouvons les traiter en temps réel. Cela peut être utilisé pour le codage audio et vidéo en temps réel et pour le proxy entre différentes sources de données (voir section suivante).
Il est facile d'utiliser Node.js comme proxy côté serveur capable de gérer un grand nombre de connexions simultanées de manière non bloquante. Ceci est particulièrement utile pour les proxys de plusieurs services avec des temps de réponse variables, ou pour les scénarios dans lesquels les données sont collectées à partir de plusieurs sources.
Par exemple, le scénario suivant : lorsque le programme côté serveur communique avec des ressources tierces, il extraira des données de différentes sources ou stockera des ressources telles que des images et des vidéos sur des services cloud tiers.
Malgré les serveurs proxy dédiés, si vous ne disposez pas d'une infrastructure proxy sous-jacente ou si vous avez besoin d'un environnement de développement local, Node peut vous être utile.
Revenons à l'application. Un autre exemple qui peut être facilement remplacé par une solution Web en temps réel est le logiciel de trading d'un courtier, utilisé pour suivre les cours des actions, effectuer des calculs, des analyses techniques et créer des graphiques.
Les courtiers pourront facilement changer de poste de travail ou de lieu de travail s'ils optent pour une solution Web en direct. Bientôt, nous pourrions commencer à les voir sur les plages de Floride...
Un autre cas d'utilisation courant où Node-with-web -socket est parfait pour : suivre les visiteurs d'un site Web et fournissant une visualisation en temps réel de leurs interactions. Vous pouvez collecter des statistiques auprès de vos utilisateurs en temps réel et même ouvrir des canaux de communication et engager des interactions ciblées avec vos visiteurs à des points spécifiques de l'entonnoir d'accès, un scénario comme celui-ci peut être trouvé ici : CANDI.
Imaginez si vous pouviez comprendre ce que font vos visiteurs en temps réel, comment amélioreriez-vous votre entreprise ? Vous pouvez désormais le faire en utilisant les sockets bidirectionnels en temps réel de Node.js.
Côté infrastructure,. Par exemple, un fournisseur SaaS qui souhaite fournir une page de surveillance des services à ses utilisateurs (par exemple, Page d'état GitHub). Avec la boucle d'événements Node.js, nous pouvons créer un puissant tableau de bord Web qui vérifie de manière asynchrone l'état du service et utilise des websockets pour transmettre les données au client. Grâce à cette technologie, l'état des entreprises internes et des services publics peut être signalé en temps réel.
Remarque : N'essayez pas de créer des systèmes durs en temps réel (c'est-à-dire des systèmes qui nécessitent des temps de réponse cohérents) dans Node.js. Pour ce genre d'application, Erlang est probablement un meilleur choix .
Node.js avec Express.js peut également créer des applications Web classiques côté serveur . Il y a des partisans et des opposants à cette approche. Voici quelques éléments à considérer :
Avantages :
Inconvénients :
Une alternative à l'informatique gourmande en CPU consiste à créer un environnement compatible MQ hautement évolutif avec des capacités de traitement back-end pour faire de Node un "personnel" front-end et gérer les demandes des clients. de manière asynchrone.
Par exemple, combiner Node.js + Express.js avec Comparing Ruby sur Rails, cette dernière est nettement plus adaptée lorsqu'il s'agit d'accéder aux données relationnelles.
Les outils de base de données relationnelle de Node.js sont encore assez primitifs par rapport à ses concurrents. Rails, d'autre part, fournit des outils prêts à l'emploi de configuration d'accès aux données et de migration de schéma de base de données, en plus d'autres Gems. Rails et frameworks similaires ont des implémentations matures et éprouvées de la couche d'accès aux données Active Record ou Data Mapper, et si vous souhaitez essayer de reproduire ces fonctionnalités en JavaScript pur, alors bonne chance à vous. chance.
Cependant, si vous préférez vraiment tout implémenter en JS, consultez Sequelize et Node ORM2.
Si vous utilisez simplement Node.js comme interface publique tout en utilisant un backend Rails pour accéder à une base de données relationnelle, c'est très bien et ce n'est pas rare.
Node.js n'est pas la meilleure plateforme lorsqu'il s'agit de calculs lourds. Vous ne voulez certainement pas créer un serveur de calcul Fibonacci en utilisant Node.js. En règle générale, toute opération gourmande en CPU annulera tous les avantages de débit fournis par Node via le modèle d'E/S non bloquant et piloté par les événements, puisque toutes les requêtes entrantes seront bloquées pendant que le thread est occupé par le traitement des nombres.
Comme mentionné précédemment, Node.js est monothread et n'utilise qu'un seul cœur de processeur. Lorsqu'il s'agit d'ajouter la concurrence sur les serveurs multicœurs, l'équipe principale de Node a effectué du travail sous la forme du module cluster. Vous pouvez également facilement exécuter plusieurs instances de serveur Node.js derrière un proxy inverse nginx.
Si vous utilisez un cluster, vous devez toujours placer tous les calculs lourds dans des processus en arrière-plan écrits dans un environnement plus approprié et les faire communiquer via un serveur de file d'attente de messages comme RabbitMQ.
Même si tous vos traitements en arrière-plan peuvent initialement s'exécuter sur le même serveur, cette approche a le potentiel d'atteindre une très grande évolutivité. Ces services de traitement en arrière-plan peuvent être facilement distribués sur des serveurs de travail distincts sans qu'il soit nécessaire de configurer la charge du serveur Web frontal.
Bien sûr, vous pouvez utiliser la même approche sur d'autres plateformes, mais avec Node.js, vous obtenez le débit élevé de requêtes/s dont nous avons parlé car chaque requête est une petite tâche très rapide et efficace.
Nous avons discuté de Node.js de la théorie à la pratique, en commençant par ses objectifs et ses ambitions, et en terminant par ses meilleurs points et pièges. Lorsque les gens rencontrent des problèmes avec Node, cela se résume presque toujours à Les opérations de blocage sont la racine de tous les maux - dont 99 % sont directement causés par une mauvaise utilisation de Node.
Rappelez-vous : n'utilisez pas Node.js pour résoudre des problèmes de mise à l'échelle du calcul. Il est conçu pour résoudre les problèmes de mise à l'échelle des E/S, et il le fait très bien .
Ainsi, si votre application ne contient pas d'opérations gourmandes en CPU et n'accède à aucune ressource bloquante, vous pouvez profiter de Node.js et profiter d'applications Web rapides et évolutives.
Adresse originale en anglais : https://medium.com/the-node-js-collection/why-the-hell-would-you-use-node-js-4b053b94ab8e
【Recommandation de tutoriel vidéo : Tutoriel vidéo nodejs 】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!