在测试环境中,我有3个Kafka代理,主题是16个分区,有16个IOT设备将消息发布到Kafka。我有一个带Kafka Consumer的单一系统,该系统订阅了该主题。每个物联网设备每秒钟将消息发布到Kafka,并均匀分布。我是
在这些每个IOT设备上打印使用Kafka Producer回调方法将数据发布到的偏移和分区。我的使用者停止随机使用某些分区中的消息,同时停止处理其他分区中的记录。我实际上验证了IOT设备日志,并且可以看到数据实际上已发布到使用者停止使用的特定分区,并且我能够看到这些分区的偏移量正在增加。使用者中没有任何异常或任何类型的错误,除了我看不到停止处理的分区的任何处理日志。下面我捕获了我的消费者代码片段。
public class MyKafkaConumer extends Thread {
private static final AtomicBoolean running= new AtomicBoolean(true);
private static final KafkaConsumer consumer;
public static final MyKafkaConumer INSTANCE = new MyKafkaConumer();
static {
Properties props = new Properties();
props.put("bootstrap.servers", "kafkaServer101:9092,kafkaServer102:9092,kafkaServer103:9092");
props.put("group.id", "mykafa-group");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
IOTDeserializer.class.getName());
consumer = new KafkaConsumer(props);
consumer.subscribe(Arrays.asList("mytopic"));
}
private MyKafkaConumer() {
super("MyKafkaConumer");
}
public void run() {
try {
while (running.get()) {
ConsumerRecords records = consumer.poll(2000L);
records.forEach(record -> {
System.out.printf("Consumer Record:(%s, %s, %d, %d)\n", record.key(), record.value(),
record.partition(), record.offset());
});
}
} finally {
consumer.close();
}
}
public static void main(String[] args) throws InterruptedException {
MyKafkaConumer.INSTANCE.start();
MyKafkaConumer.INSTANCE.join();
}
}
我只有一个Consumer,并且正在运行一个线程。即使生产者将消息发送到卡住的分区,卡夫卡消费者在处理其他分区时仍从某些分区停止处理的原因是什么?非常感谢您的任何帮助。在一些随机的时间间隔后将恢复分区,但是由于应用程序丢失了实时数据,因此分区没有用。我同时为Kafka经纪人和客户端使用Kafka版本0.11.01版本