如何在Node.js / RoR中监控20个网站(Ping或HTTP)的正常运行时间

时间:2011-01-17 01:17:51

标签: ruby ruby-on-rails-3 node.js pingdom

每5分钟ping一次20个网站的最佳方式是什么(例如),以便知道网站是否以HTTP 202响应?

毫不夸张的想法是将20个URL保存在数据库中,然后运行数据库并ping每个数据库。但是,当一个人没有回答时会发生什么?之后会发生什么?

此外,还有更好但却没有脑力的解决方案吗?我担心这个列表会增加到20000个网站,然后没有足够的时间在我需要ping的5分钟内对它们进行ping操作。

基本上,我正在描述PingDom,UptimeRobot等是如何工作的。

我正在使用node.js和Ruby on Rails构建这个系统。 我也倾向于使用MongoDB来保存所有ping和监视结果的历史。

建议?

非常感谢!

6 个答案:

答案 0 :(得分:9)

Github上

我真的很喜欢node.js,我想解决这个问题,并希望尽快在github上共享一些代码来实现这个目标。请注意,我现在只在https://github.com/alfredwesterveld/freakinping

主持了一个非常基本的设置
  

ping一个列表的最佳方法是什么?   每5分钟20个网站(for   例子)以便知道该网站   是否使用HTTP 202进行响应?

PING(ICMP)

首先,我想知道您是否真的需要ping(ICMP),或者您只是想知道网站是否返回代码200(确定)并测量所需的时间。我从上下文中相信你不是真的想要ping,而只是一个http请求并测量时间。我问这个是因为(我相信)从node.js / ruby​​ / python ping不能从普通用户那里完成,因为我们需要原始套接字(root用户)来从编程语言执行ping(ICMP)。我在python中找到了这个ping脚本(我也相信我在某个地方看到了一个简单的ruby脚本,虽然我不是一个非常大的ruby程序员)但需要root访问权限。我不相信node.js还有ping模块。

消息队列

  

此外,是否有更好的,但没有脑子   这个解决方案?我害怕这份清单   然后可以增长到20000个网站   没有足够的时间来ping他们   我需要在5分钟内完成所有工作   爆震。

     

基本上,我在描述PingDom,   UptimeRobot,喜欢工作。

实现此类扩展需要的是使用message queue,例如redisbeanstalkd或gearmand。在PingDom的规模上,一个工人流程不会削减它,但在你的情况下(我假设)一个工人会这样做。我认为(假设)redis将是最快的消息队列,因为C(node.js)扩展,但我再次将它与beanstalkd进行基准测试,这是另一个流行的消息队列(但还没有C扩展)。 / p>

  

我担心这个名单会增长到20000   网站

如果你达到那个规模,你可能必须拥有多个框(很多工作线程/进程)来处理负载,但你还没有达到那个规模,而且node.js很快就疯了。它甚至可以用一个单独的盒子处理那个负载,虽然我不确定(你需要做/运行一些基准测试)。

数据存储/ Redis的

我认为这可以在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库)。我会使用sadd将网址添加到redis。

每5分钟运行一次任务

这可以在没有任何努力的情况下实现。我会使用setInterval(callback, delay, [arg], [...])重复测试服务器的响应时间。使用smembers从redis获取callback上的所有网址。我会使用rpush将所有URL(消息)放在消息队列中。

检查响应(时间)

  

然而,当一个人没有时会发生什么   答案?会发生什么   那之后呢?

我可能不完全理解这句话,但在这里。如果一个失败,它就会失败。您可以尝试在5秒内再次检查响应(时间)或其他内容以查看它是否在线。应该设计出精确的算法。之后的那些不应该与以前的URL有任何关系,除非它们是同一个服务器。你还清楚地考虑一下我的想法,因为那时你不应该同时将所有这些URL ping到同一个服务器,而是将它们排队等等。

处理网址

从工作进程(现在只需一个就足够了)使用brpop命令从redis获取消息(URL)。检查URL(消息)的响应时间并从列表中获取下一个URL(消息)。我可能会同时做几个请求来加快这个过程。

答案 1 :(得分:5)

没有“基本方法”,因为你必须处理很多用例:

  • http重定向,
  • https pages,
  • 请求超时,
  • 用于ping的服务器的cpu负载,
  • 您需要的报告类型(可用性?正常运行时间?响应能力?停机时间?)
  • 如何按时间汇总qos测量值
  • 您收集的数据的生命周期(每五分钟ping几十个目标会很快产生大量数据)
  • 实时提醒

Pingdom等不是“基本”工具,如果你想要类似的东西,你可能想要支付它或依赖现有的开源替代品。我知道这是肯定的,因为我自己构建了一个远程监控应用程序。它被称为Uptime,它是用Node.js和MongoDB编写的,它托管在GitHub上(https://github.com/fzaninotto/uptime)。开发它花了几个星期的努力,所以相信我:这不是一个明智的选择。

答案 2 :(得分:0)

使用zabbix,nagios,blah blah等监控工具,可以按质量数量度衡服务器的各种参数。

如果你想在js中实现它,你可以做一个时间间隔的http请求,然后确定http返回状态代码,并使用xpath或regex来验证某些元素是否正确

对于ruby,守护进程并使用线程池(多线程构思)和URI打开来查看http代码和内容,使用xpath验证内容是否正常运行。

答案 3 :(得分:0)

如果你很好奇,我已经创建了一款名为Pinger的应用程序。它建立在Ruby on Rails和Resque上:

https://github.com/austinthecoder/pinger

答案 4 :(得分:0)

有一些免费的优质服务为我们提供了一个非常稳定的网站开机时间检查和通知。您可以查看此说明并查看http://fastjoomlahost.com/how-to-monitor-website-up-time

答案 5 :(得分:0)

您也可以使用node-ping-monitor包在Node.js中执行此操作。