Pulsar 游标回滚,移动偏移量测试

1. 功能支持

pulsar做为一个消息系统,自然是支持游标回滚功能的,但是因为软件还处于快速发展迭代的阶段,有些功能使用上可能会小心一些,以下就是楼主最近碰到以及找到的解决办法。
2. 需求

因为消息安全以及可验证的原因,项目要求需要可将topic中消息回滚到之前几分钟,十几分钟,乃至于最早未删除的位置。经过测试发现pulsar有四种方式可处理回滚事项,

一,设置subscriptionInitialPosition,在创建consume的时候处理。

二,consumer.seek(messageId)方式,

三,admin.topics().peekMessages(topicName,subsciptionName,numMessages);方式,

四,admin.topics().resetCursor(topicName,subsciptionName,messageTimestamp)方式,

以下讲解一下楼主对他们的理解和测试。

3. 设置subscriptionInitialPosition

创建consume的时候我们可以指定subscriptionInitialPosition(SubscriptionInitialPosition.Earliest)参数;

Pulsar 游标回滚,移动偏移量测试_第1张图片

已经支持的有SubscriptionInitialPosition.Earliest和SubscriptionInitialPosition.Latest,顾名思义,一个是回滚到最初,一个是最新接受到的消息。目标是对某个订阅而言;

4.consumer.seek(messageId)

重置游标

pulsar中有分区topic和非分区topic的区分,现在api只支持创建分区topic,例如我们创建了一个分

topic(persistent://zhiwang3/whds9/admin2),然后创建分区topic的consume,此时我们发现分区topic的consume不支持seek功能。

分区topic不支持seek功能

非分区topic支持seek功能

楼主的做法是采用分区topic的一个分区来创建consume,例如分区topic的其中一个分区(persistent://zhiwang3/whds9/admin2-partition-0),再次创建consume,支持seek功能。游标回滚到messageId的位置。

5.admin.topics().resetCursor

重置游标,

分区topic不支持resetCursor功能

报错信息Reset-cursor at position is not allowed for partitioned-topic

非分区topic支持resetCursor功能

此时的producer和consumer也需要是非分区topic,不然消费的条数对不上。楼主也没能看明白,有兴趣的大佬可以测一测。
resetCursor()可以传三种参数:

参数:eventTime,publishTime,messageId,eventTime我们自己维护,publishTime是落地pulsar的时间,messageId消息的标识,是个对象,pulsar已经实现了序列化,直接调用它的toByteArray,fromByteArray即可。
区别:eventTime,publishTime都不太精确,稍许误差,维护方便,一个long值,messageId精确,严格有序。

6.admin.topics().peekMessages(topicName,subsciptionName,numMessages)
这是个特殊的消费,拿出一个特殊订阅的numMessages条消息。

你可能感兴趣的:(Pulsar,Pulsar,Pulsar)