Akka流vs Apache Flink

问题描述 投票:0回答:2

[在探索Akka流时,我还遇到了Apache Flink流处理引擎。Akka流实现反应流并支持背压。

因此,如果我必须在两个之间做出决定,应该选择哪个?它们有何不同?有何相似之处?这里的标准是什么?

apache-flink akka-stream
2个回答
2
投票

我不是Akka Streams的专家,但据我所知,主要区别在于Flink提供开箱即用的处理分布,而Akka Streams则不提供,因为它被设计为在单个数据上处理数据。节点。

两者之间的相似之处在于它们都提供流处理功能,从这个意义上讲,它们可能具有相似的功能。

但是,Flink有多个其他模块,例如SQL,CEP或机器学习,您将无法在Akka Streams中获得这些模块。另外,Flink还提供故障安全和状态恢复功能,我不确定这些是否存在于Akka Streams中。

另一方面,设置Akka Streaming所需的工作较少,因为您不必担心设置JobManager和TaskManager,而只需创建Java / Scala应用程序,即可在某处进行dockerize并运行它。

所以,您应该问自己的主要问题是,如果您正在处理的数据足够大,如果需要处理,那么它需要在多个节点上进行处理,那么您实际上除了Flink之外别无选择(仅在场景Akka Streams中与Flink)。但是,如果可以在单个节点上处理要处理的数据,则应评估所需的故障安全和消息传递保证。在一般情况下,开始使用Akka Streams可能会更容易,但是在生产应用程序时Flink可能会接管。


1
投票

Akka Streams是实现reactive streams specification的库。

Apache Flink是流引擎。

主要的高级区别是,在Apache Flink中,您通过对其中一个Flink API进行编码来创建作业,然后将该作业提交给Apache Flink集群。 Apache Flink集群执行流处理作业。通过使用Akka Streams,您可以创建一个独立的应用程序。从这个意义上讲,Akka Streams是两者中较轻的一种。

您仍然可以使用StreamRefs分发基于Akka Streams的应用程序,尽管您需要在代码中显式地执行此操作,并且需要运行Akka ClusterApache Flink已经管理了一个集群,因此您无需在代码中显式地执行此操作(尽管您仍然需要设置并运行集群才能向其提交作业)。 Apache Flink具有内置的智能功能,可以接管工作并以最佳方式执行它。并行/分配执行when possible。您无法通过Akka Streams来实现。

Apache Flink流处理旨在在出现故障时实现end2end exactly once processing semantics。在Akka Streams中,需要在您的代码中明确实现这种保证。

Akka Streams作为反应性流规范的实现全部关于异步和内存绑定处理。例如,Akka HTTP建立在Akka流的基础上,因此实现了HTTP协议的非常高效且轻量级的客户端和服务器端。

Akka Streams实现异步非阻塞背压(根据反应流规范),以确保执行期间的内存有界。 Apache Flink也有一个backpressure mechanism,尽管其实现方式不同。

Akka流作为反应性流规范的一种实现可以与其他实现,例如RxJavaProject Reactor互操作。 Apache Flink不是任何更广泛标准的一部分。

我会说选择Apache Flink的主要原因是它附带的一次保证和自动分发。否则,Akka Streams是具有更简单执行模型的非常强大的API。

编辑:可能值得一提的项目AlpakkaAkka Streams带来了许多技术,以便可以将它们插入基于反应性流的处理中。

© www.soinside.com 2019 - 2024. All rights reserved.