我想向Kafka发送消息并阅读而无需自动提交。
我这样发送消息:
private Producer<Void, String> createProducer(String kafkaBootstrapServers) {
return new KafkaProducer<>(
ImmutableMap.of(
ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapServers,
ProducerConfig.CLIENT_ID_CONFIG, UUID.randomUUID().toString()
),
new VoidSerializer(),
new StringSerializer());
}
private void sendToKafka(int partition, String... messages) {
try (Producer<Void, String> producer = createProducer(kafkaContainerBootstrapServers)) {
Arrays.stream(messages).forEach(
message -> producer.send(new ProducerRecord<>(KAFKA_TOPIC, partition, null, message)));
}
}
我是用Apache Beam从Kafka读的:
KafkaIO.<Void, String>read()
.withBootstrapServers(options.getKafkaBootstrapServers())
.withProcessingTime()
.withKeyDeserializer(VoidDeserializer.class)
.withValueDeserializer(StringDeserializer.class)
.updateConsumerProperties(new ImmutableMap.Builder<String, Object>()
.put(ENABLE_AUTO_COMMIT_CONFIG, false)
.put(AUTO_OFFSET_RESET_CONFIG, options.getKafkaConsumerOffsetReset())
.put(GROUP_ID_CONFIG, options.getKafkaConsumerGroup())
.build())
.withConsumerFactoryFn(new ConsumerFactoryFn())
.commitOffsetsInFinalize()
.withReadCommitted();
但是偏移量并不总是提交。
我使用此命令查看偏移量:
bin/kafka-console-consumer.sh --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --bootstrap-server localhost:43881 --topic __consumer_offsets --from-beginning
我有三个分区。
首先,我需要为一个分区发送10条以上的消息,以查看该分区的偏移量(不知道为什么)。当我有一个分区并发送11条消息时,一切都很好。
[group,test,0]::OffsetAndMetadata(offset=10, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1553866358077, expireTimestamp=Some(1554471158077))
第二,有时即使每个分区发送11条消息(从1个分区更改为3个分区后),每个分区也没有偏移。