Создание сервиса измерения отзывчивости веб сервера
Всем добрый день.
По долгу службы появилась потребность проверять доступность веб сервера, а именно замерять время ответа. Сделал своеобразный 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 проблемы? |
На буржуйском форуме подсказали как решить первую проблему, вот код:
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ый, оставшиеся запросы продолжают теряться из-за того что приложение перестает обрабатываться. |
Цитата:
|
Цитата:
|
может вот так как то?
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 |
Всем откликнувшимся огромное спасибо за помощь!
В общем оказалось что в версии ноды 0.10.18 есть какой-то баг, и даже последний пример в ней работал не корректно. Обновил до версии 0.12.2 и все встало на свои места. |
Часовой пояс GMT +3, время: 05:39. |