apache-kafka - 幂等和事务
问题描述
我正在探索 Kafka 中的事务,我想了解所有细节。
我注意到在 Spring-Kafka 中,当您提供 transactionalId 时启用了幂等性。
public void setTransactionIdPrefix(String transactionIdPrefix) {
Assert.notNull(transactionIdPrefix, "'transactionIdPrefix' cannot be null");
this.transactionIdPrefix = transactionIdPrefix;
enableIdempotentBehaviour();
}
乍一看,我假设 Spring-Kafka 在事务中启用了幂等性,因为它是“物有所值”的。我认为这是为了确保在事务中确保一次性语义。
我做了更多的挖掘,发现事务需要幂等才能工作。这在KIP-98中提到
请注意,如果配置了 TransactionalId,则必须启用 enable.idempotence。
Kafka 幂等性是一种避免重复消息的功能,例如消息发送后的网络错误。
我的理解是,Kafka 事务基本上写入一个内部主题,并且必须启用幂等以避免重复。
幂等为生产者启用了一次性语义。
事务为传递性启用了一次性语义;消费 -> 生产。
我的理解正确吗?
什么只为消费者启用一次?提交偏移、幂等或事务。
解决方案
幂等生产者针对单个主题为生产者启用一次。基本上,每条消息发送都有更严格的保证,并且在出现错误的情况下不会重复。
另一方面,事务生产者可以将多个发送(可以跨多个分区)组合在一起,并应用所有发送(或不应用)。事务还可以包含偏移提交(最终提交偏移与写入主题相同)。
因为消费者从 Kafka 获取数据,所以它已经是一次。当消费者从偏移量 N 向 Kafka 请求消息时,如果没有收到,它只会重试,不能有任何重复。消费者唯一需要的是提交偏移量,这可以由事务生产者完成(消费者需要将其当前的偏移量传递给生产者)。
推荐阅读
- mysql - 在 mySQL 中将随机数分配给具有 NULL 值的列
- javascript - 如何在条件字符串中使用多个 async / await 调用?
- reactjs - 静态 S3 网站 (React SPA) 记录到 Elasticsearch
- r - 我如何显示最匹配的汽车名称和余弦相似度值并将它们显示在两个单独的列上?(需要提取第二大的值)
- neo4j - 我无法通过 neo4j 创建数据
- c# - 如何使用 C# 从 myjson.com 动态更新 json 文件?
- firebase - 拥有隔离用户组的最可靠方法是什么?
- java - 在 Apache POI(docx)中包装文本?
- java - 在 Tomcat 服务器中部署 war 文件的问题
- android - 混淆 Android 库 AAR