Spring 春季卡夫卡与交易
我想在事务中使用SpringKafka,但我真的不明白应该如何配置它以及它是如何工作的 这是我的配置Spring 春季卡夫卡与交易,spring,apache-kafka,spring-transactions,spring-kafka,Spring,Apache Kafka,Spring Transactions,Spring Kafka,我想在事务中使用SpringKafka,但我真的不明白应该如何配置它以及它是如何工作的 这是我的配置 props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true"); props.put(ProducerConfig.RETRIES_CONFIG, String.valueOf(Integer.MAX_VALUE)); props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_P
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
props.put(ProducerConfig.RETRIES_CONFIG, String.valueOf(Integer.MAX_VALUE));
props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 1);
props.put(ProducerConfig.ACKS_CONFIG, "all");
此配置用于事务id前缀为的DefaultKafkaProducerFactory:
defaultKafkaProducerFactory.setTransactionIdPrefix("my_app.");
问题1:
我应该如何选择此事务id前缀?
如果我理解正确,spring使用这个前缀为创建的每个生产者生成事务id
为什么我们不能使用“UUID.randomuid()
问题2:
如果生产者被销毁,它将生成一个新的事务id。
因此,如果应用程序崩溃,重新启动时它将重用旧的事务id
这正常吗
问题3:
我正在使用一个部署在云上的应用程序,它可以自动放大/缩小。
这意味着无法修复我的前缀,因为每个实例上的所有生产者都会有冲突的事务id
我应该在其中添加一个随机部分吗?
当实例缩小/增大或崩溃并重新启动时,是否需要恢复相同的前缀
问题4:
最后但并非最不重要的一点是,我们正在使用卡夫卡的凭证。
这似乎不起作用:
Current ACLs for resource `TransactionalId:my_app*`:
User:CN... has Allow permission for operations: All from hosts: *
在知道已生成事务ID的情况下,如何设置ACL
编辑1
进一步阅读后,如果我理解正确
如果您有一个从P0(分区)读取的C0(消费者)。如果代理启动消费者再平衡。
P0可以分配给另一个消费者C1。
此消费者C1应使用与之前的C0相同的交易id,以防止重复(僵尸围栏)
如何在SpringKafka中实现这一点?事务id似乎与使用者无关,因此与分区读取无关
谢谢
spring.kafka.producer.transaction-id-prefix=foo-${instance.index}-
自从这个答案(KIP-447)以来,情况发生了变化;如果您的代理是2.5.0或更高版本-请参阅。和1)进行了一些测试,如果我没有错,则事务将超时。从而导致消费者跳过生成的消息。2)不太理解此处的设计。如果应用程序中的生产者崩溃而未导致应用程序重新启动,则id将移动到1,从而导致id 0使用僵尸?直到应用程序重新启动?3)我不确定是否可以获得实例索引,但我会找出。无论如何,5)更重要。4)好的5)感谢这个问题,我们将创建一个1)啊,是的,它的行为与我测试它时描述的一样,但是,是的,我猜它将超时(尽管默认超时为15分钟:d2)好的一点;我们需要重用崩溃的ID。但是5)将是正确的解决方案。仅供参考,我在JVM上使用了一个断点来停止一个使用者a。大约5秒钟后(没有真正测量),另一个使用者B重新分配了分区,从而消耗了消息。最终的使用者C(如预期的那样)没有读取来自B的消息。大约30秒后,最终消费者C终于读取了来自B的消息。恢复消费者A后,消费者C仍然没有读取消息。包含修复程序的me1.3.7、2.0.6和2.1.10的超时时间似乎不到15分钟。maven central中有关于事务超时的问题: