You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询GCP Pub/Sub中消息的确认(ack)时间

GCP Pub/Sub 延迟确认消息的时间查询方案

你当前的场景是消费消息后延迟60秒再发起确认,GCP原生提供了多套方案可以满足查询需求,具体如下:

1. Cloud Monitoring 原生仪表盘

  • 直接查看订阅级指标 subscription/ack_latency,该指标统计的是Pub/Sub服务端发送消息到收到客户端确认请求的时间差,完全匹配你需要的「从消息下发到确认完成的耗时」,你可以在Cloud Monitoring的Pub/Sub订阅详情页直接查看该指标的分位值、趋势图,也可以自定义筛选条件只看耗时超过60秒的消息样本。
  • 辅助指标subscription/oldest_unacked_message_age可以用来排查未确认消息的堆积情况。

2. Cloud Logging 日志查询

  • 方案一(无需额外配置):开启订阅的交付日志功能后,Pub/Sub服务端会自动记录每一条消息的下发时间、收到确认的时间,你可以在Cloud Logging中过滤资源类型为pubsub_subscription、日志类型为delivery_ack的日志,直接拿到服务端侧记录的准确确认时间,不需要修改业务代码。
  • 方案二(业务侧自定义):你可以在现有代码的receiveMessage方法入口、consumer.ack()执行前分别打印日志,统一携带message.getMessageId()作为唯一标识,后续可以用消息ID检索两条日志的时间差,拿到业务侧实际的等待确认时长。示例代码修改参考:
@Service
public class MyReceiver implements MessageReceiver {
    ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
        String msgId = message.getMessageId();
        long receiveTime = System.currentTimeMillis();
        System.out.printf("收到消息,ID:%s,接收时间:%d%n", msgId, receiveTime);
        executor.execute(() -> {
            Thread.sleep(60000);
            long ackTime = System.currentTimeMillis();
            System.out.printf("确认消息,ID:%s,确认时间:%d,等待时长:%dms%n", msgId, ackTime, ackTime - receiveTime);
            consumer.ack();
        });
    }
}

额外注意事项

你当前代码延迟60秒确认,需要先调整对应订阅的ack截止时间(默认一般为10秒)到大于60秒,否则消息会被服务端判定为未确认触发重复投递,创建订阅时可以通过setAckDeadlineSeconds(70)配置即可。


内容的提问来源于stack exchange,提问作者Rishabh Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:39:05