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

Ruby 如何在Node.js/RoR中监控20个网站(Ping或HTTP)的正常运行时间,ruby,ruby-on-rails-3,node.js,pingdom,Ruby,Ruby On Rails 3,Node.js,Pingdom,例如,每5分钟ping一次20个网站的列表,以了解该网站是否使用HTTP 202响应的最佳方法是什么 不需要动脑筋的想法是将20个URL保存在一个数据库中,然后运行数据库并ping每个URL。然而,当一个人不回答时会发生什么?那之后的那些会怎么样 还有,有没有更好但更简单的解决方案?我担心这个列表可能会增加到20000个网站,然后没有足够的时间在我需要ping的5分钟内ping它们 基本上,我是在描述PingDom、UptimeRobot等的工作原理 我正在使用node.js和RubyonRai

例如,每5分钟ping一次20个网站的列表,以了解该网站是否使用HTTP 202响应的最佳方法是什么

不需要动脑筋的想法是将20个URL保存在一个数据库中,然后运行数据库并ping每个URL。然而,当一个人不回答时会发生什么?那之后的那些会怎么样

还有,有没有更好但更简单的解决方案?我担心这个列表可能会增加到20000个网站,然后没有足够的时间在我需要ping的5分钟内ping它们

基本上,我是在描述PingDom、UptimeRobot等的工作原理

我正在使用node.js和RubyonRails构建这个系统。 我还倾向于使用MongoDB保存所有ping和监视结果的历史记录

建议


非常感谢

使用诸如zabbix、nagios之类的监控工具,这些工具可以大量测量服务器的各种参数

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

对于ruby,一个守护进程,使用线程池(多线程思想)和URI open来查看http代码和内容,使用xpath来验证内容是否正确运行。

Github 我非常喜欢node.js,我想解决这个问题,并希望很快在github上共享一些代码来实现这一点。请记住,我现在只有一个veryy基本设置托管在

ping列表的最佳方式是什么 每5分钟20个网站(适用于 示例)以了解现场 是否使用HTTP 202响应

PING(ICMP) 首先,我想知道你是否真的想做一个测试,或者你只是想知道网站是否返回代码200(OK)并测量它所花费的时间。从上下文来看,我相信您并不真正想要执行ping,而只是一个http请求并测量时间。我这样问是因为(我相信)普通用户无法从node.js/ruby/python执行ping,因为我们需要原始套接字(root用户)来从编程语言执行ping(ICMP)。例如,我在python中发现了这个脚本(我相信我在某处也看到了一个简单的ruby脚本,尽管我不是一个真正的ruby程序员),但它需要根访问权限。我认为node.js甚至还没有ping模块

消息队列 还有,有更好但不需要思考的吗 这个问题的解决方案是什么?恐怕名单上没有 可以发展到20000个网站,然后 没有足够的时间打击他们 在我需要的5分钟内 pinging

基本上,我是在描述PingDom, UptimeRobot,以及类似的工作

要达到这种规模,需要使用like,例如gearmand。在PingDom的规模下,一个工作进程不会削减它,但在您的情况下(我假设)一个工作进程可以。我认为(假设)由于C(node.js)扩展,redis将是最快的消息队列,但我应该再次将其与beanstalkd进行对比,beanstalkd是另一种流行的消息队列(但还没有C扩展)

恐怕名单会增加到20000人 网站

如果达到这个规模,您可能必须拥有多个主机箱(许多工作线程/进程)来处理负载,但您还没有达到这个规模,node.js速度非常快。它甚至可以用一个盒子来处理这个负载,尽管我不确定(你需要做/运行一些基准测试)

数据存储/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
使用(与hredis(node.js)c库一起)。我将使用添加URL到redis

每5分钟运行一次任务 这几乎不需要任何努力就可以实现。我将使用
setInterval(回调、延迟、[arg]、…])
重复测试服务器的响应时间。使用从redis获取
回调
上的所有URL。我将使用将所有URL(消息)放在消息队列上

检查响应(时间) 然而,如果一个人不这样做,会发生什么呢 答案?那些会怎么样 之后呢

我可能不完全理解这句话,但它是这样的。如果一个失败了,那就是失败。您可以尝试在5秒钟内再次检查响应(时间),或者看看它是否在线。应该为此设计一个精确的算法。之后的URL不应该与以前的URL有任何关系,除非是到同一个服务器。我想这也是你想得很清楚的一件事,因为你不应该在同一时间将所有这些URL ping到同一个服务器上,而是将它们排成一列或其他什么的

处理URL
从工作进程(目前只需一个)使用命令从redis获取消息(URL)。检查URL(消息)的响应时间,并从列表中获取下一个URL(消息)。我可能会同时做几个请求来加速这个过程。

如果你好奇的话,我已经创建了一个名为Pinger的应用程序来实现这一点。它基于Ruby on Rails和Resque构建:

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

  • http重定向
  • https页面
  • 请求超时
  • 用于ping的服务器的cpu负载
  • 您需要的报告类型(可用性?正常运行时间?响应能力?停机时间?)
  • 如何按时间聚合qos度量
  • 您收集的数据的生命周期(每五分钟ping几十个目标会快速生成大量数据)
  • 实时警报
  • 等等
Pingdom等不是“基本”工具,如果您想要类似的东西,可能需要付费或依赖现有的开源替代品。我确信这一点,因为我自己构建了一个远程监控应用程序。这叫做正常运转