javascript - 如何使用 Bull 在 Node.js 中将我的函数作为后台进程执行?
问题描述
我有一个 Node.js Web 应用程序,我在其中进行了一些 3rd 方 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
单词 for await
to work。
return 的工作方式也与 await 相同。所以你可以假设你有一个 getter 方法,你可以说类似async function findWorker(){ return database.find({ workerId }); };
.
推荐阅读
- jenkins - Jenkins管道 - 如何在并行运行之间等待
- python - 玩家回合后如何保持积分更新?
- pyspark - 排序然后按数据框分组-分组后是否保留排序顺序?
- nginx - 如何使反向代理后面的 nginx 允许基于来自不同标头的 IP 地址进行访问
- cucumber-jvm - 我不知道如何使用@cucumberOption 并行化我在黄瓜中的测试
- c - 如何准确理解 malloc() 和 calloc() 两个函数的语法
- sql - 根据列中存在的逗号拆分列值
- oracle12c - 带有来自 expdp 转储的 blob 的 impdp 表
- r - 在一行中一个一个地转换向量中的变量
- sql - SQL Server如何判断一组值是否与另一组值不同