发现这篇文章很好地总结了Kafka Streams
提供(补充Akka Streams
)的分布式设计问题。
https://www.beyondthelines.net/computing/kafka-streams/
消息排序:Kafka 维护一种仅附加日志,其中存储所有消息,每条消息都有一个序列 ID,也称为其偏移量。偏移量用于指示消息在日志中的位置。Kafka 流使用这些消息偏移量来维持排序。
分区:Kafka 将一个主题拆分为多个分区,每个分区在不同的代理之间复制。分区允许分散负载,复制使应用程序具有容错性(如果代理关闭,数据仍然可用)。这对数据分区有好处,但我们还需要以类似的方式分配进程。Kafka Streams 使用依赖于 Kafka 组管理的处理器拓扑。这与 Kafka 消费者用于在代理之间平均分配负载的组管理相同(这项工作主要由代理管理)。
容错:数据复制保证数据容错。组管理具有内置的容错功能,因为它在剩余的活动代理实例之间重新分配工作负载。
状态管理:Kafka 流提供由 kafka 更改日志主题支持的本地存储,该主题使用日志压缩(仅保留给定键的最新值)。Kafka 日志压缩
重新处理:当启动一个新版本的应用程序时,我们可以从头开始重新处理日志以计算新状态,然后将流量重定向到新实例并关闭旧应用程序。
时间管理:“流数据永远不会完整,总是会乱序到达”,因此必须区分事件时间与处理时间并正确处理。
作者还说“使用这个更改日志主题 Kafka Stream 能够维护应用程序状态的‘表格视图’。”
我的看法是,这主要适用于“应用程序状态”很小的企业应用程序。
对于使用“大数据”的数据科学应用程序,由数据处理、机器学习模型和业务逻辑组合产生的“应用程序状态”以协调所有这些可能无法通过Kafka Streams
.
另外,我认为使用像https://github.com/notxcain/aecor这样的“纯函数式事件溯源运行时”将有助于使突变明确并将应用程序逻辑与用于管理状态持久形式的技术分开。状态突变和 IO “效果”(函数式编程)的原则管理。
换句话说,业务逻辑不会与Kafka
api 纠缠在一起。