Pulsar中能否代指定订阅者确认topic内的特定消息?
Pulsar代指定订阅者确认特定消息实现方案
可以实现,该能力属于Pulsar Admin侧的运维操作能力,普通业务客户端API的常规文档未收录该功能入口。
前置使用说明
- 代确认操作会直接标记消息为已消费,跳过订阅者本身的消费逻辑,仅推荐在消息异常堆积、订阅者故障无法正常消费等运维场景下使用,常规业务流程不要调用该能力避免丢消息
- 操作账号需要具备目标topic所属namespace的运维权限
- 仅支持对持久化topic的持久化订阅执行操作,非持久化订阅、非持久化topic不支持该能力
具体实现方案
方案1:官方原生Admin API实现(优先推荐)
该方案是Pulsar官方原生支持的标准实现,逻辑最稳定,对原订阅的影响最小
你可以通过pulsar-admin命令行工具或者直接调用HTTP Admin接口实现:
- 单条指定消息确认命令:
pulsar-admin topics acknowledge-message <topic完整路径> --subscription <订阅名称> --messageId <要确认的消息ID> - 累积确认(确认指定消息ID之前的所有未消费消息)命令:
pulsar-admin topics acknowledge-subscription <topic完整路径> <订阅名称> --messageId <截止的消息ID> - 直接调用HTTP Admin接口的话,请求规则为:
POST /admin/v2/persistent/{租户名}/{命名空间名}/{topic名}/subscription/{订阅名}/ack,请求体传入要确认的消息ID数组即可
方案2:无Admin权限时的模拟实现
如果没有获取Admin API的调用权限,也可以通过构造同订阅临时消费者的方式实现:
- 使用和目标订阅完全一致的订阅名称、订阅类型构造一个新的消费者
- 调用消费者的seek方法定位到你需要确认的消息ID位置
- 消费到目标消息后调用
acknowledge()方法执行确认,操作完成后销毁该临时消费者即可
注意:该方案需要保证临时消费者的所有订阅配置和原订阅完全一致,错误的配置会触发Pulsar的订阅配置更新逻辑,影响原订阅者的正常消费。
内容的提问来源于stack exchange,提问作者vvra
相关产品推荐
相关产品推荐

