Javascript Google PubSub中使用异步库的异步订户

Javascript Google PubSub中使用异步库的异步订户,javascript,typescript,async-await,google-cloud-pubsub,async.js,Javascript,Typescript,Async Await,Google Cloud Pubsub,Async.js,众所周知,Google PubSub javascript库是异步的(发布者和订阅者是异步的)。从我读到的内容来看,我们不能在JS代码中使订阅服务器的执行异步,因为JS是单线程的 有人能给我解释一下,当我订阅活动“消息”时,它实际上是如何工作的吗 如果我连续收到5条消息,我的MessageHandler会一直阻塞直到完成吗 如何在JS中异步处理消息?我听说在异步库中使用队列(一个工作线程并行)。那么,与没有它相比,它是如何工作的呢 提前感谢您的回答 执行是异步的,但是Javascript的单

众所周知,Google PubSub javascript库是异步的(发布者和订阅者是异步的)。从我读到的内容来看,我们不能在JS代码中使订阅服务器的执行异步,因为JS是单线程的

  • 有人能给我解释一下,当我订阅活动“消息”时,它实际上是如何工作的吗

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

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


提前感谢您的回答

执行是异步的,但是Javascript的单线程特性意味着一次只能执行一个异步回调。当您订阅事件“message”时,每一条传入消息都会触发该事件以使用传入消息运行回调。这些将排队并一次运行一个。每个调用都将被阻止,直到完成为止

使用Javascript实现消息并行处理的最佳方法是启动订阅服务器的多个实例。当有多个订阅者从同一订阅接收消息时,云发布/订阅负载会平衡消息,向每个订阅者发送消息的子集

如果您只想运行一个实例,那么您有几个选择,尽管不是很理想。首先,如果希望通过事件循环在多个迭代中分割工作,那么可以使用
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);
这将允许您同时在消息上取得一些进展,尽管执行块仍将连续发生


如果您希望在运行服务的单个实例的情况下跨处理器中的不同内核进行并行处理,则需要。

谢谢您的时间,您的回答非常有用!是的,我更喜欢使用单个实例,但是使用async queue和1 worker()的解决方案是异步处理它们的另一种方法吗?另一个问题,如果调用被阻塞,处理程序仍然接收大量消息,堆栈是否会崩溃,消息是否会丢失(瓶颈?)?异步库不会同时在多个内核上运行代码。它仅限于单线程执行,而不使用分叉子进程。异步库使设置需要运行并可能聚合的异步执行变得更容易。接收大量消息可能会导致任务崩溃,但是,允许您限制同时未完成消息的数量,这会有所帮助。无论哪种方式,如果您的任务崩溃,消息将在启动时重新传递。