Google Cloud PubSub 不重新发送未确认的消息

Google Cloud PubSub not resending unacknowledged messages

的所选答案有一些相关信息

我的订阅配置如下:

和以下代码:

const subscription = this.pubSubClient
  .topic(this.topicName)
  .subscription(this.subscriptionName)

subscription.on('message', (message: Message) => {
  this.logger.verbose('Received message:', message.data.toString())
})

subscription.on('error', error => {
  this.logger.error('Received error:', error)
})

发布到相应主题的消息按预期从上面的代码中记录下来,但是,它们没有被重新发送,即使我没有在配置的确认截止日期内(或根本没有)确认它们。

Metrics Explorer 正确显示未确认的消息:

此外,当我对消息显式调用 .nack() 时,它们会按预期重新发送。

我是不是误会了什么?

我相信我正在使用的客户端库 @google-cloud/pubsub 会自动延长确认截止日期。通过以下更改,我能够覆盖该行为,并且消息确实在原始确认截止日期之后重新发送:

const flowControl: FlowControlOptions = {
  maxExtensionMinutes: 0,
}
const subscription = this.pubSubClient
  .topic(this.topicName)
  .subscription(this.subscriptionName, { flowControl: flowControl })

subscription.on('message', (message: Message) => {
  this.logger.verbose('Received message:', message.data.toString())
})

subscription.on('error', error => {
  this.logger.error('Received error:', error)
})

对于 nodejs-pubsub 库,maxExtensionMinutesthe maximum duration to extend the message deadline before redelivering. There is a closed issue regarding this parameter,以防万一您觉得它有用。

您可以使用 modifyAckDeadline 参数来延长确认截止日期 (Dealing with duplicates and forcing retries)。

从 PubSub 方面来看,PubSub 保证 At-Least-Once delivery,有两个例外情况您可能会发现有用(来自文档):

  • 无法在配置的消息保留期限内传送的消息已被删除并且无法再访问。当订阅者跟不上消息流时,通常会发生这种情况。有关消息保留设置的详细信息,请参阅重播和清除消息。
  • 在创建给定订阅之前发布的消息通常不会为该订阅传送。因此,发布到没有订阅的主题的消息将不会传递给任何订阅者。