Kafka是否有批量消费者?

时间:2016-03-03 19:23:25

标签: apache-kafka

高级消费者API似乎一次只能阅读一条消息。

如果消费者想要处理这些消息并将其提交给Solr或Elastic-Search等其他下游消费者,因为他们更喜欢批量发送消息而不是一次发送消息,这对消费者来说可能是个问题。

将这些消息在内存中批处理也不是一件容易的事,因为Kafka中的偏移量也只需要在批处理已经提交时同步,否则崩溃的kafka-consumer与未提交的下游消息(如在Solr或ES中)将会已经更新了它的偏移量,因此消息松散。

如果消息在下游提交消息后但在更新消息偏移之前崩溃,消费者可能会多次使用消息。

如果Kafka批量使用消息,那么非常感谢代码/文档的一些指示。

谢谢!

1 个答案:

答案 0 :(得分:4)

我不知道批量消费者。但即使有一个主要问题仍然存在。您希望在成功转发数据后提交偏移量。实现此目的的一种方法是通过设置属性auto.commit.enable = false来关闭消费者的自动提交。权衡当然是你必须要注意何时提交补偿。

在此处查找消费者属性的完整文档:https://kafka.apache.org/documentation.html#consumerconfigs

关于如何手动提交从java-doc(https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html)中窃取的偏移量的一个很好的例子:

 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("group.id", "test");
 props.put("enable.auto.commit", "false");
 props.put("auto.commit.interval.ms", "1000");
 props.put("session.timeout.ms", "30000");
 props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
 consumer.subscribe(Arrays.asList("foo", "bar"));
 final int minBatchSize = 200;
 List<ConsumerRecord<String, String>> buffer = new ArrayList<>();
 while (true) {
     ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records) {
         buffer.add(record);
     }
     if (buffer.size() >= minBatchSize) {
         insertIntoDb(buffer);
         consumer.commitSync();
         buffer.clear();
     }
 }