我有一个Node.js Web应用程序,在其中我进行了一些第三方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 });
但是我真的无法确定它是否有效...如何启动并运行它?
答案 0 :(得分:0)
我认为启动功能不是必需的。您可以像这样async function myFunction(){ //Logic goes here }
定义函数,然后在需要调用时,只需使用await myFunction()
执行它们,否则返回的内容可以将其放入变量中。但是您要执行的功能需要包含async
词才能使await
起作用。
返回也与等待相同。因此,可以说您有一个getter方法,可以说类似async function findWorker(){ return database.find({ workerId }); };
之类的东西。