新的Kafka版本(0.11)只支持一次语义。
我已经在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;
如何生成维护消耗偏移的列表?什么意思呢?
答案 0 :(得分:4)
这仅与您正在使用的工作流有关,然后根据您消耗的内容生成消息。此功能允许您仅在下游生成成功时提交您消耗的偏移量。如果您使用数据,以某种方式处理数据,然后生成结果,这将在整个消费/生产中实现事务性保证。
如果没有交易,通常会使用Consumer#commitSync()
或Consumer#commitAsync()
来提交消费者抵消。但是,如果您在生产者生产之前使用这些方法,则在知道生产者是否成功发送之前,您将提交抵消。
因此,您可以在生产者上使用Producer#sendOffsetsToTransaction()
代替向消费者提交偏移量,而不是提交偏移量。这会将偏移量发送给处理事务的事务管理器。只有当整个交易消耗和生产成功时,它才会提交抵消。
(注意:当您将偏移量发送到提交时,您应该在上次读取的偏移量中添加1,以便将来从您尚未读取的偏移量中继续读取。这是真的无论您是与消费者还是生产者一起提交。请参阅:KafkaProducer sendOffsetsToTransaction need offset+1 to successfully commit current offset)。