Apache kafka 卡夫卡流:提交不';不会发生

Apache kafka 卡夫卡流:提交不';不会发生,apache-kafka,apache-kafka-streams,stream-processing,Apache Kafka,Apache Kafka Streams,Stream Processing,我是卡夫卡流的新手,我正在尝试卡夫卡流在超时情况下的行为 下面是我正在使用处理器API测试的场景: 我的卡夫卡流媒体应用程序从卡夫卡主题(字符串键、字符串消息)消费并写入卡夫卡主题(字符串键、字符串消息) 我已将使用者配置参数max.poll.interval.ms设置为60000 ms 我的处理方法如下所示: public void process(String key, String value) { System.out.println("the key is : " +key)

我是卡夫卡流的新手,我正在尝试卡夫卡流在超时情况下的行为

下面是我正在使用处理器API测试的场景:

  • 我的卡夫卡流媒体应用程序从卡夫卡主题(字符串键、字符串消息)消费并写入卡夫卡主题(字符串键、字符串消息)

  • 我已将使用者配置参数max.poll.interval.ms设置为60000 ms

  • 我的处理方法如下所示:

    public void process(String key, String value) {
        System.out.println("the key is : " +key);
        LocalDateTime start= LocalDateTime.now();
        System.out.println("startTime:" + dtf.format(start));
        if ( key.startsWith("12345678"){
            Thread.sleep(80000);
        }
        System.out.println("done sleeping");
        LocalDateTime end=LocalDateTime.now();
        System.out.println("endTime:" + dtf.format(end));
        System.out.println("Offset*****"+context.offset()+" 
            partitionId****"+context.partition()+"taskId*****"+context.taskId()+ 
            "javaThreadId*******"+ Thread.currentThread().getId()+ " 
            value****"+value);
    }
    
  • 所有其他配置都设置为默认值

  • 如果处理时间超过max.poll.interval.ms,我将尝试查看应用程序的行为

情况就是这样: 在第一次尝试时,它开始使用来自kafka主题的消息,并在调用process()时开始休眠。 60000毫秒后,它再次调用process方法,没有抛出任何异常,但此时它仅在20000毫秒内退出sleep打印,“done sleep”并将消息发布到输出主题。在此之后,它再次开始使用来自相同偏移量的相同消息,而不提交。这是一个循环

样本输出:

关键是:12345678

开始时间:2018/07/09 07:34:25

关键是:12345678

开始时间:2018/07/09 07:35:27

睡过觉了

结束时间:2018/07/09 07:35:45

偏移量*******224分区ID****0taskId*******0\u 0javaThreadId*******12值****abc

关键是:12345678

开始时间:2018/07/09 07:36:27

睡过觉了

结束时间:2018/07/09 07:36:47

偏移量*******224分区ID****0taskId*******0\u 0javaThreadId**********14值****abc

关键是:12345678

开始时间:2018/07/09 07:37:27

睡过觉了

结束时间:2018/07/09 07:37:47

偏移量*******224分区ID****0taskId*******0\u 0javaThreadId*******12值****abc

  • 我曾尝试显式调用context#commit(),但也不起作用。我错过了什么?卡夫卡流是否记得以前的处理状态?如果不是,为什么在第一次尝试20000毫秒后(mall.poll.interval.ms-60000,处理时间(睡眠)设置为80000毫秒)会显示“done sleep”
其他信息:

  • 我的输入和输出主题各有2个分区,我已将StreamsConfig num.streams.threads配置为2

  • 我有一个3节点的卡夫卡集群-卡夫卡和卡夫卡流版本1.1.0

  • 我不使用标点法,也不使用任何复杂的处理方法


提前感谢。

不是100%确定,但是请注意:如果调用
context#commit()
您只“请求”提交,Kafka Streams尝试尽快提交—但是在
context#commit()
返回后,提交尚未发生

另外请注意,如果您的超时时间为
60.000
,并且您睡眠时间为
80.000
,则您的应用程序应退出消费者组,因此,不允许再提交。对于这种情况,日志中应该有一条警告日志消息

希望这有帮助