Maison >interface Web >Questions et réponses frontales >nodejs requêtes multiples simultanées 502

nodejs requêtes multiples simultanées 502

WBOY
WBOYoriginal
2023-05-25 10:23:36980parcourir

Récemment, j'ai rencontré un problème lors de l'utilisation de nodejs : lors de l'envoi de plusieurs requêtes simultanées, une erreur 502 était renvoyée. J'ai passé du temps à rechercher ce problème et j'ai finalement trouvé une solution. Dans cet article, je partagerai mon expérience dans l'espoir d'aider d'autres personnes rencontrant le même problème.

Tout d’abord, nous devons comprendre ce qu’est une erreur 502. Une erreur 502 signifie que le serveur ne peut pas traiter correctement une demande d'un client, généralement parce qu'une erreur ou un délai d'attente s'est produit lors de la demande. Dans nodejs, cette erreur est généralement causée par le blocage de la requête ou par un délai d'expiration incorrect de la requête.

Voyons ensuite comment envoyer plusieurs requêtes simultanées dans nodejs. Dans nodejs, nous pouvons utiliser async.parallel pour envoyer plusieurs requêtes simultanées. L'exemple de code est le suivant :

const async = require('async');
const request = require('request');

const urls = [
  'https://www.example.com/page1',
  'https://www.example.com/page2',
  'https://www.example.com/page3',
  // Add more URLs here.
];

async.parallel(
  urls.map(url => callback => request(url, (err, res, body) => callback(err, body))),
  (err, results) => {
    if (err) {
      console.error(err);
      return;
    }

    console.log(results);
  },
);

Dans le code ci-dessus, nous utilisons async.parallel pour envoyer plusieurs requêtes en parallèle. Nous plaçons les URL que nous souhaitons demander dans un tableau, puis utilisons la fonction map pour les convertir en un ensemble de requêtes. Nous utilisons ensuite async.parallel pour envoyer ces requêtes en parallèle et collecter les résultats une fois la requête terminée.

Voyons maintenant comment résoudre l’erreur 502. Au cours de mes recherches, j'ai découvert que les erreurs 502 sont généralement causées par une requête bloquée ou un délai d'expiration mal défini pour la requête. Si une requête est bloquée, c'est peut-être parce que nous n'avons pas de fonction de rappel qui gère correctement la requête, ou parce que nous ne libérons pas la ressource pendant la requête.

Une solution consiste à utiliser l'option keep-alive fournie par la bibliothèque de requêtes. L'option keep-alive permet de conserver les requêtes dans le pool de connexions et de réutiliser les connexions TCP existantes, réduisant ainsi la charge sur le serveur et améliorant les performances. Nous pouvons ajouter ceci aux options de requête :

const request = require('request').defaults({ forever: true });

Une autre façon est d'éviter que la requête ne soit bloquée en ajoutant une option de délai d'attente à la requête. Nous pouvons ajouter l'option timeout aux options de requête :

const request = require('request').defaults({ timeout: 5000 });

Le code ci-dessus définit le timeout à 5000 millisecondes, ce qui signifie que si la requête dépasse 5 secondes, une erreur de timeout sera générée.

Enfin, si vous rencontrez également des erreurs 502, vous pouvez essayer d'envoyer les demandes par lots au lieu de toutes en une seule fois. Cela peut réduire la charge sur le serveur et réduire la probabilité d'erreurs 502. L'exemple de code est le suivant :

const async = require('async');
const request = require('request').defaults({ timeout: 5000 });

const urls = [
  'https://www.example.com/page1',
  'https://www.example.com/page2',
  'https://www.example.com/page3',
  // Add more URLs here.
];

const chunkSize = 2; // Set the maximum number of requests to send at once.

async.eachLimit(
  urls,
  chunkSize,
  (url, callback) => request(url, (err, res, body) => callback(err, body)),
  (err) => {
    if (err) {
      console.error(err);
      return;
    }

    console.log('All requests completed successfully.');
  },
);

Dans le code ci-dessus, nous avons divisé les requêtes en groupes de deux et utilisé async.eachLimit pour limiter le nombre maximum de requêtes envoyées en même temps. Cela peut réduire la charge sur le serveur et réduire la probabilité d'erreurs 502.

En bref, si vous rencontrez le problème de l'erreur 502 de requête simultanée nodejs, vous pouvez essayer d'utiliser la méthode ci-dessus pour le résoudre. En prêtant attention aux fonctions de rappel des demandes et aux paramètres de délai d'expiration, vous pouvez réduire le risque de blocage des demandes. De plus, l'envoi de requêtes par lots peut éviter les situations de surcharge et réduire la probabilité d'erreurs 502.

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!

Déclaration:
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