Akka Stream Kafka vs Kafka Streams

时间:2017-08-11 06:17:49

标签: scala akka-stream apache-kafka-streams typesafe stream-processing

我目前正在与Akka Stream Kafka合作与kafka互动,我很惊讶与Kafka Streams的区别是什么。

我知道基于Akka的方法实现了反应性规范并处理了kafka流似乎缺乏的背压和功能。

使用kafka流比akka streams kafka有什么好处?

4 个答案:

答案 0 :(得分:34)

你的问题非常笼统,所以我会从我的观点给出一般答案。

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

  1. 我从kafka读取数据,处理它并将一些输出写回kafka的情况,因为这些我只使用kafka流。
  2. 数据源或接收器不是kafka的情况,对于那些我使用akka流的人。
  3. 这已经允许我回答有关背压的部分:对于上面的第一种情况,卡夫卡流中存在背压机制。

    现在让我们只关注上述第一种情况。如果我决定停止使用Kafka流,那么让我们看看会失去什么:

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

发现这篇文章是对Kafka Streams提供的分布式设计问题的一个很好的总结(补充Akka Streams)。

https://www.beyondthelines.net/computing/kafka-streams/

  

消息排序:Kafka维护一种仅附加日志,用于存储所有消息。每条消息都有一个序列ID,也称为偏移量。偏移量用于指示消息在日志中的位置。 Kafka流使用这些消息偏移来维持排序。

     

分区:Kafka将主题拆分为分区,每个分区在不同的代理之间进行复制。分区允许分散负载,并且复制使应用程序容错(如果代理停机,数据仍然可用)。这对数据分区很有用,但我们也需要以类似的方式分配流程。 Kafka Streams使用依赖于Kafka组管理的处理器拓扑。这与Kafka消费者用于在经纪人之间平均分配负载的组管理相同(这项工作主要由经纪人管理)。

     

容错:数据复制可确保数据容错。组管理具有内置的容错功能,因为它在剩余的实时代理实例之间重新分配工作负载。

     

状态管理:Kafka流提供由kafka更改日志主题备份的本地存储,该主题使用日志压缩(仅保留给定密钥的最新值).Kafka log compaction

     

重新处理:启动应用程序的新版本时,我们可以从开始重新处理日志以计算新状态,然后将流量重定向到新实例并关闭旧应用程序。

     

时间管理:“流数据永远不会完整,并且总是无序到达”因此必须区分事件时间与处理时间并正确处理。

作者还说"使用此更改日志主题Kafka Stream能够维护应用程序状态的“表视图”。"

我的看法是,这主要适用于企业应用程序,其中"应用程序状态"是小。

对于使用"大数据"的数据科学应用程序,"应用程序状态"通过数据整合,机器学习模型和业务逻辑的组合来编排所有这些,可能无法通过Kafka Streams很好地管理。

此外,我认为使用"纯函数事件源运行时" https://github.com/notxcain/aecor将有助于使突变显式并将应用程序逻辑与所使用的技术分开通过对状态变异和IO"效果的原则管理来管理国家的持久形式。 (函数式编程)。

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

答案 3 :(得分:1)

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

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