在什么情况下 Google Cloud Pub/Sub 会关闭订阅?

In which case does Google Cloud Pub/Sub close a subscription?

我正在使用 Google 云 Pub/Sub:Node.js 客户端 2.19.0.

有时会发生某些订阅上的消息根本没有被确认的情况。我怀疑订阅有时会出错。 我有一个 subscription.on('error', ... 听众。但是这个监听器在问题出现的时候显然是没有被触发的

难道订阅没有报错就关闭了?

我在 official docs 中找不到任何背景信息,但它们包含以下有关事件处理程序的信息:

// Register a close handler in case the subscriber closes unexpectedly
subscription.on('close', () => {});

这就提出了一个问题:在哪些情况下订阅会意外关闭?

一样为重开添加一个监听器是否有意义
subscription.on('close', () => {
    subscription.open()
});

?

如果是这样:区分意外关闭(我想通过重新打开对此做出反应)和我自己的程序代码故意关闭订阅(在这种情况下我不这样做)之间的首选方法是什么想要自动重新打开订阅)?

订阅者不应在没有抛出错误的情况下关闭。订阅者可能被关闭的原因有多种,包括:

  • 订阅已删除。
  • 订阅者不再具有订阅订阅的权限。
  • 客户端库本身存在意外错误,导致关闭。

一个问题是,消息未被确认是什么意思?是不是在您认为您已对它们调用 ack 之后再次收到这些消息?是不是你在云监控中看到的unacked消息数量没有减少?

如果您的消息未被确认,可能有许多不同的原因。可能是您的消息处理失败并且没有确认消息。这不会导致整个订阅者出错,但只会导致未处理消息的最终 nack。记录您在回调开始时收到的每条消息并记录每个确认以确保您正在确认每条消息会很有帮助。

您也可以 运行 在 documentation:

中关于批处理消息的 acks 的注释

When the Pub/Sub client libraries batch multiple messages into a single call to the service, all messages in the batch must be acknowledged before the acknowledgement deadline expires. Even if one message in the batch is not acknowledged, the entire batch is re-queued for delivery which could result in messages being delivered more than once. Not only are the client libraries Batching messages, Pub/Sub also batches the messages internally to increase throughput and reduce costs.

如果缺少 acking 的情况相对较少,您可能 运行 反对 Pub/Sub 的 at-least-once 交付保证,即使是您发送 ack 的消息即使没有上述关于批处理的警告,仍然可以重新交付。