使用Kafka Consumer消息消费 - Java

时间:2016-02-23 15:21:21

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

我看到以下代码用于消费来自Kafka的消息。有一个主题有20个分区,使用ExecutorService创建了20个线程。每个从1个分区读取的消息流有20个。运行此程序时,将读取20条消息,并将从主题处理。当其中一个线程完成处理时,我假设将读取下一条消息。

如果在主题中有100条消息的示例场景中,所有消息都将被读取并保存在内存中,并且将由线程一次处理,或者仅在当前消息之后才从主题读取消息正在处理线程处理?

public void run(int a_numThreads) {
    Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
    topicCountMap.put(topic, new Integer(a_numThreads));
    Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
    List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

    // now launch all the threads
    //
    executor = Executors.newFixedThreadPool(20);

    // now create an object to consume the messages
    //
    int threadNumber = 0;
    for (final KafkaStream stream : streams) {
        executor.submit(new ConsumerTest(stream, threadNumber));
        threadNumber++;
    }
}

编辑:我在post中看到了答案。但是我有以下问题:

如果单个主题有20个分区,我可以在2个不同的节点上运行使用者吗?我是否应该在每个消费者中提到消息流的数量为10?当我的节点出现故障或存在性能问题时,数据流是否会自动重新平衡到工作节点?

1 个答案:

答案 0 :(得分:1)

是的,您可以在不同节点上运行多个使用者来使用同一主题。根据机器配置,消息流的数量可以是10个不同。如果它的小机器你可以给5个左右。

如果一个节点发生故障,它会自动转移到加载到其他节点。除了失败之外,还有其他属性,例如topic.metadata.refresh.interval.ms,它决定何时重新平衡加载。