2

众所周知,Google PubSub javascript 库是异步的(发布者和订阅者是异步的)。根据我的阅读,我们不能在 JS 代码中使订阅者的执行异步,因为 JS 是单线程的。

  • 当我订阅事件“消息”时,有人可以解释一下它是如何工作的吗?

  • 如果我连续收到 5 条消息,我的 MessageHandler 会阻塞直到它完成吗?

  • 如何在 JS 中异步处理消息?我听说过在异步库中使用队列(一个并行工作人员)。那么,与没有它相比,它是如何工作的呢?

预先感谢您的回答!

4

1 回答 1

3

执行是异步的,但 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);

这将允许您同时在消息上取得一些进展,尽管执行块仍将连续发生。

如果您希望在处理器中的不同内核之间进行并行处理,同时运行单个服务实例,则需要fork subprocesses

于 2020-04-14T11:12:10.467 回答