Google PubSub未确认消息无法被客户端重新拉取问题求助
Google Pub/Sub未手动ACK时消息不重投的问题解决
核心原因
你遇到的问题是因为@google-cloud/pubsub客户端默认开启了自动ACK期限延长机制:只要你的Node.js进程保持运行,客户端会定期向Pub/Sub服务发送请求,自动延长消息的ACK截止时间,所以即使你没有手动调用msg.ack(),消息也不会因为初始设置的10秒超时被重新投递。
解决方法
要让消息在ACK截止时间到期后自动重投,你需要在创建订阅时关闭自动延长期限功能,修改代码如下:
const client = new PubSub() // 创建订阅时传入关闭自动延长期限的配置 const sub = client.subscription('my-topic-sub', { enableAckDeadlineExtension: false }) sub.on("message", (msg) => { console.log("msg received") // 此时如果不调用msg.ack(),10秒后消息会被重新投递 })
补充说明
- 控制台设置的10秒ACK截止时间是初始值,如果开启自动延长期限,客户端会不断刷新这个时间,所以单独修改控制台或代码中的
ackDeadline参数不会生效。 - 调用
msg.nack()会直接通知Pub/Sub服务消息处理失败,触发立即重投,这和ACK超时重投的逻辑完全独立,所以会有你观察到的差异。
内容的提问来源于stack exchange,提问作者Sameer
相关产品推荐
相关产品推荐

