0

我正在构建一个类似于 pingdom.com 的系统,在那里我有大约 10k 个域用于每 5 分钟检查一次正常运行时间。我正在使用 ec2 微型实例来执行检查。我的检查 url 和他们的最后检查时间存储在 mongodb 中。节点进程对最近 5 分钟内未处理的处理进行前 n 个检查,然后异步完成 url 请求。我正在使用节点请求库,我的 url 检查代码如下所示:

var request = require("request");

var options = {
    url: url,
    headers: {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip,deflate,sdch',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36'
    },
    timeout: 10000,
    maxRedirects: 10,
    pool: false,
    strictSSL: false
};

request(options, function (error, response, body) {
    ...
});

现在我注意到,当我同时向不同域发出超过 10 个请求以进行正常运行时间检查时,这些域的响应时间会随着同时请求数量的增加而减慢。我认为响应时间不应该增加,因为节点是异步的。我也在考虑尝试 node-curl 库,但在此之前我想确认我是否在这里做错了什么。

我试过调整 ulimit 和 pool.maxConnection 限制,但没有任何运气。我知道如果我增加 ec2 实例的数量,我可以以可接受的响应时间实现每 5 分钟 10k 次检查,但我猜像 pingdom 这样的服务有更多的检查需要处理,我很好奇他们如何扩展他们的系统除了增加正常运行时间检查实例。

4

1 回答 1

0

您可能想在一个实例上尝试一个小型 Node 服务器集群。他们每个人都可以使用不同的进程/线程。一个实例可以充当控制器并通过 redis pub/sub 或其他方式发送命令。不过,我不确定您的瓶颈是什么;可能是微型实例的带宽问题。您可能应该运行一些测试来确定最慢的代码位在哪里。

于 2014-03-15T22:36:55.893 回答