Как контролировать время безотказной работы 20 веб -сайтов (Ping или HTTP) в node.js/ror

StackOverflow https://stackoverflow.com/questions/4709253

Вопрос

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

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

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

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

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

Предложения?

Огромное спасибо!

Это было полезно?

Решение

GitHub

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

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

Пинг (ICMP)

Сначала я хотел бы знать, хотите ли вы действительно сделать пинг (ICMP) Или, если вы просто хотите знать, возвращается ли веб -сайт с кодом 200 (OK) и измерьте время, которое нужно. Я считаю, что из контекста вы на самом деле не хотите делать пинг, а просто HTTP -запрос и измерять время. Я спрашиваю об этом, потому что (я считаю) пинг из node.js/ruby/python не может быть сделано от обычного пользователя, потому что нам нужны необработанные розетки (root user), чтобы сделать пинг (ICMP) из языка программирования. Я, например, нашел это пинг Скрипт в Python (я также считаю, что я видел простой сценарий рубины где -то, хотя я не очень большой программист Ruby), но требует доступа к корнеу. Я не верю, что есть еще еще модуль пинга для Node.js.

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

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

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

Что вам нужно для достижения такого рода масштаба, это использовать очередь сообщений как, например Редис, Beanstalkd или Gearmand. В масштабах Pingdom One Worker Process не будет его сокращать, но в вашем случае (я полагаю) один работник. Я думаю, что (предположим) Redis будет самой быстрой очередью сообщений из -за расширения C (node.js), но опять же, я должен сравнить его с Beanstalkd, что является еще одной популярной очередью сообщений (но еще не имеет расширения C).

Боюсь, список может вырасти до 20000 веб -сайтов

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

Datastore/Redis

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

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, используя садд.

Выполнять задачи каждые 5 минут

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

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

Однако, что произойдет, когда не отвечает? Что происходит с теми, кто после этого?

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

Обработка URL

От рабочего процесса (пока всего лишь одного было бы достаточно) Сообщение (URL) из Redis с использованием Brpop командование Проверьте время ответа на URL (сообщение) и принесите следующее URL (сообщение) из списка. Я бы, вероятно, сделал бы пару запросов одновременно, чтобы ускорить процесс.

Другие советы

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

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

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

Используйте инструменты мониторинга, такие как Zabbix, Nagios, Blah Blah, которые могут показать различные параметры ваших серверов в массовых числах.

Если вы хотите реализовать его в JS, вы можете выполнить HTTP-запрос с интервалом времени, а затем определить код состояния возврата HTTP и использовать XPath или Regex для проверки определенного элемента верно

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

Если вам любопытно, я создал приложение под названием Pinger, которое делает это. Он построен на Ruby на рельсах и Resque:

https://github.com/austinthecoder/pinger

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

Вы также можете сделать это в node.js, используя Узел-пинг-монитор упаковка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top