1

我开发了一个 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 更喜欢处理新的传入请求而不是处理旧的请求回调,并且不知何故这些回调永远不会执行?

欢迎任何有关如何调试此问题的帮助或建议。

提前致谢!

4

0 回答 0