私はspringboot 2を使用して、プロジェクト、kafk 2.2.0、春・カフカを作ってるんだ2.2.5
私は集約しkafka exactly once
生産と同様だったのかかる環境やメッセージを。
しかしではkafka-consumer-groups.sh
、このようsaied。
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG
test_topic 0 23 24 1
test_topic 1 25 26 1
test_topic 2 21 22 1
私はカフカに一つだけのメッセージを送信するが、LOG-END-OFFSET
ダブルアップと1つの遅れが常に残ります。(意図したように、私のjavaアプリでは、作品を制作し、消費します)
LOG-END-OFFSETは、ダブルアップ、なぜ私は知りません。
削除する場合はexactly once
設定を、全く問題ではありませんLOG-END-OFFSET
し、CURRENT-OFFSET
カウントが。
それは私のあるkafkaTemplate
セットアップコード。
@Bean
@Primary
public ProducerFactory<String, Object> producerFactory() {
Map<String, Object> producerProperties = new HashMap<>();
producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092";
producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
// exactly once producer setup
producerProperties.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
DefaultKafkaProducerFactory factory = new DefaultKafkaProducerFactory<>(producerProperties, new StringSerializer(), new JsonSerializer<>(KafkaStaticOptions.OBJECT_MAPPER));
factory.setTransactionIdPrefix("my.transaction.");
return factory;
}
@Bean
@Primary
public KafkaTransactionManager<String, Object> kafkaTransactionManager(
ProducerFactory<String, Object> producerFactory) {
return new KafkaTransactionManager<>(producerFactory);
}
@Bean
@Primary
public KafkaTemplate<String, Object> kafkaTemplate(ProducerFactory<String, Object> producerFactory) {
return new KafkaTemplate<>(producerFactory);
}
私のプロデューサーコード。
kafkaTemplate.executeInTransaction(kt -> kt.send("test_topic", "test data hahaha"));
LOG-END-OFFSETは、ダブルアップ、そしてそれがあるとき、私は確認produce transaction commit
のタイミング。
何が間違って設定をしましたか?
トランザクションを使用する場合は、カフカの挿入「コントロールバッチログには、」メッセージがトランザクションの一部であったかどうかを示すために。
あなたはオフセットがあなたが単一のレコードだけを送っていても2ずつ増加ご覧なぜこれがあるので、これらのバッチもオフセットが割り当てられています。
ご自分で確認したい場合は、あなたのログの内容を表示し、対照バッチを参照してくださいDumpLogSegmentsツールを使用することができます。
./bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/mytopic-0/00000000000000000000.log
Dumping /tmp/kafka-logs/mytopic-0/00000000000000000000.log
Starting offset: 0
baseOffset: 0 lastOffset: 0 count: 1 baseSequence: 0 lastSequence: 0 producerId: 0 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: true isControl: false position: 0 CreateTime: 1558083247264 size: 10315 magic: 2 compresscodec: NONE crc: 3531536908 isvalid: true
baseOffset: 1 lastOffset: 1 count: 1 baseSequence: -1 lastSequence: -1 producerId: 0 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: true isControl: true position: 10315 CreateTime: 1558083247414 size: 78 magic: 2 compresscodec: NONE crc: 576574952 isvalid: true
私は、単一のレコードを送信するためにトランザクションのプロデューサーを使用して、あなたは第二のエントリが持っていることがわかりますisControl: true
。