我有一个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 });
但是我无法确定这是否有效......我怎样才能让它运行起来?
我不认为启动功能是必要的。你可以像这个async function myFunction(){ //Logic goes here }
一样定义你的函数,然后当你需要那个调用时,你只需要使用await myFunction()
执行它们,或者它返回一些你可以把它放在一个变量中。但是你想要执行的函数需要包含async
的await
字才能工作。
返回的工作方式与await相同。所以你可以说你有一个getter方法,你可以说像async function findWorker(){ return database.find({ workerId }); };
。