在探索 Akka 流时,我还遇到了流处理引擎 Apache Flink。
Akka 流实现了响应式流并支持背压。
所以如果我必须在两者之间做出决定,我应该选择哪一个?它们有何不同,有何相似之处?这里的标准应该是什么?
最佳答案
Akka Streams 是一个实现 reactive streams specification 的库.
Apache Flink 是一个流式引擎。
主要的高级区别在于,在 Apache Flink 中,您通过针对其中一个 Flink API 进行编码来创建作业,然后将该作业提交给 Apache Flink 集群。执行流处理作业的是 Apache Flink 集群。通过使用 Akka Streams,您正在创建一个独立的应用程序。从这个意义上说,Akka Streams 是两者中更轻量级的一个。
您仍然可以使用 StreamRefs 分发基于 Akka Streams 的应用程序。 ,尽管您需要在代码中明确执行此操作,并且需要运行 Akka Cluster。 Apache Flink 已经管理了一个集群,因此您无需在代码中明确地执行此操作(尽管您仍然需要设置并运行集群才能将您的作业提交到)。 Apache Flink 具有内置的智能功能,可以以最佳方式执行作业。并行化/分布式执行when possible . Akka Streams 无法做到这一点。
Apache Flink流处理旨在实现end2end exactly once processing semantics面对失败。在 Akka Streams 中,需要在您的代码中明确实现此类保证。
Akka Streams 作为 react 流规范的实现都是关于异步和内存绑定(bind)处理的。 Akka HTTP例如,它构建在 Akka Streams 之上,因此实现了一个非常高效和轻量级的 HTTP 协议(protocol)客户端和服务器端。
Akka Streams 实现异步非阻塞背压(根据 react 流规范)以保证执行期间的内存有界性。 Apache Flink 还有一个 backpressure mechanism ,尽管它的实现方式不同。
Akka Streams 作为 react 流规范的实现可以与其他实现互操作,如 RxJava或 Project Reactor . Apache Flink 不属于任何更广泛的标准。
我会说选择 Apache Flink 的主要原因是它提供的一次性保证和自动化分发。否则,Akka Streams 是一个非常强大的 API,具有更简单的执行模型。
编辑:
大概值得一提的项目Alpakka这为 Akka Streams 带来了许多技术,因此它们可以插入到基于 react 流的处理中。
关于apache-flink - Akka 流与 Apache Flink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61384492/