发现这篇文章给出了分布式设计关注点的一个很好的总结 Kafka Streams 提供(补充 Akka Streams )。
Kafka Streams
Akka Streams
https://www.beyondthelines.net/computing/kafka-streams/
消息排序 :Kafka维护一种仅附加日志,它存储所有消息,每条消息都有一个序列ID,也称为偏移量。偏移量用于指示消息在日志中的位置。 Kafka流使用这些消息偏移来维护排序。 分区 :Kafka将主题拆分为分区,每个分区在不同的代理之间复制。分区允许分散负载,并且复制使应用程序容错(如果代理停机,数据仍然可用)。这对于数据分区很有用,但我们也需要以类似的方式分配流程。 Kafka Streams使用依赖于Kafka组管理的处理器拓扑。这与Kafka消费者用于在经纪人之间均匀分配负载的组管理相同(这项工作主要由经纪人管理)。 容错 :数据复制确保数据容错。组管理具有内置的容错功能,因为它在剩余的实时代理实例之间重新分配工作负载。 国家管理 :Kafka流提供由kafka更改日志主题备份的本地存储,该主题使用日志压缩(仅保留给定密钥的最新值).Kafka日志压缩 后处理 :当启动应用程序的新版本时,我们可以从开始重新处理日志以计算新状态,然后将流量重定向到新实例并关闭旧应用程序。 时间管理 :“tream数据永远不会完整,并且总是可以无序地到达”,因此必须区分事件时间与处理时间并正确处理它。
消息排序 :Kafka维护一种仅附加日志,它存储所有消息,每条消息都有一个序列ID,也称为偏移量。偏移量用于指示消息在日志中的位置。 Kafka流使用这些消息偏移来维护排序。
分区 :Kafka将主题拆分为分区,每个分区在不同的代理之间复制。分区允许分散负载,并且复制使应用程序容错(如果代理停机,数据仍然可用)。这对于数据分区很有用,但我们也需要以类似的方式分配流程。 Kafka Streams使用依赖于Kafka组管理的处理器拓扑。这与Kafka消费者用于在经纪人之间均匀分配负载的组管理相同(这项工作主要由经纪人管理)。
容错 :数据复制确保数据容错。组管理具有内置的容错功能,因为它在剩余的实时代理实例之间重新分配工作负载。
国家管理 :Kafka流提供由kafka更改日志主题备份的本地存储,该主题使用日志压缩(仅保留给定密钥的最新值).Kafka日志压缩
后处理 :当启动应用程序的新版本时,我们可以从开始重新处理日志以计算新状态,然后将流量重定向到新实例并关闭旧应用程序。
时间管理 :“tream数据永远不会完整,并且总是可以无序地到达”,因此必须区分事件时间与处理时间并正确处理它。
作者也说 “使用此更改日志主题Kafka Stream能够维护应用程序状态的”可见视图“。
我的看法是,这主要适用于“应用程序状态”很小的企业应用程序。
对于使用“大数据”的数据科学应用程序,由数据调整,机器学习模型和业务逻辑组合产生的“应用程序状态”可能无法很好地管理所有这些 Kafka Streams 。
另外,我想用的是 “纯功能事件采购运行时” 喜欢 https://github.com/notxcain/aecor 将有助于使突变显式化,并通过状态变异和IO“效应”(函数式编程)的原则管理将应用程序逻辑与用于管理持久形式的技术的技术分开。
换句话说,业务逻辑不会与业务逻辑纠缠在一起 Kafka 蜜蜂。
Kafka
你的问题非常笼统,所以我会从我的观点给出一般答案。
首先,我有两个使用场景:
这已经允许我回答有关背压的部分:对于上面的第一种情况,卡夫卡流中存在背压机制。
现在让我们只关注上述第一种情况。如果我决定停止使用Kafka流,让我们看看我会放松一下:
这些是对我来说最重要的差异,我希望你对它有意义!