Akka 流副 Apache Flink
Akka streams vs Apache Flink
在探索Akka streams的过程中,我还接触到了流处理引擎Apache Flink。
Akka 流实现反应流并支持背压。
所以如果我必须在两者之间做出决定,我应该选择哪一个?它们有何不同,有何相似之处?这里的标准应该是什么?
我不是 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 可能会在应用程序生产时接管。
Akka Streams 是一个实现 reactive streams specification.
的库
Apache Flink 是一个流媒体引擎。
主要的高级差异是,在 Apache Flink 中,您通过针对 Flink API 之一进行编码来创建作业,然后将该作业提交给 Apache Flink 集群。执行流处理作业的是 Apache Flink 集群。通过使用 Akka Streams,您正在创建一个独立的应用程序。从这个意义上说,Akka Streams 是两者中更轻量级的。
您仍然可以使用 StreamRefs, though you need to do that explicitly in the code and you need to run Akka Cluster. Apache Flink already manages a cluster so you don't need to do that explicitly in your code (though you still need the cluster set up and running to submit your jobs to). Apache Flink has smarts built in to take a job and execute it in an optimal way. Parallelizing/distributing execution when possible 分发基于 Akka Streams 的应用程序。 Akka Streams.
无法做到这一点
Apache Flink流处理旨在实现end2end exactly once processing semantics面对故障。在 Akka Streams 中,需要在您的代码中明确实现此类保证。
Akka Streams 作为反应流规范的实现是关于异步和内存绑定处理的。 Akka HTTP 例如建立在 Akka Streams 之上,因此实现了一个非常高效和轻量级的 HTTP 协议客户端和服务器端。
Akka Streams 实现异步非阻塞背压(根据反应流规范)以保证执行期间的内存边界。 Apache Flink 也有一个 backpressure mechanism,尽管它的实现方式不同。
Akka Streams 作为反应流规范的实现可以与其他实现互操作,例如 RxJava or Project Reactor。 Apache Flink 不属于任何更广泛的标准。
我会说选择 Apache Flink 的主要原因是它附带的 exactly once 保证和自动分发。否则 Akka Streams 是一个非常强大的 API,具有更简单的执行模型。
编辑:
可能值得一提的项目 Alpakka 为 Akka Streams 带来了很多技术,因此它们可以插入到基于反应流的处理中。
在探索Akka streams的过程中,我还接触到了流处理引擎Apache Flink。 Akka 流实现反应流并支持背压。
所以如果我必须在两者之间做出决定,我应该选择哪一个?它们有何不同,有何相似之处?这里的标准应该是什么?
我不是 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 可能会在应用程序生产时接管。
Akka Streams 是一个实现 reactive streams specification.
的库Apache Flink 是一个流媒体引擎。
主要的高级差异是,在 Apache Flink 中,您通过针对 Flink API 之一进行编码来创建作业,然后将该作业提交给 Apache Flink 集群。执行流处理作业的是 Apache Flink 集群。通过使用 Akka Streams,您正在创建一个独立的应用程序。从这个意义上说,Akka Streams 是两者中更轻量级的。
您仍然可以使用 StreamRefs, though you need to do that explicitly in the code and you need to run Akka Cluster. Apache Flink already manages a cluster so you don't need to do that explicitly in your code (though you still need the cluster set up and running to submit your jobs to). Apache Flink has smarts built in to take a job and execute it in an optimal way. Parallelizing/distributing execution when possible 分发基于 Akka Streams 的应用程序。 Akka Streams.
无法做到这一点Apache Flink流处理旨在实现end2end exactly once processing semantics面对故障。在 Akka Streams 中,需要在您的代码中明确实现此类保证。
Akka Streams 作为反应流规范的实现是关于异步和内存绑定处理的。 Akka HTTP 例如建立在 Akka Streams 之上,因此实现了一个非常高效和轻量级的 HTTP 协议客户端和服务器端。
Akka Streams 实现异步非阻塞背压(根据反应流规范)以保证执行期间的内存边界。 Apache Flink 也有一个 backpressure mechanism,尽管它的实现方式不同。
Akka Streams 作为反应流规范的实现可以与其他实现互操作,例如 RxJava or Project Reactor。 Apache Flink 不属于任何更广泛的标准。
我会说选择 Apache Flink 的主要原因是它附带的 exactly once 保证和自动分发。否则 Akka Streams 是一个非常强大的 API,具有更简单的执行模型。
编辑: 可能值得一提的项目 Alpakka 为 Akka Streams 带来了很多技术,因此它们可以插入到基于反应流的处理中。