众所周知,Google PubSub javascript 库是异步的(发布者和订阅者是异步的)。据我了解,我们无法在 JS 代码中异步执行订阅者,因为 JS 是单线程的。
有人可以向我解释当我订阅事件“消息”时它实际上是如何工作的吗?
如果我连续收到 5 条消息,我的 MessageHandler 会阻塞直到完成吗?
如何在 JS 中异步处理消息?我听说过将队列(一个工作线程并行)与异步库一起使用。与没有它相比,它是如何工作的?
预先感谢您的回答!
最佳答案
执行是异步的,但 Javascript 的单线程本质意味着一次仅执行一个异步回调。当您订阅事件“消息”时,每条传入消息都会触发该事件以使用传入消息运行回调。这些将排队并一次运行一个。每个调用都会阻塞,直到完成。
使用 Javascript 实现消息并行处理的最佳方法是启动订阅者的多个实例。当多个订阅者从同一订阅接收消息时,Cloud Pub/Sub 会平衡消息,将消息子集发送给每个订阅者。
如果您只想运行单个实例,那么您有一些尽管不是最优的选择。首先,如果您想通过事件循环将工作拆分到多个迭代中,则可以使用 setImmediate 告诉引擎在事件循环的下一次迭代中运行提供的回调。例如:
const doExpensiveWork = message => {
// Do some more expensive processing here.
message.ack();
}
const messageHandler = message => {
console.log(`Received message: ${message.id}`);
// Do some work on message here.
setImmediate(() => doExpensiveWork(message));
};
subscription.on('message', messageHandler);
这将允许您同时在消息上取得一些进展,尽管执行 block 仍然会连续发生。
如果您希望在运行单个服务实例的情况下在处理器中的不同内核之间进行并行处理,则需要 fork subprocesses .
关于javascript - 使用异步库的 Google PubSub 中的异步订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61205490/