Est-il prudent d’utiliser et de mettre à jour des variables globales dans NodeJS?

J’ai un serveur de nœud pour charger certains scripts qui peuvent être écrits par n’importe qui. Je comprends que lorsque je lance mon serveur de nœud, les modules se chargent pour la première fois dans l’étendue globale. Quand on demande une page, celle-ci est chargée par le rappel “start server”; et je peux utiliser tous les modules déjà chargés par requête. Mais je n’ai pas rencontré de script dans lequel les variables globales sont modifiées pendant le temps de requête et affectent toutes les autres instances du processus (peut-être y en a-t-il).

Ma question est la suivante: dans quelle mesure est-il sûr, en cas de panne du serveur, de modifier les données globales? En outre, supposons que j’ai écrit un mécanisme de locking approprié qui “suspend” le serveur pour toutes les instances pendant très peu de temps jusqu’à ce que les données appropriées soient chargées.

Node.js est un seul thread. Il est donc impossible que deux requêtes distinctes modifient simultanément une variable globale. Donc en théorie, c’est sûr.

Cependant, si vous faites des choses comme garder les données de l’utilisateur A temporairement dans une variable, puis lorsque l’utilisateur A soumettra une autre demande ultérieurement, utilisez cette variable, sachez que l’utilisateur B peut faire une demande entre deux modifications potentielles.

Dans de tels cas, conserver des valeurs globales dans des tableaux ou des objects constitue un moyen de séparer les données utilisateur. Une autre stratégie consiste à utiliser une fermeture qui est une pratique courante dans les bibliothèques à forte intensité de rappel ou orientées événement / promesse telles que socket.io.

Lorsqu’il s’agit de multithreading ou de multitraitement, l’API de style de transmission de messages, comme le module de cluster intégré du nœud, offre les mêmes garanties de ne pas gommer les globaux, chaque processus ayant son propre global. Il existe plusieurs modules multithreading implémentés de la même manière – une instance de nœud par thread. Cependant, les API de style de mémoire partagée ne peuvent pas offrir de telles garanties, car chaque thread est maintenant un véritable thread de système d’exploitation qui peut se préempter et surcharger la mémoire des autres. Donc, si vous décidez d’essayer un des modules multithreading, soyez conscient de ce problème.

Il est possible d’implémenter une fausse mémoire partagée en utilisant le transfert de messages, un peu comme on le fait avec ajax ou socket.io. J’évitais donc personnellement le multithreading de style mémoire partagée, sauf si j’avais vraiment, vraiment besoin de travailler en coopération sur un très grand dataset qui enlèverait toute architecture de transmission de messages.

Encore une fois, rappelez-vous, le Web est une architecture géante de transmission de messages composée de HTML, XML et JSON. Donc, le message passe à l’échelle de la taille Google.