首页 > 解决方案 > 考虑 Kafka Streams 和 Spring Cloud Stream 的设计问题

问题描述

我需要维护外部系统记录 (KTables) 并跟踪这些记录 (KStreams) 上的任何更改。

KTables 将由 KSQL 查询请求,而 KStreams 将由事件监视器处理。

问题:

  1. 我需要 KTable 像来自外部系统的镜像一样工作。如果我决定在数据存储方面使用这种设计,我会有什么问题吗?数据丢失,过期?
  2. 使用 Spring,数据类型的最佳方法是什么?带有模式注册表的 Avro?
  3. 一切的源头都是一个话题,对吧?所以我需要向主题发送消息,我的 KTable 和 KStream 会根据需要进行翻译。那正确吗?
  4. KTable 定义是已知的,但我可能会动态创建一组 KStream;实现这一目标的最佳方法是什么?

我感谢任何可以帮助更好地设计它的评论。

标签: apache-kafkaapache-kafka-streamsspring-kafkaspring-cloud-stream

解决方案


这是我对这些问题的建议/意见,您可能想进一步研究一些与 Kafka Streams 相关的核心问题。

  1. 不完全清楚您提出的用例/设计。按照我的理解,您有一个外部系统(例如数据库),并且您希望将该数据提取为键/值对,该键/值对可以转换为KTable. 在 Kafka Streams 中,正如您在问题 #3 中指出的那样,事实的来源是 Kafka 主题。因此,您需要先将来自外部系统的数据导入到 Kafka 主题中,然后将其作为KTableKafka Streams 中的一个具体化。已经建立了诸如变更数据捕获 (CDC) 之类的模式,用于几乎实时地将数据从外部系统导出到 Kafka 主题。KTable可以具体化到默认情况下备份 RocksDB 的状态存储中。Kafka 更改日志主题也复制了相同的信息,因此应用了 Kafka 主题中的数据提供的保证。我希望 Kafka Streams 团队的某个人可以就这个特定主题发表意见,以获取所需的更多信息。
  2. Spring Cloud Stream 为 Kafka Streams 提供了一个 binder,您可以使用它通过各种 Kafka Streams 类型(例如KStream和. 有关更多详细信息,请参阅参考文档binder 为使用Serde 推理的数据类型提供了几个方便的选项KTableGlobalKTable在常见数据类型的情况下。关于 Avro 数据类型的问题实际上取决于您的用例以及您希望如何管理数据的模式结构。如果集中式模式管理是一个问题,那么 avro 是一个不错的选择。您可以将 Confluent 的 Avro 模式注册表与 Spring Cloud Stream 一起使用。Spring 提供了模式注册表,但对于需要 avro 的 Kafka Streams 工作负载,我们建议使用 Confluent 模式注册表,因为它具有更多功能。无论哪种方式,它都应该可以工作,我们在这里提供了一些示例应用程序来演示模式演变。
  3. 正如我在 #1 的答案中提到的那样,是的,事实的来源是 Kafka 主题,Spring Cloud Stream binder 提供了用于连接到 Kafka 主题并将数据转换为KStream或的绑定机制KTable
  4. 再说一次,我没有关注实际的用例。但是,Kafka Streams 提供了许多不同的 API 方法,允许您转换传入的数据,以便KStream可以动态创建其他类型。例如,您对传入应用一个maporflatMap操作KStream,从而从中创建一个新KStream的。不确定,如果那是你的意思。如果是这样的话,那么它真的变成了一个业务逻辑问题。这当然是可能的。

希望这会有所帮助,再次,这些是我对这些的想法,对于其中一些问题,没有正确或错误的答案。您需要仔细考虑用例和设计选项,并选择适合您需求的正确路径。


推荐阅读