2013-09-23 3 views
1

Недавно я изучил node.js, и мне весело переписывать perl-скрипты в неблокирующие скрипты. В настоящее время я пишу сценарий, чтобы выйти и подключиться к некоторым хостам и вытащить некоторые данные. Я вытаскиваю данные соединения из базы данных и хочу ограничить их соединениями x (возможно, 50) за раз, когда новые соединения запускаются, когда они завершены.Ограничение количества подключений в Node.js

Вот код, я играю с:

var net = require('net'); 
var mysql = require('mysql'); 
var mysql_conn = mysql.createConnection({ 
    //connection info... 
}); 

var connect_hash ={}; 


function make_connection (id, ip, port, username, password, cb) { 
     var conn = net.createConnection(port, ip); 
     var completeData = ''; 
     connect_hash[id] = {}; 
     connect_hash.id.ip = ip; 

    // stuff happens here.. 
} 


mysql_conn.query("select id, IP, Port, Username, Password from Hosts", 
    function (err, ne_records, fields){ 
     if (err) throw err; 

     ne_records.forEach(function(host){ 
       make_connection(host.id, host.IP, host.Port, host.Username, host.Password, function(attempt) { 
         delete connection_hash[id]; 
         db_save (attempt); 
       }); 
     }); 
}); 

Как написано прямо сейчас, это просто открытые соединения с каждого хоста в таблице и делать вещи на них. Мне бы очень хотелось, чтобы он открыл определенное число за раз, и только начинайте новые соединения, когда старые выполняются и удаляются из connection_hash. Есть ли способ сделать это?

+0

В псевдо-болтовне: создайте объект, который содержит очередь, нажмите в очередь, добавьте событие в очередь, проверьте текущие подключения, если ниже, запустите соединение мгновенно и удалите, если выше, держитесь в очереди и на завершенных событиях данных о посылке соединения из очереди, если не пуст, и начать это соединение? – Wrikken

+0

Я также заметил [строки потокового запроса узла-mysql] (https://github.com/felixge/node-mysql#streaming-query-rows). Возможно, я мог бы это использовать. –

+0

@coding_hero: потоковые строки запросов, вероятно, не будут делать слишком много для вас, так как вы получите результаты с сервера MySQL * намного быстрее, чем сможете выполнять свои сетевые запросы. Другими словами, результаты SQL будут поступать в течение секунды, и вы вернетесь туда, где вы начали: одновременно добавляете тонны соединений (± 1 с). – josh3736

ответ

1

Это просто – держать очередь хостов подключаемых к и только открывать n соединений одновременно. Когда соединение завершается (или выходит из строя), запустите следующий в очереди.

Возможно, вы захотите взглянуть на то, как реализован HTTP Agent class. Он делает то, что вы пытаетесь выполнить для HTTP-запросов.

+0

О, дух. Иногда меня путают, потому что узел не блокирует, и я забываю, что все мои старые знания в программировании все еще работают. –

Смежные вопросы