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

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

毫无疑问的想法是将20个URL保存在数据库中,只需运行数据库并ping每一个。 然而,当一个人没有回答时会发生什么? 那之后会发生什么?

此外,有没有更好的,但不容易的解决scheme呢? 恐怕列表可能会增长到20000个网站,然后没有足够的时间在5分钟内ping所有。

基本上,我正在描述PingDom,UptimeRobot和类似的工作。

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

build议?

谢谢一堆!

Github上

我真的很喜欢node.js,我想解决这个问题,希望很快在github上分享一些代码来实现这一点。 请记住,我只有一个非常基本的设置,现在托pipe在https://github.com/alfredwesterveld/freakinping

每隔5分钟(例如)ping 20个网站列表的最佳方式是什么,以便知道网站是否使用HTTP 202进行响应?

PING(ICMP)

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

消息队列

此外,有没有更好的,但不容易的解决scheme呢? 恐怕列表可能会增长到20000个网站,然后没有足够的时间在5分钟内ping所有。

基本上,我正在描述PingDom,UptimeRobot和类似的工作。

实现这种规模所需要的是使用像redis , beanstalkd或gearmand这样的消息队列 。 在PingDom的规模下,一个工作stream程不会削减它,但在你的情况下(我认为)一个工人会做。 我认为(假设)由于C(node.js)扩展,redis将是最快的消息队列,但是我应该再次将它与另一个受欢迎的消息队列(但还没有C扩展)的beanstalkd进行基准比较。

恐怕名单可能增长到20000个网站

如果你达到这个规模,你可能必须有多个主机(很多工作线程/进程)来处理负载,但是你还没有达到那个规模,node.js的速度是疯狂的。 它甚至可以用一个盒子来处理这个负载,尽pipe我不知道(你需要做/运行一些基准testing)。

数据存储/ 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库)。 我会使用sadd将URL添加到redis。

每5分钟运行一次任务

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

检查响应(时间)

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

我可能不会完全理解这句话,但是在这里。 如果一个失败,就会失败。 您可以尝试在5秒钟内再次检查响应(时间),以查看是否在线。 应该devise一个精确的algorithm。 之后的那些应该与以前的URL没有任何关系,除非是在同一个服务器上。 还有一点你清楚地想到我猜,因为那么你不应该把所有这些URL同时ping到同一个服务器,而是排队等等。

处理URL

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

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

  • httpredirect,
  • https页面,
  • 请求超时,
  • 您用于ping的服务器的cpu负载,
  • 您需要的报告types(可用性?正常运行时间?响应性?停机时间?)
  • 如何按时间汇总质量测量
  • 您收集的数据的生命周期(每五分钟ping几十个目标会快速生成大量数据)
  • 实时警报
  • 等等

Pingdom等不是“基本”工具,如果您想要类似的东西,您可能需要为此付费或依靠现有的开源替代scheme。 我知道这一点,因为我自己构build了一个远程监控应用程序。 这叫做Uptime,它是用Node.js和MongoDB编写的,它在GitHub(https://github.com/fzaninotto/uptime)上托pipe。 花了好几个星期的努力去发展它,所以相信我:这不是一件容易的事情。

使用监视工具,如zabbix,nagios,等等等等,它可以衡量你的服务器的质量数的各种参数。

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

对于ruby,守护进程并使用线程池(multithreading思想)和URI打开来查看http代码和内容,使用xpath来validation内容是否正确运行。

如果您好奇,我已经创build了一个名为Pinger的应用程序来完成这个任务。 它build立在Ruby on Rails和Resque上:

https://github.com/austinthecoder/pinger

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

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