2017-09-26 1 views
0

Je tente de créer une fonction Azure qui génère un grand nombre de requêtes HTTP sortantes. Périodiquement, il semble atteindre une limite et toutes les demandes expirent pendant quelques minutes. Ensuite, il recommence à fonctionner et les demandes passent. De la recherche autour de, il semble que cela soit dû à l'épuisement du port sur la machine exécutant la fonction, mais je ne comprends pas comment déboguer cela ou contourner dans une application Node utilisant la bibliothèque request. Il semble également que Node est supposé regrouper les connexions pour éviter cela. Je ne suis pas du tout sûr que l'épuisement de port est le problème, puisque je ne peux pas utiliser netstat sur la fonction. Et je n'ai jamais un problème en cours d'exécution sur mon ordinateur portable.Azure Function - épuisement de port dans l'application de noeud

est ici une simple fonction Azure qui tire beaucoup de demandes, un à la fois, et illustre cette question:

const cp = require('child_process'); 
const request = require('request'); 

module.exports = function (context, myTimer) { 
    context.log('Starting'); 

    function doCall(cb) { 
     const url = 'https://jsonplaceholder.typicode.com/posts'; 
     request(url, (err) => { 
      if (err) { 
       context.log("error: " + err.toString()); 
      } 

      cb(); 
     }); 
    } 

    let i = 500; 
    doCall(function iterate() { 
     if (i-- > 0) { 
      context.log('iterate ' + i); 
      doCall(iterate); 
     } else { 
      context.log('done'); 
      context.done(); 
     } 
    }); 
}; 

Je vois courir avec succès, le temps pour quelques minutes, courir avec succès à nouveau ..

+0

réduisant peut-être du côté de la piscine aiderait. Pas super familier avec Node, mais voir quelque chose sur https://stackoverflow.com/questions/19043355/how-to-use-request-js-node-js-module-pools est utile. –

Répondre

0

@ david-ebbo, votre suggestion a été très utile. À partir du lien que vous avez posté, je peux utiliser un agent http pour limiter le pool de sockets. Il faut un certain temps pour s'exécuter, mais aucune requête ne prend fin.

Mon exemple ci-dessus ressemble maintenant à ceci:

const cp = require('child_process'); 
const request = require('request'); 
const http = require('http'); 

module.exports = function (context, myTimer) { 
    context.log('Starting with agent'); 
    const pool = new http.Agent(); 
    pool.maxSockets = 4; 

    function doCall(cb) { 
     const url = 'https://jsonplaceholder.typicode.com/posts'; 
     request({ url, pool }, (err) => { 
      if (err) { 
       context.log("error: " + err.toString()); 
      } 

      cb(); 
     }); 
    } 

    let i = 500; 
    doCall(function iterate() { 
     if (i-- > 0) { 
      context.log('iterate ' + i); 
      doCall(iterate); 
     } else { 
      context.log('done'); 
      context.done(); 
     } 
    }); 
};