如何处理内部 kafka-streams 主题的 avro 模式?

How to deal with avro schema for internal kafka-streams topics?

提问人:m-kay 提问时间:11/17/2023 更新时间:11/18/2023 访问量:35

问:

我们将 Avro 方案用于代表“公共”接口的 kafka 主题。现在,当在 Kafka-Streams 应用程序中使用此类主题并调用有状态操作时,将再次自动使用内部名称注册相同的架构。

处理这个问题的常用方法是什么?除了我的应用程序之外,这些主题和状态存储永远不会被任何其他人使用,因此我认为将该架构发布到注册表的意义不大。有没有办法只使用一些本地可用的架构,或者至少不再为每个内部主题多次发布架构?

apache-kafka apache-kafka-streams avro spring-cloud-stream confluent-schema-registry

评论


答:

-2赞 Sara M. 11/17/2023 #1

我认为最好的解决方案是通过设置配置参数来禁用自动模式注册,并改用模式注册表。auto.register.schemas=false

PS:auto.register.schemas=false应该在客户端设置

查看 https://docs.confluent.io/platform/current/schema-registry/security/index.html

评论

0赞 m-kay 11/17/2023
实际上,我禁用了自动注册,但是kafka-streams随后使用生成的主题名称(例如)扩展架构注册表中存在的模式,例如,并且对于每个有状态操作,因此我必须使用不同的主题名称多次将我的模式添加到模式注册表中。my-streams-application-KSTREAM-TOTABLE-STATE-STORE-0000000006-changelog
0赞 Sara M. 11/17/2023
你在哪里设置了 auto.register.schemas=false ?
0赞 m-kay 11/20/2023
在我的 kafka streams 应用程序的属性中。
0赞 OneCricketeer 11/23/2023
“改用 Schema Registry”是什么意思? 仅当使用注册表 + 时有效auto.register.schemas=falseAvroSerde
0赞 OneCricketeer 11/23/2023 #2

不再为每个内部主题多次发布架构

您可以修改拓扑的每个步骤的 Serde,但这样一来,您就不必要地在不同的数据格式(一种具有注册表 ID,另一种没有注册表 ID)之间来回封送数据。这最终会减慢您的处理速度。当您使用 AvroSerde + SpecificRecord 子类时,每个架构都已经是本地的......但是,这不会阻止 HTTP 请求使用为每个内部主题配置的类到达注册表。TopicNameStrategy

注册表服务器使用者列表不是公共 API 的一部分。它是私人的。

评论

0赞 m-kay 11/27/2023
实际上,将内部主题的 Serde 更改为不同的数据格式正是我想要避免的,因为我想从 avro 消息的较小大小中受益,以保持我的状态更小。我现在所做的是一个新功能,我可以为特定类型配置固定的主题名称。SubjectNameStrategy
0赞 OneCricketeer 11/27/2023
我说修改,而不是使用不同的。重新配置新的 AvroSerde,而不是使用相同的默认 AvroSerde,仍在修改它