在 Node.js 承诺的环境中监控挂起的异步操作

Posted

技术标签:

【中文标题】在 Node.js 承诺的环境中监控挂起的异步操作【英文标题】:Monitoring pending async operations in Node.js promised environment 【发布时间】:2016-12-11 09:55:19 【问题描述】:

我在 Node.js 中构建了一个非常稳定的机器人应用程序,它基本上可以不断地向 API 发送请求。为了确保不会出错,我会处理任何可能出现的错误,并为可能需要很长时间才能解决的 promise 设置了超时...

现在,我想通过移除我的安全网并监控异步操作以发现任何类型的“异步泄漏”来改进应用程序,例如承诺永远挂起或任何我不知道的奇怪结果(这就是重点我的问题)。

是否有任何用于监控 Node.js 异步流的工具?例如,在给定时间获取流程中未决承诺的总量?或者如果任何承诺的待处理时间超过给定时间,则会收到警告,并跟踪该承诺?

如果这可以指导答案,以下是我使用的模块:

// Bluebird (promises)
var Promise = require("bluebird");

// Mongoose with promises
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

// Rate limiter with promises
var Bottleneck = require("bottleneck");

// Promisified requests
var request = require('request-promise');

很抱歉无法准确地提出我的问题:我不知道我可以期待/希望什么...


编辑:到目前为止,我的研究使我:

Bluebird's resource management tools,但我想不出办法让它们变得有用 令人惊叹的 npm monitor 和随附的监视器仪表板,但由于某种原因,我还不能让它满足我的需求...

由于我还在开发应用程序并且除了应用程序之外还有生活,我没有太多时间研究它,但我一定会在某个时候认真解决这个问题!

【问题讨论】:

如果您的每个异步操作都有超时,您不能只记录哪些操作超时,然后查看这些操作吗? @jfriend00 :我可以,但我想知道是否有工具/插件/包/模块/方法设计用于监控目的,或者至少对此有帮助。我希望对这个过程有一个全局的概述,而不是一个一个地检查每一个异步路径...... IIRC 有一些专用的 Promise 库支持此类工具。比如RSVP had an awesome graphical promise monitor,不知道是怎么回事。如果您在网上搜索“javascript promise monitor”,您会发现大量的库。 【参考方案1】:

听起来您可能需要某种工作管理。

我最近一直在尝试使用 kue 来管理异步作业,效果还不错。

它有一个用于启动和运行作业的 API。每个作业都可以报告其进度。它带有一个内置的作业仪表板,向您显示正在运行的作业及其进度。它具有大量事件,因此您可以监控每个作业的状态。

你需要安装 Redis 才能使用它,但这并不难。

它不支持 Promise,但您可以在下面的代码示例中看到,很容易开始工作,然后将其包装在 Promise 中,这样您就可以等待工作完成:

const queue = kue.createQueue();

queue.process("my-job", 1, (job, done) => 

    const result = ... some result ...

    // Run your job here.

    if (an error occurs) 
        done(err); // Job failure.
        return;
    

    done(null, result); // Job success
);

function runMyJob () 
    return new Promise((resolve, reject) => 
        const job = queue.create("my-job").save();

        job.on('complete', result => 
            resolve(result); // Job has completed successfully, resolve the promise.
        );

        job.on("failed", err => 
            reject(err); // Job has failed, reject the promise.
        );        
    );
;

runMyJob()
    .then(() => 
        console.log("Job completed.")
    )
    .catch(err => 
        console.error("Job failed.");
    );

使用 Node.js 集群模块可以很容易地在多个 CPU 上并行工作。

Read more on the kue web page.

【讨论】:

以上是关于在 Node.js 承诺的环境中监控挂起的异步操作的主要内容,如果未能解决你的问题,请参考以下文章

异步方式

Node.js 承诺和异步异常

如何从挂起的 pgPool.connect() 中获取响应/信息?

Node.js 承诺、异步或只是回调

php 异步执行脚本

Node.js如何将数组索引传递给异步函数