卡夫卡消费者:从主题控制阅读

时间:2017-03-01 10:14:50

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

我有以下kafka消费者代码,其中3个线程正在从具有3个分区的kafka主题中读取。

有没有办法,只有在线程处理的消息得到处理之后才会从kafka主题中读取新消息。

例如,假设主题中有100条消息,那么有什么方法可以一次只读取3条消息并进行处理。现在当处理这3条消息时,只能读取接下来的3条消息,依此类推。

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

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

2 个答案:

答案 0 :(得分:3)

如果ConsumerTest中的迭代器正在同步处理消息,那么一次只会消耗3条消息。 enable.auto.commit默认为true。确保不要将其设置为false,否则需要添加用于提交偏移量的逻辑。

前 -

 ConsumerIterator<byte[], byte[]> streamIterator= stream.iterator(); 
 while (streamIterator.hasNext()) { 
   String kafkaMsg= new String(streamIterator.next().message()); 
 } 

答案 1 :(得分:2)

嗯,消费者默认不了解对方,所以不能同步&#34;同步&#34;他们的工作。你能做的就是将你的三条信息整理成一条(从而保证它们都能按顺序回答),或者引入更多(&#34; sub&#34;)主题。

另一种可能性(如果您确实需要保证个人消费者将使用您的三条消息)可能是您的所有消费者同步他们的工作或者通知跟踪您工作的控制器。

但是感觉就像你做错了#34;实际上队列中的消息是无状态的,只有他们在主题中的顺序决定了他们应该做的顺序。被处理&#34;。正在处理消息时无关紧要。