Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 春季卡夫卡与交易_Spring_Apache Kafka_Spring Transactions_Spring Kafka - Fatal编程技术网

Spring 春季卡夫卡与交易

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

我想在事务中使用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_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似乎与使用者无关,因此与分区读取无关

谢谢

  • 由于僵尸防护,您不能使用随机TID-如果服务器崩溃,您可能会在主题中有一个部分事务,该事务将永远不会完成,并且不会从任何具有该事务写入的分区中消耗更多的内容

  • 这是出于上述原因而设计的

  • 同样,由于上述原因,您不能随机化

  • 例如,Cloud Foundry有一个指示实例索引的环境变量。如果您使用的云平台不包含类似的内容,则必须以某种方式对其进行模拟。然后,在事务id中使用它:

    spring.kafka.producer.transaction-id-prefix=foo-${instance.index}-
    
  • ACLs——我不能回答这个问题;我不熟悉卡夫卡的权限;最好单独问一个问题

  • 我认为我们需要向Spring添加一些逻辑,以确保相同的事务id始终用于特定的主题/分区

  • 编辑


    自从这个答案(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中有关于事务超时的问题: