首页 文章

Akka Stream Kafka vs Kafka Streams

提问于
浏览
29

我目前正在与Akka Stream Kafka合作与kafka互动,我很惊讶与Kafka Streams有什么不同 .

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

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

3 回答

  • 2

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

  • 0

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

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

    • 例如,我只使用kafka流 .

    • 数据源或接收器不是kafka的情况,对于那些我正在使用akka流的情况 .

    这已经允许我回答有关背压的部分:对于上面的第一种情况, Kafka 流中存在背压机制 .

    现在让我们只关注上述第一种情况 . 如果我决定停止使用Kafka流,让我们看看我会放松一下:

    • 我的一些流处理器阶段需要一个持久(分布式)状态存储,kafka流为我提供它 . 这是akka溪流不提供的东西 .

    • scaling,kafka流会在启动流处理器的新实例时立即自动 balancer 负载,或者一旦被杀死,就会自动 balancer 负载 . 这适用于同一个JVM以及其他节点:扩展和扩展 . 这不是由akka流提供的 .

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

  • 30

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

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

    消息排序:Kafka维护一种仅附加日志,它存储所有消息,每条消息都有一个序列ID,也称为其偏移量 . 偏移量用于指示消息在日志中的位置 . Kafka流使用这些消息偏移来维护排序 . 分区:Kafka将主题拆分为分区,每个分区在不同的代理之间进行复制 . 分区允许分散负载,并且复制使应用程序容错(如果代理停机,数据仍然可用) . 这对数据分区很有用,但我们也需要以类似的方式分配流程 . Kafka Streams使用依赖于Kafka组管理的处理器拓扑 . 这与Kafka消费者用于在经纪人之间均匀分配负载的组管理相同(这项工作主要由经纪人管理) . 容错:数据复制可确保数据容错 . 组管理具有内置的容错功能,因为它在剩余的实时代理实例之间重新分配工作负载 . 状态管理:Kafka流提供由kafka更改日志主题备份的本地存储,该主题使用日志压缩(仅保留给定密钥的最新值).Kafka日志压缩重新处理:当启动应用程序的新版本时,我们可以重新处理从开始计算新状态的日志然后将流量重定向到新实例并关闭旧应用程序 . 时间管理:“流数据永远不会完整,并且总是可以无序地到达”,因此必须区分事件时间与处理时间并正确处理 .

    作者也说"Using this change-log topic Kafka Stream is able to maintain a “table view” of the application state."

    我的看法是,这主要适用于“应用程序状态”很小的企业应用程序 .

    对于使用"big data"的数据科学应用程序,由数据调整,机器学习模型和业务逻辑组合生成的"application state"可能无法通过 Kafka Streams 很好地管理所有这些 .

    此外,我认为使用像https://github.com/notxcain/aecor这样的"pure functional event sourcing runtime"将有助于使突变显式化,并通过状态变异和IO"effects"(函数式编程)的原则管理将应用程序逻辑与用于管理持久形式的状态的技术分开 .

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

相关问题