如何查询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
相关产品推荐
相关产品推荐

