Kafka StickyAssignor打破了集团中单一消费者的交付

时间:2018-06-08 13:34:21

标签: java apache-kafka kafka-consumer-api

我有一个主题,包含一个分区和两个构成消费者群体的消费者流程。

这样,消息始终传递给单个消费者。 StickyAssignor用于优先选择已经分配给重新平衡分区的消费者。

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

方案如下:

  1. 启动消费者C1
  2. C1开始接收消息
  3. 启动消费者C2
  4. C2没有收到任何消息 - 感谢StickyAssignor策略更喜欢C1
  5. 冻结C1进程 - (使用Java调试器 - 停止所有线程)
  6. C2接管 - 开始接收消息
  7. 解冻C1流程
  8. 现在 C1和C2接收消息尽管属于同一群组
  9. 使用RangeAssignor / RoundRobinAssignor时,不会发生这种情况。

    我错过了什么或者这是卡夫卡的错误吗?

    这是我的消费者代码:

    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());
    }
    

0 个答案:

没有答案