8

每 5 分钟(例如)ping 20 个网站的列表以了解该网站是否响应 HTTP 202 的最佳方法是什么?

不费吹灰之力的想法是将 20 个 URL 保存在数据库中,然后运行数据库并 ping 每个。但是,当一个人不回答时会发生什么?之后的人怎么办?

另外,有没有更好但更简单的解决方案?恐怕列表可能会增长到 20000 个网站,然后在我需要 ping 的 5 分钟内没有足够的时间来 ping 它们。

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

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

建议?

非常感谢!

4

6 回答 6

9

Github

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

每 5 分钟(例如)ping 20 个网站的列表以了解该网站是否响应 HTTP 202 的最佳方法是什么?

平(ICMP)

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

消息队列

另外,有没有更好但更简单的解决方案?恐怕列表可能会增长到 20000 个网站,然后在我需要 ping 的 5 分钟内没有足够的时间来 ping 它们。

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

实现这种规模需要使用消息队列,例如redisbeanstalkd或 gearmand。在 PingDom 的规模上,一个工作进程不会削减它,但在你的情况下(我假设)一个工作人员会做。我认为(假设)redis 将是最快的消息队列,因为有 C(node.js)扩展,但我应该再次将它与 beanstalkd 进行基准测试,beantalkd 是另一个流行的消息队列(但还没有 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

使用node_redis(带有 hredis(node.js) c 库)。我会使用sadd将 URL 添加到 redis 。

每 5 分钟运行一次任务

这几乎不需要任何努力就可以实现。我会使用setInterval(callback, delay, [arg], [...])来反复测试服务器的响应时间。使用smemberscallback从 redis获取所有 URL 。我会使用rpush将所有 URL(消息)放在消息队列中。

检查响应(时间)

但是,当一个人不回答时会发生什么?之后的人怎么办?

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

处理网址

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

于 2011-01-17T10:03:50.810 回答
5

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

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

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

于 2012-05-03T07:38:16.257 回答
0

使用 zabbix、nagios、blah blah 等监控工具,它们可以大量衡量服务器的各种参数。

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

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

于 2011-01-17T04:55:42.730 回答
0

如果你很好奇,我已经创建了一个名为 Pinger 的应用程序来执行此操作。它建立在 Ruby on Rails 和 Resque 之上:

https://github.com/austinthecoder/pinger

于 2011-11-09T03:24:53.097 回答
0

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

于 2014-04-30T02:48:26.597 回答
0

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

于 2015-02-09T05:16:24.863 回答