Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡-如何检查消费者是否还活着,如果没有,如何将消费者恢复到运行状态?_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 卡夫卡-如何检查消费者是否还活着,如果没有,如何将消费者恢复到运行状态?

Java 卡夫卡-如何检查消费者是否还活着,如果没有,如何将消费者恢复到运行状态?,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我目前正在从事一个卡夫卡java项目。我是新手,我发现很难理解卡夫卡制作人/消费者设计的一些基本概念 比如说,我有一个单一分区的主题,我有一个制作人在写它,一个消费者在消费这个主题。如果我部署同一应用程序的多个实例,每个实例将运行自己的使用者。在这种情况下,由于所有使用者都属于同一个groupId,消息是否会在多个实例上运行的使用者之间平均分布 如何从应用程序中定期检查消费者是否还活着 如果一个/所有消费者出现故障,如何重新启动/使其恢复运行状态 在java中实现长时间运行的使用者的最佳方法是什

我目前正在从事一个卡夫卡java项目。我是新手,我发现很难理解卡夫卡制作人/消费者设计的一些基本概念

  • 比如说,我有一个单一分区的主题,我有一个制作人在写它,一个消费者在消费这个主题。如果我部署同一应用程序的多个实例,每个实例将运行自己的使用者。在这种情况下,由于所有使用者都属于同一个groupId,消息是否会在多个实例上运行的使用者之间平均分布

  • 如何从应用程序中定期检查消费者是否还活着

  • 如果一个/所有消费者出现故障,如何重新启动/使其恢复运行状态
  • 在java中实现长时间运行的使用者的最佳方法是什么
  • 请澄清上述问题。 如果我的任何/所有假设/理解都是错误的,请纠正我。 我知道我没有分享任何代码示例,因为这些都是概念性的问题。如果需要,我可以共享代码片段

  • Kafka只允许每个分区和用户组有一个用户。因此,多个消费者将等待主消费者倒下,然后在该点跳入,但对于给定的分区/消费者组,一次只有一个消费者在消费

  • 您可以检查消费群体偏移量是否与最大偏移量保持一致,以查看是否存在滞后。如果一个消费者开始出现问题,卡夫卡在多个消费者之间循环方面做得相当好

  • 重新启动应用程序,它将从停止的地方恢复,只是不要从头开始重新启动消息。卡夫卡替你处理

  • 我们用弹簧靴搭配弹簧卡夫卡。没有“最佳”方法,但我们发现使用spring进行设置和维护很容易

  • 您说过,使用单个分区的主题意味着它无法将消息分发到多个分区。你将失去卡夫卡的一大优势。你必须增加一个以上的分区。 若您部署同一应用程序的多个实例,那个么分发并没有帮助,因为正如您所提到的,消息正在发布到一个分区中,并且只有一个实例将被分配到该分区,而其他实例将处于空闲状态

  • 您可以使用AdminClient Kafka API检查您的消费者是否存在任何滞后

    Properties props = new Properties();
    props.setProperty("bootstrap.servers", "localhost:9091");
    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    AdminClient client = org.apache.kafka.clients.admin.AdminClient.create(props);
    ListConsumerGroupOffsetsResult offsets = client.listConsumerGroupOffsets("consumerId");
    Map<TopicPartition, OffsetAndMetadata> tt = offsets.partitionsToOffsetAndMetadata().get();
    ListConsumerGroupOffsetsResult offsets = client.listConsumerGroupOffsets(consumerId);
    Map<TopicPartition, OffsetAndMetadata> tt = offsets.partitionsToOffsetAndMetadata().get();
    for (Entry<TopicPartition, OffsetAndMetadata> entry : tt.entrySet()) {TopicPartition tp = entry.getKey();
      OffsetAndMetadata op = entry.getValue();
      Collections.singletonList(tp);
      consumer.assign(Collections.singletonList(tp));
      consumer.seekToEnd(Collections.singletonList(tp));
      System.out.println(consumerId + "," + tp.partition() + "," + consumer.position(tp) + ","
                                + op.offset() + "," + (consumer.position(tp) - op.offset()));
    }
    
    Properties=newproperties();
    setProperty(“bootstrap.servers”,“localhost:9091”);
    卡夫卡消费者=新卡夫卡消费者(道具);
    AdminClient=org.apache.kafka.clients.admin.AdminClient.create(props);
    ListConsumerGroupOffsetsResult offsets=client.listConsumerGroupOffsets(“consumerId”);
    Map tt=offsets.partitionsToOffsetAndMetadata().get();
    ListConsumerGroupOffsetsResult offsets=client.listConsumerGroupOffsets(consumerId);
    Map tt=offsets.partitionsToOffsetAndMetadata().get();
    for(Entry:tt.entrySet()){TopicPartition tp=Entry.getKey();
    OffsetAndMetadata op=entry.getValue();
    收藏。单音列表(tp);
    consumer.assign(Collections.singletonList(tp));
    consumer.seekToEnd(Collections.singletonList(tp));
    System.out.println(consumerId+”,“+tp.partition()+”,“+consumer.position(tp)+”,”
    +op.offset()+”,“+(consumer.position(tp)-op.offset());
    }
    
  • 您还没有说明在何处部署,但如果您在mesos中使用marathon进行部署,它将自动重新启动。您可以手动重新启动,如果您使用与上一个相同的组id,您的应用程序将开始使用它离开的位置


  • 嗨,谢谢你的回复。如何检查消费者在任何时间点是否还活着?。在消费者情绪低落后,如何让他们恢复活力?你说的“活着”是什么意思?