Man*_*oid 4 akka-stream apache-flink
在探索 Akka 流的过程中,我也遇到了 Apache Flink,它是一个流处理引擎。Akka 流实现反应式流并支持背压。
那么如果我必须在两者之间做出决定,我应该选择哪一个?它们有何不同,有何相似之处?这里的标准应该是什么?
Akka Streams是一个实现响应式流规范的库。
Apache Flink是一个流引擎。
主要的高级区别在于,在Apache Flink 中,您通过针对 Flink API 之一进行编码来创建作业,然后将该作业提交给Apache Flink集群。执行流处理作业的是Apache Flink集群。通过使用Akka Streams,您正在创建一个独立的应用程序。从这个意义上说,Akka Streams是两者中更轻量级的。
您仍然可以使用StreamRefs分发基于Akka Streams的应用程序,但您需要在代码中明确地执行此操作,并且需要运行Akka Cluster。Apache Flink已经管理了一个集群,所以你不需要在你的代码中明确地做这件事(尽管你仍然需要设置并运行集群来提交你的作业)。Apache Flink内置了智能功能,可以接收作业并以最佳方式执行它。尽可能并行/分布式执行。Akka Streams无法做到这一点。
Apache Flink流处理旨在在面对故障时实现end2end only once 处理语义。在Akka Streams 中,需要在您的代码中明确实现这种保证。
Akka Streams作为反应式流规范的实现是关于异步和内存绑定处理的。例如,Akka HTTP建立在Akka Streams之上,因此实现了 HTTP 协议的非常高效和轻量级的客户端和服务器端。
Akka Streams实现了异步非阻塞背压(根据响应式流规范)以保证执行期间的内存有界。Apache Flink也有一个背压机制,尽管它的实现方式不同。
Akka Streams作为响应式流规范的实现可以与其他实现(如RxJava或Project Reactor )进行互操作。Apache Flink不是任何更广泛标准的一部分。
我会说使用Apache Flink 的主要原因是它附带的一次性保证和自动分发。另外Akka Streams是一个非常强大的 API,具有更简单的执行模型。
编辑:可能值得一提的是Alpakka项目,它为Akka Streams带来了很多技术,以便它们可以插入到基于反应流的处理中。
我不是 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 可能会接管。
| 归档时间: |
|
| 查看次数: |
1697 次 |
| 最近记录: |