Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Создание сервиса измерения отзывчивости веб сервера (https://javascript.ru/forum/node-js-io-js/54623-sozdanie-servisa-izmereniya-otzyvchivosti-veb-servera.html)

MrVik 25.03.2015 12:47

Создание сервиса измерения отзывчивости веб сервера
 
Всем добрый день.
По долгу службы появилась потребность проверять доступность веб сервера, а именно замерять время ответа.
Сделал своеобразный jmeter на node, но столкнулся с парой трудностей.
var http = require("http");

var req_total = 10,
    req_per_sec = 30,
    i = 0;

var intervalID = setInterval(function timerik()  {
    i++;
    console.log(i); //write to console  task number
    console.time(i + ' latency');

    if(i == req_total){
        clearInterval(intervalID); //end of Life
    }

    http.get("http://www.yandex.ru", function (response){
        console.log(i +" result = " + response.statusCode); //write to console task number and statusCode
        console.timeEnd(i +' latency'); //write to console operation timeout
    });

}, 1000/req_per_sec);

При выполнении получаем следующее:
"C:\Program Files\nodejs\node.exe" run4.js
1
2
3
3 result = 200
3 latency: 24ms
4
4 result = 200
4 latency: 11ms
4 result = 200
4 latency: 43ms
5
6
6 result = 200
6 latency: 12ms
7
7 result = 200
7 latency: 8ms
8
9
10

Process finished with exit code 0

1ая из этих проблем заключается в том что номер выполнения операции не всегда совпадет с действительным номером вызова, к примеру в результате можем увидеть это в 8-11 строках результата. Я предполагаю что это связано с вызовом http метода который в момент отправки результата использует идентификатор текущей сессии. наверное это можно будет исправить передачей аргумента сессии внутрь функции, но как это сделать я не понимаю.

2ая проблема заключается в том что отображается результат не всех запросов. Скорей всего это связано с тем что запросы не успевают отработать до момента окончания цикла в setinterval. И после его окончания приложение перестает работать и соответственно результат уже не доходит.Я предполагаю что эту проблему можно исправить сделав сервис который будет следить за открытыми соединениями, но я не представляю как это сделать и не уверен что это действительно правильное решение.

Подскажите как можно решить эти 2 проблемы?

MrVik 27.03.2015 15:21

На буржуйском форуме подсказали как решить первую проблему, вот код:
var http = require("http");

var req_total = 10,
    req_per_sec = 30,
    i = 0;

var intervalID = setInterval(function timerik()  {

    // Create a new local variable bound to this closure's invocation's scope.
    var j = ++i;

    if(j == req_total){
        clearInterval(intervalID); //end of Life
    }

    console.log(j); //write to console  task number
    console.time(j +' latency');


    http.get("http://www.yandex.ru", function (response){
        console.log(j +" result = " + response.statusCode); //write to console task number and statusCode
        console.timeEnd(j +' latency'); //write to console operation timeout
    });

}, 1000/req_per_sec);

В общем все просто, сделали переменную J в которую будет сохранятся идентификатор i, при этом переменная будет не такая глобальная как первая. Теперь результаты запросов будут нормально отображаться. По второй проблеме все глухо, получаю ответ не по всем запросам, а лишь по некоторым из них, остальная часть продолжает теряться.:
"C:\Program Files\nodejs\node.exe" run4.js
1
2
3
1 result = 200
1 latency: 111ms
4
2 result = 200
2 latency: 95ms
5
3 result = 200
3 latency: 99ms
6
4 result = 200
4 latency: 109ms
7
5 result = 200
5 latency: 105ms
8
9
10

Process finished with exit code 0

Как мы видим результат есть только с 1ого по 5ый, оставшиеся запросы продолжают теряться из-за того что приложение перестает обрабатываться.

MetaDriver 29.03.2015 21:17

Цитата:

Сообщение от MrVik (Сообщение 363573)
..... По второй проблеме все глухо, получаю ответ не по всем запросам, а лишь по некоторым из них, остальная часть продолжает теряться.......
Как мы видим результат есть только с 1ого по 5ый, оставшиеся запросы продолжают теряться из-за того что приложение перестает обрабатываться.

На производительных (раскрученных) сайтах, ограничение количества ответов (r/мин или r/сек) на один и тот же IP - обычное дело. Причин для таких ограничений много, самая простая - защита от DDOS-атак. Можно ещё навскидку штук несколько назвать. Так что универсального "одноайпишного" решения не существует в принципе (для тестирования чужих сервисов).

MrVik 16.04.2015 18:03

Цитата:

Сообщение от MetaDriver (Сообщение 363798)
На производительных (раскрученных) сайтах, ограничение количества ответов (r/мин или r/сек) на один и тот же IP - обычное дело. Причин для таких ограничений много, самая простая - защита от DDOS-атак. Можно ещё навскидку штук несколько назвать. Так что универсального "одноайпишного" решения не существует в принципе (для тестирования чужих сервисов).

Тут дело не в ограничении портала, а в том что запросы не возвращаются. Если какое-то ограничение и будет, то в ответ мы увидим не код 200, а что-то другое, а здесь мы не видим никакого ответа.

theKingOfJava 16.04.2015 19:29

может вот так как то?
Http=require("http")
req_total=10
req_per_sec=30
i=0

Request={
 get: function(){
  var label="latency "+(i++)
  console.time(label)
  Http.get("http://www.yandex.ru", function(response){
    console.log(response.statusCode)
    console.timeEnd(label)
    Request.next()
  })
 },
 next: function(){
   if(i==req_total) return
   setTimeout(Request.get, 1000/req_per_sec)
 }
}

Request.get()



//>>>> 200
//>>>> latency 0: 1117ms
//>>>> 200
//>>>> latency 1: 110ms
//>>>> 200
//>>>> latency 2: 99ms
//>>>> 200
//>>>> latency 3: 95ms
//>>>> 200
//>>>> latency 4: 94ms
//>>>> 200
//>>>> latency 5: 96ms
//>>>> 200
//>>>> latency 6: 108ms
//>>>> 200
//>>>> latency 7: 99ms
//>>>> 200
//>>>> latency 8: 109ms
//>>>> 200
//>>>> latency 9: 100ms

MrVik 17.04.2015 10:01

Всем откликнувшимся огромное спасибо за помощь!
В общем оказалось что в версии ноды 0.10.18 есть какой-то баг, и даже последний пример в ней работал не корректно. Обновил до версии 0.12.2 и все встало на свои места.


Часовой пояс GMT +3, время: 05:39.