在kafka中,当通过交易产生消息时,消费者抵销额增加了一倍

时间:2019-05-17 08:33:21

标签: java apache-kafka spring-kafka

我正在使用springboot 2,kafk 2.2.0,spring-kafka 2.2.5制作项目

我创造了kafka exactly once环境,并且消息的产生和使用都很好。

但是kafka-consumer-groups.sh这样说。

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   

我只向kafka发送了一条消息,但LOG-END-OFFSET却翻了一番,始终有1个滞后。 (在我的Java应用程序中,按预期方式制作和使用作品)

我不知道为什么LOG-END-OFFSET加倍。

如果删除exactly once配置,则LOG-END-OFFSETCURRENT-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时间。

我做了什么错误的配置?

1 个答案:

答案 0 :(得分:1)

使用事务时,Kafka在日志中插入“ control batches”,以指示消息是否属于事务。

这些批次也被分配了偏移量,因此即使您仅发送了一条记录,这也使偏移量增加了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