48

I am currently working with Akka Stream Kafka to interact with kafka and I was wonderings what were the differences with Kafka Streams.

I know that the Akka based approach implements the reactive specifications and handles back-pressure, functionality that kafka streams seems to be lacking.

What would be the advantage of using kafka streams over akka streams kafka?

4

4 回答 4

46

你的问题很笼统,所以我会从我的角度给出一个笼统的答案。

首先,我有两个使用场景:

  1. 在我从 kafka 读取数据、处理数据并将一些输出写回 kafka 的情况下,我专门使用 kafka 流。
  2. 对于那些我使用 akka 流的数据源或接收器不是 kafka 的情况。

这已经让我可以回答关于背压的部分了:对于上面的第一种情况,kafka 流中有一个背压机制。

现在让我们只关注上面描述的第一个场景。让我们看看如果我决定停止使用 Kafka 流,我会失去什么:

  • 我的一些流处理器阶段需要一个持久(分布式)状态存储,kafka 流为我提供了它。这是 akka 流不提供的东西。
  • 缩放时,kafka 流会在流处理器的新实例启动或被杀死时自动平衡负载。这适用于同一个 JVM 以及其他节点:向上和向外扩展。这不是由 akka 流提供的。

这些是对我来说最重要的差异,我希望它对你有意义!

于 2017-08-11T07:45:08.533 回答
5

Akka Stream 相对于 Kafka Streams 的最大优势在于可以实现非常复杂的处理图,这些处理图可以通过扇入/扇出和反馈循环进行循环。如果我没记错的话,Kafka 流只允许非循环图。在 Kafka 流之上实现循环处理图会非常复杂

于 2017-11-24T09:42:54.693 回答
2

发现这篇文章很好地总结了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 “效果”(函数式编程)的原则管理。

换句话说,业务逻辑不会与Kafkaapi 纠缠在一起。

于 2018-02-03T12:51:48.543 回答
1

Akka Streams 作为 Akka Actors 模型的以数据流为中心的抽象出现。这些是为 JVM 构建的高性能库,专为通用微服务而设计。

就 Kafka Streams 而言,这些都是用于处理无限数据的客户端库。它们用于从 Kafka 主题中读取数据,然后对其进行处理,并将结果写入新主题。

于 2021-03-25T12:59:47.610 回答