在Kafka 0.11中sendOffsetsToTransaction的含义

时间:2017-07-19 15:30:12

标签: java multithreading apache-kafka kafka-producer-api

新的Kafka版本(0.11)只支持一次语义。

https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging

我已经在java中使用kafka事务代码进行了生成器设置。

producer.initTransactions();
    try {
        producer.beginTransaction();
        for (ProducerRecord<String, String> record : payload) {
            producer.send(record);
        }

        Map<TopicPartition, OffsetAndMetadata> groupCommit = new HashMap<TopicPartition, OffsetAndMetadata>() {
            {
                put(new TopicPartition(TOPIC, 0), new OffsetAndMetadata(42L, null));
            }
        };
        producer.sendOffsetsToTransaction(groupCommit, "groupId");
        producer.commitTransaction();
    } catch (ProducerFencedException e) {
        producer.close();
    } catch (KafkaException e) {
        producer.abortTransaction();
    }

我不太确定如何使用sendOffsetsToTransaction及其预期用例。 AFAIK,消费者群体是消费者端的多线程阅读功能。

javadoc说

&#34;将消耗的偏移列表发送到使用者组协调器,并将这些偏移标记为当前事务的一部分。仅当事务成功提交时,才会考虑使用这些偏移量。当您需要一起批量消费和生成消息时,应该使用此方法,通常采用消费转换生成模式。&#34;

如何生成维护消耗偏移的列表?什么意思呢?

1 个答案:

答案 0 :(得分:4)

这仅与您正在使用的工作流有关,然后根据您消耗的内容生成消息。此功能允许您仅在下游生成成功时提交您消耗的偏移量。如果您使用数据,以某种方式处理数据,然后生成结果,这将在整个消费/生产中实现事务性保证。

如果没有交易,通常会使用Consumer#commitSync()Consumer#commitAsync()来提交消费者抵消。但是,如果您在生产者生产之前使用这些方法,则在知道生产者是否成功发送之前,您将提交抵消。

因此,您可以在生产者上使用Producer#sendOffsetsToTransaction()代替向消费者提交偏移量,而不是提交偏移量。这会将偏移量发送给处理事务的事务管理器。只有当整个交易消耗和生产成功时,它才会提交抵消。

注意:当您将偏移量发送到提交时,您应该在上次读取的偏移量中添加1,以便将来从您尚未读取的偏移量中继续读取。这是真的无论您是与消费者还是生产者一起提交。请参阅:KafkaProducer sendOffsetsToTransaction need offset+1 to successfully commit current offset)。