pulsar2.3.0游标回滚,移动偏移量测试

** 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)参数;

已经支持的有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精确,严格有序。
5.admin.topics().peekMessages(topicName,subsciptionName,numMessages)
这是个特殊的消费,拿出一个特殊订阅的numMessages条消息。

你可能感兴趣的:(pulsar)