我正在构建一个类似于 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 这样的服务有更多的检查需要处理,我很好奇他们如何扩展他们的系统除了增加正常运行时间检查实例。