gpt4 book ai didi

bull.js - 服务器 1 如何可靠地知道服务器 2 何时完成了特定工作? (bull.js)

转载 作者:行者123 更新时间:2023-12-04 02:44:29 25 4
gpt4 key购买 nike

服务器 1 正在调用此函数:

let job = await transactions.add({ foo: 'bar' });
let status = await job.finished();
console.log(status);

服务器 2 正在使用以下作业:

transactions.process(QueueOptions.maxConcurrent, async (job, done) => {
done(null, {result: job.data});
});

但是,当该作业完成时,服务器 1 没有收到通知。唯一一次 job.finished() 解析是服务器 1 将作业排队,然后服务器 2 启动。在这种情况下,job.finished() promise 有效。否则它总是沉默。

服务器 1 如何可靠地知道服务器 2 何时完成了工作? (一项工作只需 10 秒或更短时间即可完成)

最佳答案

您至少有两个选项可以实现将一个作业完成的结果从一台服务器中的处理器通知另一台服务器。

选项 1

使用全局事件并监听 "completed" 事件。例如:

// Server 1
transactions.on("global:completed", (jobId, result) => {
// Job completed
});

此选项的优点是简单明了。但是,在 Bull 3.x 中,事件并不保证总是到达目的地,例如在网络分区或 Redis 断开连接的情况下。如果您可以接受极少数结果未被完全通知,则可以使用此方法。

选项 2

使用此处描述的返回作业完成模式:https://github.com/OptimalBits/bull/blob/develop/PATTERNS.md#returning-job-completions

它的工作原理是定义一个新的队列,我们​​称它为 results,您可以在完成之前添加处理器的结果,如下所示:

// Server 2
transactions.process(QueueOptions.maxConcurrent, async (job) => {
const result = {result: job.data}
await results.add(job.data);
return result
});

在需要监听结果的服务器(或多个服务器)上,只需创建一个处理结果的处理器即可:

// Server 1
results.process( (job) => {
// Do something with the result from the transaction queue...
});

此解决方案的优势在于稳健性。基本上,您永远不会丢失事务队列中的任何结果,但会增加一些代码复杂性。

关于bull.js - 服务器 1 如何可靠地知道服务器 2 何时完成了特定工作? (bull.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57844686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com