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 库,maxExtensionMinutes
是 the 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,有两个例外情况您可能会发现有用(来自文档):
- 无法在配置的消息保留期限内传送的消息已被删除并且无法再访问。当订阅者跟不上消息流时,通常会发生这种情况。有关消息保留设置的详细信息,请参阅重播和清除消息。
- 在创建给定订阅之前发布的消息通常不会为该订阅传送。因此,发布到没有订阅的主题的消息将不会传递给任何订阅者。
我的订阅配置如下:
和以下代码:
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 库,maxExtensionMinutes
是 the 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,有两个例外情况您可能会发现有用(来自文档):
- 无法在配置的消息保留期限内传送的消息已被删除并且无法再访问。当订阅者跟不上消息流时,通常会发生这种情况。有关消息保留设置的详细信息,请参阅重播和清除消息。
- 在创建给定订阅之前发布的消息通常不会为该订阅传送。因此,发布到没有订阅的主题的消息将不会传递给任何订阅者。