apache-kafka - 考虑 Kafka Streams 和 Spring Cloud Stream 的设计问题
问题描述
我需要维护外部系统记录 (KTables) 并跟踪这些记录 (KStreams) 上的任何更改。
KTables 将由 KSQL 查询请求,而 KStreams 将由事件监视器处理。
问题:
- 我需要 KTable 像来自外部系统的镜像一样工作。如果我决定在数据存储方面使用这种设计,我会有什么问题吗?数据丢失,过期?
- 使用 Spring,数据类型的最佳方法是什么?带有模式注册表的 Avro?
- 一切的源头都是一个话题,对吧?所以我需要向主题发送消息,我的 KTable 和 KStream 会根据需要进行翻译。那正确吗?
- KTable 定义是已知的,但我可能会动态创建一组 KStream;实现这一目标的最佳方法是什么?
我感谢任何可以帮助更好地设计它的评论。
解决方案
这是我对这些问题的建议/意见,您可能想进一步研究一些与 Kafka Streams 相关的核心问题。
- 不完全清楚您提出的用例/设计。按照我的理解,您有一个外部系统(例如数据库),并且您希望将该数据提取为键/值对,该键/值对可以转换为
KTable
. 在 Kafka Streams 中,正如您在问题 #3 中指出的那样,事实的来源是 Kafka 主题。因此,您需要先将来自外部系统的数据导入到 Kafka 主题中,然后将其作为KTable
Kafka Streams 中的一个具体化。已经建立了诸如变更数据捕获 (CDC) 之类的模式,用于几乎实时地将数据从外部系统导出到 Kafka 主题。KTable
可以具体化到默认情况下备份 RocksDB 的状态存储中。Kafka 更改日志主题也复制了相同的信息,因此应用了 Kafka 主题中的数据提供的保证。我希望 Kafka Streams 团队的某个人可以就这个特定主题发表意见,以获取所需的更多信息。 - Spring Cloud Stream 为 Kafka Streams 提供了一个 binder,您可以使用它通过各种 Kafka Streams 类型(例如
KStream
和. 有关更多详细信息,请参阅参考文档。binder 为使用Serde 推理的数据类型提供了几个方便的选项KTable
GlobalKTable
在常见数据类型的情况下。关于 Avro 数据类型的问题实际上取决于您的用例以及您希望如何管理数据的模式结构。如果集中式模式管理是一个问题,那么 avro 是一个不错的选择。您可以将 Confluent 的 Avro 模式注册表与 Spring Cloud Stream 一起使用。Spring 提供了模式注册表,但对于需要 avro 的 Kafka Streams 工作负载,我们建议使用 Confluent 模式注册表,因为它具有更多功能。无论哪种方式,它都应该可以工作,我们在这里提供了一些示例应用程序来演示模式演变。 - 正如我在 #1 的答案中提到的那样,是的,事实的来源是 Kafka 主题,Spring Cloud Stream binder 提供了用于连接到 Kafka 主题并将数据转换为
KStream
或的绑定机制KTable
。 - 再说一次,我没有关注实际的用例。但是,Kafka Streams 提供了许多不同的 API 方法,允许您转换传入的数据,以便
KStream
可以动态创建其他类型。例如,您对传入应用一个map
orflatMap
操作KStream
,从而从中创建一个新KStream
的。不确定,如果那是你的意思。如果是这样的话,那么它真的变成了一个业务逻辑问题。这当然是可能的。
希望这会有所帮助,再次,这些是我对这些的想法,对于其中一些问题,没有正确或错误的答案。您需要仔细考虑用例和设计选项,并选择适合您需求的正确路径。
推荐阅读
- java - 无法替换批处理文件中的参数值 - PostBuildScript 插件 Jenkins
- javascript - 如果我在我的反应项目中使用故事书,我可以从我的 js 包中删除它吗?
- sql - 如何在 Postgres 中更新一对多关系?
- websphere - Websphere 管理控制台重启
- java - 使用 Junit 4 for java servlet 的快乐流测试用例
- laravel - Laravel 路由未在服务器上更新
- php - 如何通过 PHP 显示下个月和上个月
- excel - Vue - 将 b 表导出到 excel 文件?
- reactjs - 无法通过我的路由中指定的路径访问我的组件
- charts - 带有目标的 Google 可视化图表水平条(垂直线