代码之家  ›  专栏  ›  技术社区  ›  David Siro

Kafka StickyAssignor破坏了对集团中单个消费者的交付

  •  5
  • David Siro  · 技术社区  · 6 年前

    我有一个主题,其中有一个分区和两个消费者进程,它们构成了一个消费者组。

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

    场景如下:

    1. 启动消费者C1
    2. C1开始接收消息
    3. C2不接收任何消息-感谢更喜欢C1的StickyAssignor策略
    4. 冻结C1进程-(使用Java调试器-停止所有线程)
    5. C2接管-开始接收消息
    6. 解冻C1工艺
    7. 现在 C1和C2都接收消息 尽管是同一组

    使用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 回复  |  直到 6 年前