加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何在Node.js / RoR中监控20个网站(Ping或HTTP)的正常

发布时间:2020-12-16 19:20:14 所属栏目:百科 来源:网络整理
导读:什么是每5分钟ping一次20个网站列表的最佳方法(例如),以便知道网站是否以HTTP 202响应? 毫无疑问的想法是将20个URL保存在数据库中,然后运行数据库并ping每个数据库.但是,当一个人没有回答时会发生什么?之后会发生什么? 此外,还有更好但却没有脑力的解决方
什么是每5分钟ping一次20个网站列表的最佳方法(例如),以便知道网站是否以HTTP 202响应?

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

此外,还有更好但却没有脑力的解决方案吗?我担心这个列表可以增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内ping所有网站.

基本上,我正在描述PingDom,UptimeRobot等人的工作方式.

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

建议?

谢谢你!

解决方法

Github上

我真的很喜欢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(消息).我可能会同时做几个请求来加快这个过程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读