Connection HTTP simultanées en node.js

Afin de parcourir une liste d’1 millions d’URL nous voulons exécuter les requêtes en parallel mais pas toute en même temps.

Le problème: 1 millions de requettes en concurrence c’est trop

var http = require("http");

var totalUrl = 10000000;
for( var i = 0; i < totalUrl; i++ ) {
    getUrl(i);
}


function getUrl(idToFetch){

	var options = {
	  host: 'www.monsite.fr',
	  port: 80,
	  path: '/page.php?id='+idToFetch',
	  agent: false,
	  pageId: idToFetch
	};

	http.get(options, function(res) {
		var pageData = "";

		res.resume();
		res.on('data', function (chunk) {
			if(res.statusCode == 200){
				pageData +=chunk;
			}
		});

		res.on('end', function() {
			console.log("récupération de l'ID : "+options.pageId);
			// gestion du retour HTML ici
		});

	}).on('error', function(e) {
	   console.log("Erreur: " + options.host + "n" + e.message);
	});
}

La solution: récupérer les URL 10 par 10

En exécutant 10 connections simultanément notre application sera utilisable.
L’idée est de crée 10 “worker” qui ce rappellerons d’eux même une fois la page récupérée.
Ainsi ces 10 “worker” managerons chacun leurs propre connections.

var totalUrl = 10000000;
var currentUrl = 0;

var totalLoop = 10;
for( var i = 0; i < totalLoop; i++ ) {
	getNextUrl();
}

function getNextUrl(){

	var idToFetch = currentUrl++;

	if(current >= totalUrl){
		console.log("Plus rien n'a faire pour ce worker");
		return;
	}

	var options = {
	  host: 'www.monsite.fr',
	  port: 80,
	  path: '/page.php?id='+idToFetch,
	  agent: false,
	  pageId: idToFetch
	};

	http.get(options, function(res) {
		var pageData = "";

		res.resume();
		res.on('data', function (chunk) {
			if(res.statusCode == 200){
				pageData +=chunk;
			}
		});

		res.on('end', function() {
			console.log("récupération de l'ID : "+options.pageId);
			// gestion du retour HTML ici

			getNextUrl(); //Appel n'URL suivante
		});

	}).on('error', function(e) {
	   console.log("Erreur: " + options.host + "n" + e.message);
	   getNextUrl();
	});
}

Laisser un commentaire