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 (сообщение) из списка. Вероятно, я бы сделал пару запросов одновременно, чтобы ускорить процесс.