【发布时间】:2019-09-06 23:57:33
【问题描述】:
我有一个 Node.js Web 应用程序,我在其中进行了一些第 3 方 API 调用,创建了一些非常长的请求/响应时间。这导致我的 Heroku 大约 50% 的时间超时,并且根据 Heroku 文档,没有办法改变这个硬限制。他们建议使用后台进程来扩展,这似乎很适合这个问题(他们提供了示例并建议使用https://optimalbits.github.io/bull/)。
我正在关注 Heroku 提供的简单示例 https://github.com/heroku-examples/node-workers-example),但是对于我来说,这个示例有点太简单了。
我有一个名为worker.js 的文件,它将是我的工人。有一个函数start() 实例化队列,并告诉队列如何处理作业。我的问题是我将通过我的 API 端点将作业添加到队列中,并且我希望每个作业都执行特定的功能以完成它们的任务。
这里是start() 函数:
function start(){
let workQueue = new Queue('work', REDIS_URL);
workQueue.process(maxJobsPerWorker, async (job,data) => {
return {message: "Finished"};
});
我想做的是在逻辑块中执行不同的功能,而不是返回完成的消息。例如,我想做这样的事情:
function start(){
let workQueue = new Queue('work', REDIS_URL);
workQueue.process(maxJobsPerWorker, async (job,data) => {
return someFunction();
});
同样,如果我每次都需要运行相同的函数,这将是非常简单的,但我将运行几个使用不同输入的不同函数。所以someFunction 是一个变量而不是一个常量。
我正在考虑将要执行的函数的名称直接传递给作业,如下所示:
let job = await workQueue.add({ callback: functionName });
但是我无法确定这是否有效...我怎样才能启动并运行它?
【问题讨论】:
标签: javascript node.js asynchronous redis worker