从这篇文章https://www.confluent.io/blog/transactions-apache-kafka/
使用为至少一次交付语义配置的vanilla Kafka生产者和消费者,流处理应用程序可能会以以下方式完全丢失一次处理语义:
2.我们可能会重新处理输入消息A,导致重复的B消息被写入输出,违反了一次处理语义学。如果流处理应用程序在写入B后但在将A标记为已消耗之前崩溃,则可能会发生再处理。因此,当它恢复时,它将再次消耗A并再次写入B,导致重复。
3.最后,在分布式环境中,应用程序会崩溃,或者更糟!暂时失去与系统其他部分的连接。通常,新实例会自动启动以替换被认为丢失的实例。通过这个过程,我们可能会有多个实例处理相同的输入主题和写入相同的输出主题,导致重复输出,违反了一次处理语义学。我们称之为“僵尸实例”的问题
问题
关于第2点,它提到当应用程序崩溃时,它将使用A并再次写入B。但是生产者幂等性不是已经处理了发送副本的情况吗?就像第一点一样?
第3点也会导致重复发送,难道第2和第3点不应该和第1点一样吗?哪些可以用幂等性处理?
幂等生产者在每个分区级别和生产者的生命周期内只保证一次语义。
因此,它能够涵盖场景1)。
但如果生产商崩溃(甚至完全重新启动),这些保证将不再有效,就像您在2)和3)中描述的那样,它可能会导致重复。
要处理2)和3),可以使用事务生成器。它可以确保以原子方式处理和提交消息,因此,如果出现任何故障,将正确地放弃中间工作,以便新实例启动不会导致任何重复。此外,“僵尸”实例将被适当地隔离,并防止其完全违反一次语义。
权衡是保证/速度。事务生产者提供了更多的保证,但会对性能产生影响。
在任何情况下,您选择哪个生产商取决于您的需求。有关文档,请参见以下两个部分,提供更多详细信息:
Kafka为每条消息生成偏移量。假设,我正在生成消息5,偏移量将从1到5。 但是,在事务生产者中,比如说,我产生了5条消息并提交,然后是5条消息但中止,然后是5条消息提交。 > 那么,最后提交的5条消息的偏移量是6到10还是11到15? 如果我不放弃或不promise呢。这些信息还会被发布吗? Kafka是如何忽略未promise的补偿的?因此,kafka提交日志是基于偏移量的。它是否使用事务使用
我正在处理一个kafka用例,在这个用例中,我需要在生产者和消费者端具有事务性语义...我可以使用kafka transaction API 0.11将事务性消息发布到kafka集群,但在消费者端,我面临着一个问题...我在属性文件中设置了但我不能使用它...我可以看到消息被使用但这不是希望的... 生产者代码 ProducerTX.Properties 消费者 感谢你的帮助..谢谢
我们使用StreamListeners for Spring Kafka,并使用基于JPA的发件箱发送消息。发件箱是从消费中异步清空的,因此我们不希望“从JPA表读取,向Kafka生成消息”上的事务。 但是我们也有重试主题,因此如果使用失败,我们会将失败的消息移动到重试主题(最终是DLT),这确实需要事务性的。 据我所知,只有在全局基础上(设置事务id前缀),而不是在具体绑定上,才有可能为生产者打
我们有一个基于spring boot的事务性Kafka制作人!使用的版本如下 spring-boot-starter-父-2.3.0。释放 spring-kafka-2.5.0。释放 我们的kafka(集群)版本是2.1. x! 作为生产者,我们启用了幂等性,定义了事务id前缀,并在事务中执行kafka模板调用。我们还有一个将隔离级别设置为只读的使用者! 现在我们遇到了一个行为,不知道如何推断,
我们有一个使用Kafka的Spring-Cloud-Stream应用程序。要求是在生产者端,消息列表需要放在事务的主题中。同一应用中的消息没有消费者。当我使用spring启动事务时。云流动Kafka。粘合剂交易事务id前缀,我面临的错误是调度程序没有订阅服务器,并且从主题获得的分区总数少于配置的事务。应用程序无法在事务模式下获取主题的分区。你能告诉我是否遗漏了什么吗。明天我会发布详细的日志。 谢啦
一、生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程: Kafka 会将发送消息包装为 ProducerRecord 对象, ProducerRecord 对象包含了目标主题和要发送的内容,同时还可以指定键和分区。在发送 ProducerRecord 对象前,生产者会先把键和值对象序列化成字节数组,这样它们才能够在网络上传输。 接下来,数据被传给分区器。如果之前已经在 Prod