Pulsar 消费重置,移动偏移量方法

Pulsar 消费重置,移动偏移量有6种方法

  1. 设置subscriptionInitialPosition,在创建consume的时候处理。
  2. consumer.seek(messageId)方式。
  3. admin.topics().peekMessages(topicName,subsciptionName,numMessages)方式。
  4. admin.topics().resetCursor(topicName,subsciptionName,messageTimestamp)方式。
  5. admin.topics().skipMessages(String topic, String subName, long numMessages)方式。
  6. admin.topics().skipAllMessages(String topic, String subName)方式。

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

1. 设置subscriptionInitialPosition

创建consume的时候我们可以指定subscriptionInitialPosition(SubscriptionInitialPosition.Earliest)参数;
已经支持的有SubscriptionInitialPosition.EarliestSubscriptionInitialPosition.Latest,顾名思义,一个是回滚到最初,一个是最新接受到的消息。目标是对某个订阅而言;
源码中摘下的使用实例如下:

PulsarClient client = PulsarClient.builder().serviceUrl(pulsar.getBrokerServiceUrl()).build();

        CompletableFuture<Producer<String>> producerFuture = client.newProducer(Schema.STRING)
            .topic(topicName)
            .createAsync();
        CompletableFuture<Consumer<String>> consumerFuture = client.newConsumer(Schema.STRING)
            .topic(topicName)
            .subscriptionName("sub")
            .subscriptionInitialPosition(SubscriptionInitialPosition.Earliest)
            .subscribeAsync();

        CompletableFuture.allOf(producerFuture, consumerFuture).get();

        Producer<String> producer = producerFuture.get();
        Consumer<String> consumer = consumerFuture.get();

        for (int i = 0; i < N; i++) {
            producer.send("Hello-" + i);
        }

        consumer.close();
        producer.close();

2. 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的位置。

3. peekMessages(topicName,subsciptionName,numMessages)

查询消费者消费到的numMessages条消息。

  • 支持非分区主题(此结论借鉴网上其他博客,还未验证)
  • 不支持分区主题,直接返回null(实测有效)

源码解释:

/**
     * Peek messages from a topic subscription.
     *
     * @param topic topic name
     * @param subName Subscription name
     * @param numMessages Number of messages
     * @return
     * @throws NotAuthorizedException Don't have admin permission
     * @throws NotFoundException Topic or subscription does not exist
     * @throws PulsarAdminException Unexpected error
     */
    List<Message<byte[]>> peekMessages(String topic, String subName, int numMessages) throws PulsarAdminException;

4. resetCursor(topicName,subsciptionName,messageTimestamp)

重置游标,

  • 分区topic支持方法(实测有效)
    CompletableFuture resetCursorAsync(String topic, String subName, long timestamp);
    参数解释
	/**
     * Reset cursor position on a topic subscription.
     *
     * @param topic
     *            topic name
     * @param subName
     *            Subscription name
     * @param timestamp
     *            reset subscription to position closest to time in ms since epoch/即你想回到哪个时刻的消费位置timestamp就设置为时刻的millions表示
     * 
     */
    CompletableFuture<Void> resetCursorAsync(String topic, String subName, long timestamp);
  • 非分区topic支持方法(实测有效)
    void resetCursor(String topic, String subName, MessageId messageId) throws PulsarAdminException;
    参数解释:
/**
     * Reset cursor position on a topic subscription.
     *
     * @param topic
     *            topic name
     * @param subName
     *            Subscription name
     * @param messageId
     *            reset subscription to messageId (or previous nearest messageId if given messageId is not valid)/你可以定义自己的messageId,也可以直接使用已经定义好的MessageId.earliest或MessageId.latest(MessageId.earliest来指向topic上最早
可用的消息,使用MessageId.latest指向最新的消息)
     */
    CompletableFuture<Void> resetCursorAsync(String topic, String subName, MessageId messageId);

5. admin.topics().skipMessages(String topic, String subName, long numMessages)

  • 不支持分区topic
    这点可以从源码的测试代码块看出:
 	//final String partitionedTopicName = "persistent://prop-xyz/ns1/" + topicName;
 	assertEquals(Sets.newHashSet(admin.topics().getList("prop-xyz/ns1")),
                Sets.newHashSet(partitionedTopicName + "-partition-0", partitionedTopicName + "-partition-1",
                        partitionedTopicName + "-partition-2", partitionedTopicName + "-partition-3"));

        try {
            admin.topics().skipMessages(partitionedTopicName, "my-sub", 5);
            fail("skip messages for partitioned topics should fail");
        } catch (Exception e) {
            // ok
        }

6. admin.topics().skipAllMessages(String topic, String subName)

直接跳过所有未被消费的消息。

  • 支持分区和非分区两种topic(实测有效,源码测试代码也可看出)

参考文章:
Pulsar 游标回滚,移动偏移量测试

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot整合Pulsar是一种将Pulsar客户端与SpringBoot框架结合使用的方法。首先,需要在项目的依赖中引入Pulsar客户端的依赖项,如下所示: ```xml <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-client</artifactId> <version>2.9.1</version> </dependency> ``` 接下来,在项目的配置文件中添加Pulsar相关的配置,包括Pulsar的地址、主题和消费者组等信息。例如: ```properties # Pulsar地址 pulsar.url=pulsar://192.168.59.155:6650 # 主题 pulsar.topic=testTopic # 消费者组 pulsar.subscription=topicGroup ``` 然后,可以创建Pulsar的Client对象,用于与Pulsar进行交互。 关于Pulsar的部署命令,可以使用以下命令进行部署: ```shell docker run -it -p 6650:6650 -p 8080:8080 --mount source=pulsardata,target=/pulsar/data --mount source=pulsarconf,target=/pulsar/conf apache/pulsar:2.9.1 bin/pulsar standalone ``` 以上是SpringBoot整合Pulsar的基本步骤和命令。通过这种方式,可以在SpringBoot项目中使用Pulsar进行消息传递和处理。 #### 引用[.reference_title] - *1* *2* *3* [Spring Boot 整合分布式消息平台 Pulsar](https://blog.csdn.net/m0_73311735/article/details/131532850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值