kafka new api 0.10不提供每个主题的流和消费者对象的列表

时间:2016-09-30 20:03:32

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

以前我一直在使用0.8 API。当您向其传递主题列表时,它将返回流的映射(每个主题一个条目)。这允许我生成一个单独的线程并将每个主题的流分配给它。在每个主题中包含太多数据,产生一个单独的线程有助于多任务处理。

//0.8 code sample
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap =  
consumer.createMessageStreams(topicCountMap);

我想升级到0.10。我检查了KafkaStreamsKafkaConsumer个类。 KafkaConsumer对象获取配置属性并提供带有主题List的订阅方法,其返回类型为void。我找不到可以处理每个主题的方法。

KafkaConsumer consumer = new KafkaConsumer(props);
consumer.subscribe(topicsList);
conusmer.poll(long ms)
另一方面,

KafkaStreams似乎也有同样的问题。

KStreamBuilder builder = new KStreamBuilder();
String [] topics = new String[] {"topic1", "topic2"};
KStream<byte[], byte[]> source = builder.stream(stringSerde, stringSerde, topics);
KafkaStreams streams = new KafkaStreams(builder, props);
streams.start();

source.foreach()方法可用,但它是所有主题的流。任何人,任何想法?

1 个答案:

答案 0 :(得分:2)

首先,使用多线程消费者是棘手的,因此您在0.8中使用的模式有望设计得很好:)

最佳做法是使用单线程消费者,因此,如果单个消费者一次订阅主题列表,则“无需”分隔不同的主题。然而,在使用记录时,记录对象提供有关其源自哪个主题的信息(它携带此元数据)。因此,理论上您可以根据其主题将记录分发到不同的线程以进行实际处理(即使不推荐这样做!)。

Kafka通过分区扩展,因此,如果单线程使用者无法处理负载,您应该启动多个使用者(作为使用者组)扩大您的消费者处理能力。

更一般的问题:如果您想要处理每个主题的数据,为什么不使用每个订阅一个主题的多个消费者?

最后但并非最不重要的是,在Apache Kafka 0.10+中, Kafka Streams API是一个新引入的流处理库 - 尽管它不能与0.8 KafkaStream类混淆(提示,没有“s”)。两者完全无关。