Java Kafka StickyAssignor破坏了向集团内单个消费者的交付

Java Kafka StickyAssignor破坏了向集团内单个消费者的交付,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我有一个主题,有一个分区和两个消费进程,它们构成了一个消费群体 这样,消息总是传递给单个消费者。StickyAssignor用于偏好在重新平衡时已分配到分区的使用者 我一直在玩这个设置,发现在某些情况下,消息会传递给两个消费者,这打破了消费者群体的目的 情况如下: 启动消费者C1 C1开始接收消息 启动消费者C2 C2不会收到任何消息-这要感谢StickyAssignor更喜欢C1的策略 冻结C1进程-(使用Java调试器-停止所有线程) C2接管-开始接收消息 解冻过程 现在,尽管C1和C2在

我有一个主题,有一个分区和两个消费进程,它们构成了一个消费群体

这样,消息总是传递给单个消费者。StickyAssignor用于偏好在重新平衡时已分配到分区的使用者

我一直在玩这个设置,发现在某些情况下,消息会传递给两个消费者,这打破了消费者群体的目的

情况如下:

  • 启动消费者C1
  • C1开始接收消息
  • 启动消费者C2
  • C2不会收到任何消息-这要感谢StickyAssignor更喜欢C1的策略
  • 冻结C1进程-(使用Java调试器-停止所有线程)
  • C2接管-开始接收消息
  • 解冻过程
  • 现在,尽管C1和C2在同一组中,但它们都能接收消息
  • 使用RangeSignator/RoundRobinAsignor时,不会发生这种情况

    我是遗漏了什么还是卡夫卡的一个错误

    这是我的消费代码:

    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("group.id", "test");
    props.put("client.id", consumerId);
    props.put("enable.auto.commit", "false");
    props.put("auto.commit.interval.ms", "1000");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("partition.assignment.strategy", StickyAssignor.class.getName());
    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    
    consumer.subscribe(Collections.singleton("my-events"));
    
    
    
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(100);
        for (ConsumerRecord<String, String> record : records)
            System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
    }
    
    Properties=newproperties();
    put(“bootstrap.servers”,“localhost:9092”);
    props.put(“group.id”、“test”);
    props.put(“client.id”,consumerId);
    props.put(“enable.auto.commit”、“false”);
    props.put(“auto.commit.interval.ms”,“1000”);
    put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
    put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
    put(“partition.assignment.strategy”,StickyAssignor.class.getName());
    卡夫卡消费者=新卡夫卡消费者(道具);
    consumer.subscribe(Collections.singleton(“我的事件”);
    while(true){
    ConsumerRecords记录=consumer.poll(100);
    对于(消费者记录:记录)
    System.out.printf(“偏移量=%d,键=%s,值=%s%n”,record.offset(),record.key(),record.value());
    }
    
    您是说C1和C2都是长期接收消息的(即,不只是在上次分区偏移提交后重新发送?),您什么时候提交偏移?确切地说。我们已经观察了几分钟的输出,两个实例都一直在接收。我使用默认的自动偏移提交。感谢您在sticky assignor代码中报告此错误。已创建一个跟踪问题的数据库。