在 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 承诺的环境中监控挂起的异步操作的主要内容,如果未能解决你的问题,请参考以下文章