我有一个主题列表(现在是10个),其大小可以在将来增加。我知道我们可以生成多个线程(每个主题)来从每个主题中使用,但在我的情况下,如果主题数量增加,那么从主题中消耗的线程数量会增加,这是我不想要的,因为主题不是过于频繁地获取数据,因此线程将是理想的。
有没有办法让一个消费者从所有主题中消费?如果是,那我们怎样才能实现呢?卡夫卡还将如何维持这种抵消?请提出答案。
答案 0 :(得分:10)
我们可以使用以下API订阅多个主题: consumer.subscribe(Arrays.asList(topic1,topic2),ConsumerRebalanceListener obj)
Consumer有主题信息,我们可以通过创建OffsetAndMetadata对象使用consumer.commitAsync或consumer.commitSync()进行如下操作。
ConsumerRecords<String, String> records = consumer.poll(long value);
for (TopicPartition partition : records.partitions()) {
List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
for (ConsumerRecord<String, String> record : partitionRecords) {
System.out.println(record.offset() + ": " + record.value());
}
long lastOffset = partitionRecords.get(partitionRecords.size() - 1).offset();
consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)));
}
答案 1 :(得分:2)
不需要多个线程,您可以拥有一个消费者,使用多个主题。 由zooaf维护偏移量,因为kafka-server本身是无状态的。 每当消费者使用消息时,其偏移量将与zookeeper一起提交,以保持未来的跟踪仅处理每条消息一次。因此,即使在kafka失败的情况下,消费者也会从最后一次提交的偏移开始消费。