Как контролировать время безотказной работы 20 веб-сайтов (Ping или HTTP) в Node.js / RoR - PullRequest
8 голосов
/ 17 января 2011

Каков наилучший способ пинговать список из 20 веб-сайтов каждые 5 минут (например), чтобы узнать, отвечает ли сайт HTTP 202 или нет?

Идея проста - сохранить 20 URL-адресов в базе данных и просто запустить базу данных и пропинговать каждый из них. Однако что происходит, когда никто не отвечает? Что происходит с теми, кто после этого?

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

По сути, я описываю, как работают PingDom, UptimeRobot и тому подобное.

Я строю эту систему, используя node.js и Ruby on Rails. Я также склонен использовать MongoDB для сохранения истории всех пингов и результатов мониторинга.

Предложения

Спасибо большое!

Ответы [ 6 ]

9 голосов
/ 17 января 2011

Github

Мне очень нравится node.js, и я хотел бы заняться этой проблемой и, надеюсь, скоро поделюсь некоторым кодом на github для достижения этой цели.Имейте в виду, что сейчас у меня есть только очень базовая настройка, размещенная на https://github.com/alfredwesterveld/freakinping

. Каков наилучший способ пинговать список из 20 веб-сайтов каждые 5 минут (например), чтобы узнать,сайт отвечает HTTP 202 или нет?

PING (ICMP)

Сначала я хотел бы узнать, действительно ли вы хотите ping (ICMP) или если вы просто хотите узнать, вернется ли веб-сайт с кодом 200 (ОК) и измерить время, которое требуется.Из контекста я полагаю, что вы на самом деле не хотите выполнять пинг, а просто запрашиваете http и измеряете время.Я спрашиваю об этом, потому что (я полагаю), ping из node.js / ruby ​​/ python не может быть выполнен от обычного пользователя, потому что нам нужны необработанные сокеты (пользователь root), чтобы выполнить pinging (ICMP) из языка программирования.Я, например, нашел этот скрипт ping в python (я также считаю, что где-то видел простой скрипт ruby, хотя я не очень большой ruby-программист), но требует root-доступа.Я не верю, что даже существует модуль ping для node.js.

Очередь сообщений

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

По сути, я описываю, как PingDom, UptimeRobot илюбит работать.

Чтобы достичь такого масштаба, нужно использовать очередь сообщений , например, redis , beanstalkd или снаряжениеВ масштабе PingDom один рабочий процесс не собирается сокращать его, но в вашем случае это (я предполагаю) один рабочий сделает.Я думаю (предположим), что redis будет самой быстрой очередью сообщений из-за расширения C (node.js), но, опять же, я должен сравнить его с beanstalkd, который является другой популярной очередью сообщений (но еще не имеет расширения C).

Боюсь, что список может увеличиться до 20000 веб-сайтов

Если вы достигнете такого масштаба, вам может потребоваться разместить несколько блоков (много рабочих потоков / процессов).), чтобы справиться с нагрузкой, но вы еще не в таком масштабе, а node.js безумно быстр.Он может даже справиться с этой нагрузкой даже с одним блоком, хотя я точно не знаю (вам нужно сделать / запустить несколько тестов).

Datastore / Redis

Iдумаю, что это может быть достигнуто довольно легко в node.js (мне очень нравится node.js).Я бы использовал это как redis в качестве хранилища данных, потому что это INSANE FAST!

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

с использованием node_redis (с библиотекой hredis (node.js) c).Я бы добавил URL-адреса в redis, используя sadd .

Запуск задач каждые 5 минут

Этого можно достичь без особых усилий.Я бы использовал setInterval(callback, delay, [arg], [...]) для многократного тестирования времени отклика серверов.Получить все URL-адреса на callback от Redis, используя smembers .Я бы поместил все URL-адреса (сообщения) в очередь сообщений, используя rpush .

Проверка ответа (время)

Однако, что происходит, если этого не сделать?т ответы?Что будет с теми, кто после этого?

Возможно, я не совсем понимаю это предложение, но оно здесь.Если кто-то терпит неудачу, он просто терпит неудачу.Вы можете попытаться проверить ответ (время) снова через 5 секунд или что-то еще, чтобы увидеть, если он в сети.Точный алгоритм для этого должен быть разработан.Последующие после этого не должны иметь ничего общего с предыдущими URL-адресами, если только они не принадлежат одному серверу.Кроме того, я думаю, что вы должны подумать, потому что тогда вам не следует пинговать все эти URL-адреса на одном и том же сервере одновременно, а ставить их в очередь или что-то в этом роде.

Обработка URL

Из рабочего процесса (на данный момент достаточно одного) получить сообщение (URL) из redis с помощью команды brpop . проверьте время ответа для URL (сообщения) и выберите следующий URL (сообщение) из списка. Вероятно, я бы сделал пару запросов одновременно, чтобы ускорить процесс.

5 голосов
/ 03 мая 2012

Не существует «базового способа», так как вы должны обрабатывать множество вариантов использования:

  • http перенаправления,
  • https страниц,
  • тайм-ауты запроса,
  • загрузка процессора сервера, который вы используете для проверки связи,
  • тип отчета, который вам нужен (доступность? Время работы? Отзывчивость? Время простоя?)
  • как агрегировать qosизмерения по времени
  • время жизни собранных вами данных (пинг десятков целей каждые пять минут быстро выдает много данных)
  • оповещения в реальном времени
  • и т. д.

Pingdom и тому подобное не являются «базовыми» инструментами, и если вы хотите что-то подобное, вы можете захотеть заплатить за это или воспользоваться существующей альтернативой с открытым исходным кодом.Я знаю это точно, потому что я сам создал приложение для удаленного мониторинга.Он называется Uptime, он написан на Node.js и MongoDB и размещен на GitHub (https://github.com/fzaninotto/uptime). На его разработку ушло несколько недель тяжелой работы, так что поверьте: это не просто.

0 голосов
/ 09 февраля 2015

Вы также можете сделать это в Node.js, используя пакет node-ping-monitor .

0 голосов
/ 30 апреля 2014

Есть несколько бесплатных качественных услуг, которые обеспечивают нам очень стабильную проверку времени работы сайта и уведомление. Вы можете проверить эту инструкцию и просмотреть http://fastjoomlahost.com/how-to-monitor-website-up-time

0 голосов
/ 09 ноября 2011

Если вам интересно, я создал приложение под названием Pinger, которое делает это. Он построен на Ruby on Rails и Resque:

https://github.com/austinthecoder/pinger

0 голосов
/ 17 января 2011

используйте инструменты мониторинга, такие как zabbix, nagios, blah blah, которые могут измерять различные параметры ваших серверов в массовых числах.

если вы хотите реализовать его в js, вы можете выполнить http-запрос с временным интервалом, затем определить код состояния возврата http и использовать xpath или regex для проверки правильности определенного элемента

для ruby, процесса демона и использования пула потоков (идея многопоточности) и открытого URI для просмотра кода http и содержимого, используйте xpath для проверки правильности поведения содержимого.

...