我开发了一个 node.js webapp,将 express+mongoose 部署到 Amazon EC2 实例。
当文件上传到特定的 s3 存储桶时,应用程序会收到 SNS 通知,将某些内容存储在 mongodb 中,然后将 https 发布到亚马逊以外的某个端点。https post是使用请求库以这种方式完成的:
var options = {
url:"https://"+config.get('some.endpoint')+"/somepath",
method:'POST',
body:postdata,
json:true
};
requests.post(options,function(err,response,body){
if (!err && response.statusCode === 200) {
logger.info("notified ok ");
}else{
logger.error("1 " + err);
logger.error("2 " + response);
logger.error("3 " + body);
}
});
这是使用简单的回调模型完成的(即我没有使用异步库)。
文件不断上传,因此 SNS 以相同的速度(每秒约 5/10 个请求)访问我的应用程序。应用程序启动的前十分钟,我可以看到(通过检查日志)随着传入请求的到达,http post 正在以接近的速度传递。
但在某些时候,requests.post 回调开始落后,直到它停止出现在日志文件中(尽管请求不断出现)。通过检查另一个端点(在 config.get('some.endpoint')) 中指定的端点,我可以有效地判断帖子没有被传递。在不同的突发和很大的延迟(5 分钟或更长时间)中,日志中会出现一些新消息,就像它试图赶上一样,但从长远来看,它们根本不会出现。
我已经意识到,如果我通过停止/重新启动传入的请求来进行一些手动流量控制,我可以让它正常工作。
难道我做错了什么?由于某种原因,请求是否会堆积在某个地方?我怎样才能检查这个?我应该使用一些库来确保执行吗?
是不是 node.js 更喜欢处理新的传入请求而不是处理旧的请求回调,并且不知何故这些回调永远不会执行?
欢迎任何有关如何调试此问题的帮助或建议。
提前致谢!