Scala 卡夫卡流拓扑在生产中的演变

Scala 卡夫卡流拓扑在生产中的演变,scala,apache-kafka,apache-kafka-streams,Scala,Apache Kafka,Apache Kafka Streams,我有一个复杂的拓扑结构,包括KStreams、KTables、join、rekeying、filter、through、branching、zips等,以及关于输出主题的实时客户端 所有输入、中间和输出主题都是基于avro的主题 我如何处理拓扑的更改(添加新步骤、新输入和输出主题),知道kafka streams维护内部状态和更改日志,并遵守以下业务要求: 无数据丢失 无数据重复(在一定程度上) 没有停机时间 答案是否介于使用kafka streams应用程序重置或创建全新的消费者组(应用程

我有一个复杂的拓扑结构,包括KStreams、KTables、join、rekeying、filter、through、branching、zips等,以及关于输出主题的实时客户端

所有输入、中间和输出主题都是基于avro的主题

我如何处理拓扑的更改(添加新步骤、新输入和输出主题),知道kafka streams维护内部状态和更改日志,并遵守以下业务要求:

  • 无数据丢失
  • 无数据重复(在一定程度上)
  • 没有停机时间

答案是否介于使用
kafka streams应用程序重置
或创建全新的消费者组(应用程序id)之间?

目前,kafka streams中没有检查点或保存点类型的概念

如果需要更新现有应用程序,可以安全地使用新的application.id或重置现有的
application.id

在某些情况下,您需要根据拓扑中的更改定义一个新的
application.id


谢谢您的回答。如果我重置AppApplication id,KStream KTable join会发生什么情况?kafka streams是否足够聪明,可以在加入KStream之前重新填充KTable?是的,通常情况下,在应用程序考虑运行和执行连接等转换之前,KTable上的内部存储将从基础主题中收费。如果重置应用程序Id,它将删除所有基础更改日志主题。因此,ktable无法重新填充。它将是在下一次运行中创建的新ktable,带有新的changelog主题和状态存储。它取决于时间戳。如果KTable记录的时间戳小于KStream记录,则KTable记录将首先放入KTable(您需要版本2.1——在较旧的版本中,时间戳同步仅为最大努力),创建另一个主题或使用相同的键并执行压缩以删除旧记录是安全的