如何通过Pulsar admin API获取指定Pulsar消息的过期时间及判定是否过期
Pulsar指定消息过期状态查询方法
一、通过Admin API获取消息过期日期
Pulsar不会单独存储每条消息的过期日期,过期时间统一通过消息发布时间 + 主题/命名空间配置的*TTL(消息存活时间)*计算得出,调用Admin API的操作步骤如下:
- 查询目标主题的TTL配置
优先级为主题级TTL > 命名空间级TTL,两者都未配置时消息默认永不过期:
- 主题级TTL查询API:
GET /admin/v2/persistent/{tenant}/{namespace}/{topic}/messageTTL - 命名空间级TTL查询API:
GET /admin/v2/namespaces/{tenant}/{namespace}/messageTTL
返回值为TTL的秒数,返回0代表未开启TTL。
curl调用示例:
curl http://<your-pulsar-admin-address>:8080/admin/v2/persistent/my-tenant/my-ns/my-topic/messageTTL
- 查询指定消息的发布时间
通过消息ID拆分出的ledgerId、entryId查询消息元数据,API为:GET /admin/v2/persistent/{tenant}/{namespace}/{topic}/messages/{ledgerId}/{entryId}
返回结果中的publishTime字段为消息发布的毫秒级时间戳。
curl调用示例:
curl http://<your-pulsar-admin-address>:8080/admin/v2/persistent/my-tenant/my-ns/my-topic/messages/121/45
- 计算过期日期
如果TTL配置大于0,消息过期时间戳 =publishTime+TTL * 1000,将该时间戳转换为可读日期格式即可得到消息的过期日期。
注意:如果调用消息查询API返回404,说明该消息已经被过期清理或手动删除,无需再计算。
二、其他查询消息是否过期的方式
- 消费者拉取验证:创建一个不关联线上业务的临时测试消费者,指定从目标消息ID的位置开始拉取消息,如果拉取不到对应消息,即可判定消息已经过期。操作时注意不要设置自动ack,测试完成后及时删除测试订阅,避免影响线上业务。
- Broker日志查询:如果你有Broker节点的日志访问权限,可以搜索对应主题的过期清理日志,日志会记录每次清理删除的ledger、entry范围,匹配目标消息的ledgerId、entryId是否在清理范围内即可。
- pulsar-admin命令行工具查询:无需手动调用API,直接通过官方自带的命令行工具查询对应参数后计算即可:
- 查询主题TTL:
pulsar-admin topics get-message-ttl persistent://my-tenant/my-ns/my-topic - 查询消息元数据:
pulsar-admin topics get-message-by-id persistent://my-tenant/my-ns/my-topic <ledgerId> <entryId>
- 查询主题TTL:
内容的提问来源于stack exchange,提问作者Pavan Kalyan
相关产品推荐
相关产品推荐

