Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.03.2015, 11:47
Аватар для MrVik
Новичок на форуме
Отправить личное сообщение для MrVik Посмотреть профиль Найти все сообщения от MrVik
 
Регистрация: 25.03.2015
Сообщений: 4

Создание сервиса измерения отзывчивости веб сервера
Всем добрый день.
По долгу службы появилась потребность проверять доступность веб сервера, а именно замерять время ответа.
Сделал своеобразный 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, 25.03.2015 в 12:00.
Ответить с цитированием
  #2 (permalink)  
Старый 27.03.2015, 14:21
Аватар для MrVik
Новичок на форуме
Отправить личное сообщение для MrVik Посмотреть профиль Найти все сообщения от MrVik
 
Регистрация: 25.03.2015
Сообщений: 4

На буржуйском форуме подсказали как решить первую проблему, вот код:
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ый, оставшиеся запросы продолжают теряться из-за того что приложение перестает обрабатываться.
Ответить с цитированием
  #3 (permalink)  
Старый 29.03.2015, 21:17
Аватар для MetaDriver
Аспирант
Отправить личное сообщение для MetaDriver Посмотреть профиль Найти все сообщения от MetaDriver
 
Регистрация: 24.04.2014
Сообщений: 65

Сообщение от MrVik Посмотреть сообщение
..... По второй проблеме все глухо, получаю ответ не по всем запросам, а лишь по некоторым из них, остальная часть продолжает теряться.......
Как мы видим результат есть только с 1ого по 5ый, оставшиеся запросы продолжают теряться из-за того что приложение перестает обрабатываться.
На производительных (раскрученных) сайтах, ограничение количества ответов (r/мин или r/сек) на один и тот же IP - обычное дело. Причин для таких ограничений много, самая простая - защита от DDOS-атак. Можно ещё навскидку штук несколько назвать. Так что универсального "одноайпишного" решения не существует в принципе (для тестирования чужих сервисов).
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2015, 18:03
Аватар для MrVik
Новичок на форуме
Отправить личное сообщение для MrVik Посмотреть профиль Найти все сообщения от MrVik
 
Регистрация: 25.03.2015
Сообщений: 4

Сообщение от MetaDriver Посмотреть сообщение
На производительных (раскрученных) сайтах, ограничение количества ответов (r/мин или r/сек) на один и тот же IP - обычное дело. Причин для таких ограничений много, самая простая - защита от DDOS-атак. Можно ещё навскидку штук несколько назвать. Так что универсального "одноайпишного" решения не существует в принципе (для тестирования чужих сервисов).
Тут дело не в ограничении портала, а в том что запросы не возвращаются. Если какое-то ограничение и будет, то в ответ мы увидим не код 200, а что-то другое, а здесь мы не видим никакого ответа.
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2015, 19:29
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

может вот так как то?
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
Ответить с цитированием
  #6 (permalink)  
Старый 17.04.2015, 10:01
Аватар для MrVik
Новичок на форуме
Отправить личное сообщение для MrVik Посмотреть профиль Найти все сообщения от MrVik
 
Регистрация: 25.03.2015
Сообщений: 4

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 13:05