繁体   English   中英

Kafka Consumer:受控阅读主题

[英]Kafka Consumer : controlled reading from topic

我在下面的卡夫卡消费者代码中有3个线程正在从具有3个分区的卡夫卡主题中读取。

有什么办法,只有在线程处理了当前正在处理的消息之后,才会从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++;
   }
}

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

EX-

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

嗯,消费者默认情况下并不相互了解,因此无法“同步”他们的工作。 您可能要做的就是将三个消息包装成一个(从而保证它们将按顺序得到答复),或者可能引入更多(“子”)主题。

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

但是感觉就像您“做错了”,实际上队列中的消息是无状态的,只有它们在主题中的顺序决定了它们的“处理顺序”。 处理消息的时间无关紧要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM