Maison > interface Web > Questions et réponses frontales > Comment améliorer la stabilité de nodejs

Comment améliorer la stabilité de nodejs

青灯夜游
Libérer: 2022-01-13 17:03:51
original
2355 Les gens l'ont consulté

Méthodes pour améliorer la stabilité de nodejs : 1. Maintenir une bonne structure de code ; 2. Utilisez "try~catch" pour intercepter les exceptions ; 3. Utilisez le module de domaine pour gérer les exceptions du programme ; 4. Utilisez le module log4js pour enregistrer les journaux ; ; 5. Utilisez le module éternel pour gérer nodejs.

Comment améliorer la stabilité de nodejs

L'environnement d'exploitation de ce tutoriel : système windows7, nodejs version 12.19.0, ordinateur DELL G3.

Améliorer la stabilité et la robustesse du programme nodejs

J'ai vu quelques posts sur Internet, se plaignant et remettant en question la stabilité du programme nodejs, pourquoi ? Tout d'abord, cela a peut-être quelque chose à voir avec JavaScript. Node est implémenté avec JavaScript, et JavaScript est également connu comme « le langage le plus mal compris au monde ». Nous pouvons jeter un œil à ce que le fondateur de nodejs a dit, et nous pouvons prendre en compte. un coup d'oeil.Dans cet article, pourquoi node utilise-t-il javascript pour l'implémenter ?Deuxièmement, nodejs est encore jeune après tout, et le site officiel indique également l'état actuel de ce module dans certains modules.

J'ai pris le temps de réfléchir à ce problème au cours des deux derniers jours. Je pense que la première fonction de notre programme devrait être indépendante. Si une fonction est anormale, elle ne devrait pas affecter une autre fonction normale, et l'ensemble du programme ne devrait pas l'être. affecté. Deuxièmement, même si le programme plante, nous devrions avoir un programme pour démarrer automatiquement. De plus, nous devrions enregistrer des journaux pour nous aider à suivre le problème. Je pense que la stabilité de nodejs peut être améliorée principalement à partir des aspects suivants :

1) Maintenir une bonne structure de code :

Nous savons que le nœud est à thread unique, non bloquant, asynchrone par défaut et gère les io ultérieures. processus via des rappels. S'il y a trop de niveaux imbriqués, cela entraînera inévitablement une confusion dans la structure logique du code et ne sera pas propice à la maintenance et aux mises à niveau. Vous pouvez utiliser async, un module de contrôle de processus asynchrone, pour clarifier notre logique de code.

2) Utilisez process.on('uncaughtException', function(err){...}); pour gérer les erreurs non détectées.

3) Utilisez try~catch pour intercepter les exceptions :

Cela ne peut résoudre qu'une partie du problème, pas tout. Comme mentionné ci-dessus, comme le nœud est à thread unique et non bloquant, la valeur par défaut est asynchrone, via des rappels Pour gérer le processus ultérieur, try~catch ne peut pas capturer l'erreur dans le rappel. Comment capturer l'erreur dans le rappel Vous pouvez utiliser le module de domaine

4) Utilisez le module de domaine pour gérer les exceptions du programme.

Jetez d'abord un œil à l'explication de domain : domain est une sous-classe de la classe EventEmitter. Écoutez son événement d'erreur pour gérer les erreurs qu'il capture. Il fournit un moyen de gérer plusieurs opérations d’E/S différentes en tant que groupe unique. Si un déclencheur d'événement ou un rappel enregistré sur le domaine déclenche un événement « erreur » ou génère une erreur, l'objet de domaine sera averti. Au lieu de perdre directement le contexte de cette erreur du gestionnaire `process.on('uncaughtException')', cela ne provoquera pas la fermeture immédiate du programme à cause de cette erreur accompagnée d'un code d'erreur.

Comment utiliser le module de domaine ? Regardez un exemple :

serverDomain.run(function() {
  // 服务器在serverDomain的作用域内被创建
  http.createServer(function(req, res) {
    // req和res同样在serverDomain的作用域内被创建
    // 但是,我们想对于每一个请求使用一个不一样的域。
    // 所以我们首先创建一个域,然后将req和res添加到这个域上。
    var reqd = domain.create();
    reqd.add(req);
    reqd.add(res);
    reqd.on('error', function(er) {
      console.error('Error', er, req.url);
      try {
        res.writeHead(500);
        res.end('Error occurred, sorry.');
      } catch (er) {
        console.error('Error sending 500', er, req.url);
      }
    });
  }).listen(1337);    
});
```
Copier après la connexion

Description : créez d'abord un domaine (domain.create()), puis ajoutez le distributeur qui doit être surveillé au domaine, et enfin liez un événement d'erreur au domaine afin qu'il puisse être surveillé. .

Regardez un autre exemple :

var d = domain.create();
d.on('error', function(er) {
  console.error('Caught error!', er);
});
d.run(function() {
  process.nextTick(function() {
    setTimeout(function() { // 模拟几个不同的异步的东西
      fs.open('non-existent file', 'r', function(er, fd) {
        if (er) throw er;
        // 继续。。。
      });
    }, 100);
  });
});
Copier après la connexion

Explication : créez d'abord un domaine, liez un événement d'erreur au domaine, puis fournissez une fonction qui peut être exécutée dans le contexte du domaine

Et s'il y a un rappel ? Vous pouvez l'utiliser comme ça

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});
Copier après la connexion
Copier après la connexion

Bien sûr, vous pouvez également l'utiliser comme ça

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});
Copier après la connexion
Copier après la connexion

Cette fonction est presque exactement la même que domain.bind(callback). Cependant, en plus de détecter les erreurs générées, il intercepte également l'objet Error transmis à cette fonction comme premier argument.

5) Utilisez le module log4js pour enregistrer les journaux

Log4js est un outil de gestion de journaux très puissant. Vous pouvez consulter ce projet github : https://github.com/nomiddlename/log4js-node

6) Utilisez le module Forever pour gérer Nodejs

 Forever est un module de gestion côté serveur de Nodejs, un outil de ligne de commande qui peut démarrer et arrêter les applications. Forever est entièrement basé sur des opérations de ligne de commande.Sous la gestion du processus Forever, un sous-processus de nœud est créé et l'état d'exécution du sous-processus de nœud est surveillé via le moniteur une fois le fichier ou le processus mis à jour. se bloque, le serveur de nœuds redémarrera automatiquement pour toujours pour garantir que l'application fonctionne normalement. Très simple à utiliser.

Vous pouvez faire attention à ce projet : https://github.com/nodejitsu/forever

Mais pour toujours n'est pas une panacée, et il souffre également des problèmes suivants :

  • Surveillance et surveillance limitées fonctions de journalisation
  • Mauvaise prise en charge de la configuration de la gestion des processus
  • Ne prend pas en charge les clusters
  • La base de code est vieillissante (ce qui signifie des échecs fréquents lors de la mise à niveau de node.js)

Vous trouverez ci-joint le code de test de cet article : https://github .com/yupeng528/node-error

Pour plus de connaissances sur les nœuds, veuillez visiter : tutoriel 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal