毫无疑问的想法是将20个URL保存在数据库中,然后运行数据库并ping每个数据库.但是,当一个人没有回答时会发生什么?之后会发生什么?
此外,还有更好但却没有脑力的解决方案吗?我担心这个列表可以增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内ping所有网站.
基本上,我正在描述PingDom,UptimeRobot等人的工作方式.
我正在使用node.js和Ruby on Rails构建这个系统.
我也倾向于使用MongoDB来保存所有ping和监视结果的历史记录.
建议?
谢谢你!
解决方法
我真的很喜欢node.js,我想解决这个问题,并希望尽快在github上共享一些代码来实现这一目标.请记住,我现在只有一个非常基本的设置,现在托管在https://github.com/alfredwesterveld/freakinping
What’s the best way to ping a list of
20 websites every 5 minutes (for
example) in order to know if the site
responds with HTTP 202 or not?
PING(ICMP)
首先,我想知道您是否真的要做ping(ICMP),或者您只是想知道网站是否返回代码200(确定)并测量所需的时间.我从上下文中相信你不是真的想要ping,而只是一个http请求并测量时间.我问这个因为(我相信)从node.js / ruby / python ping不能从普通用户那里完成,因为我们需要原始套接字(root用户)来从编程语言执行ping(ICMP).我在python中找到了这个ping脚本(我也相信我在某处看到了一个简单的ruby脚本,虽然我不是一个非常大的ruby程序员)但需要root访问权限.我不相信node.js还有ping模块.
消息队列
Also,is there better but no-brainer
solution for this? I’m afraid the list
can grow to 20000 websites and then
there’s not enough time to ping them
all in the 5 minutes I need to be
pinging.Basically,I’m describing how PingDom,
UptimeRobot,and the likes work.
实现这种规模所需要的是使用message queue,例如redis,beanstalkd或gearmand.在PingDom的规模上,一个工人流程不会削减它,但在你的情况下(我假设)一个工人会这样做.我认为(假设)redis将是最快的消息队列,因为C(node.js)扩展,但我再次将它与beanstalkd进行基准测试,这是另一个流行的消息队列(但还没有C扩展).
I’m afraid the list can grow to 20000
websites
如果你达到那个规模,你可能必须拥有多个框(很多工作线程/进程)来处理负载,但你还没有达到那个规模,而且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将URL添加到redis.
每5分钟运行一次任务
这可以在没有任何努力的情况下实现.我会使用setInterval(回调,延迟,[arg],[…])来重复测试服务器的响应时间.使用smembers从redis获取回调的所有URL.我会使用rpush将所有URL(消息)放在消息队列中.
检查响应(时间)
However,what happen when one doesn’t
answers? What happens to the ones
after that?
我可能不完全理解这句话,但在这里.如果一个失败,它就会失败.您可以尝试在5秒内再次检查响应(时间)或其他内容以查看它是否在线.应该设计出一种精确的算法.之后的那些不应该与以前的URL有任何关系,除非它们是相同的服务器.你还清楚地想到我想的东西,因为那时你不应该同时将所有这些URL ping到同一个服务器,而是将它们排队等等.
处理URL
从工作进程(现在只需一个就足够了)使用brpop命令从redis获取消息(URL).检查URL(消息)的响应时间并从列表中获取下一个URL(消息).我可能会同时做几个请求来加快这个过程.