在探索akka流的同时,我还遇到了apache flink流处理引擎。akka streams实现React流并支持背压。所以如果我要在两个人之间做决定,我应该选哪一个?它们有何不同?有何相似之处?这里的标准应该是什么?
6ie5vjzr1#
akka streams是一个实现React流规范的库。apache flink是一个流引擎。主要的高级区别是,在apacheflink中,您通过对flinkapi之一进行编码来创建作业,然后将该作业提交给apacheflink集群。是apache flink集群执行流处理作业。通过使用akka流,您正在创建一个独立的应用程序。从这个意义上说,akka streams是这两种方法中较轻的一种。您仍然可以使用streamrefs分发基于akka流的应用程序,不过您需要在代码中显式地这样做,并且需要运行akka cluster。apache flink已经管理了一个集群,因此您不需要在代码中显式地执行该操作(尽管您仍然需要设置并运行集群来将作业提交给服务器)。ApacheFlink内置了智能,可以接受作业并以最佳方式执行它。尽可能并行化/分布执行。你不能用 akka 河来理解。apache flink流处理的目的是在出现故障时实现end2end-exactly-once处理语义。在akka流中,这种保证需要在代码中显式实现。akka流作为React流规范的实现是关于异步和内存绑定处理的。例如,akka http构建在akka流之上,因此实现了一个非常高效和轻量级的http协议的客户端和服务器端。akka streams实现异步非阻塞背压(根据reactive streams规范),以保证执行期间的内存有界性。apache flink也有一个反压力机制,尽管它的实现方式不同。akka streams作为reactive streams规范的一个实现,可以与其他实现(如rxjava或projectreactor)进行互操作。apache flink不是任何更广泛标准的一部分。我想说,选择apache flink的主要原因是它所带来的一次性保证和自动分发。否则,akka streams是一个非常强大的api,具有更简单的执行模型。编辑:可能值得一提的是alpakka项目,它为akka流带来了许多技术,以便它们可以插入到基于React流的处理中。
3j86kqsm2#
我不是akka streams方面的Maven,但据我所知,主要的区别在于flink提供了现成的处理分发,而akka streams则没有,因为它是为在单个节点上处理数据而设计的。两者的相似之处在于它们都提供流处理功能,从这个意义上说,它们可能具有相似的功能。但是,flink有多个额外的模块,比如sql、cep或机器学习,这些在akka流中是无法获得的。另外,flink提供了故障安全和状态恢复,我不确定是否存在于akka流中。另一方面,设置akka流将需要较少的工作,因为您不需要关心jobmanager和taskmanager的设置,但是您可以简单地创建一个java/scala应用程序,将其dockerize并在某处运行。因此,您应该问自己的主要问题是,如果您正在处理的数据足够大,需要在多个节点上处理,那么除了flink之外,您真的别无选择(仅在场景akka streams vs.flink中)。但是,如果要处理的数据可以在单个节点上处理,那么应该评估所需的故障安全和消息传递保证。在一般情况下,使用akka流可能更容易开始,但flink可能会接管生产应用程序。
2条答案
按热度按时间6ie5vjzr1#
akka streams是一个实现React流规范的库。
apache flink是一个流引擎。
主要的高级区别是,在apacheflink中,您通过对flinkapi之一进行编码来创建作业,然后将该作业提交给apacheflink集群。是apache flink集群执行流处理作业。通过使用akka流,您正在创建一个独立的应用程序。从这个意义上说,akka streams是这两种方法中较轻的一种。
您仍然可以使用streamrefs分发基于akka流的应用程序,不过您需要在代码中显式地这样做,并且需要运行akka cluster。apache flink已经管理了一个集群,因此您不需要在代码中显式地执行该操作(尽管您仍然需要设置并运行集群来将作业提交给服务器)。ApacheFlink内置了智能,可以接受作业并以最佳方式执行它。尽可能并行化/分布执行。你不能用 akka 河来理解。
apache flink流处理的目的是在出现故障时实现end2end-exactly-once处理语义。在akka流中,这种保证需要在代码中显式实现。
akka流作为React流规范的实现是关于异步和内存绑定处理的。例如,akka http构建在akka流之上,因此实现了一个非常高效和轻量级的http协议的客户端和服务器端。
akka streams实现异步非阻塞背压(根据reactive streams规范),以保证执行期间的内存有界性。apache flink也有一个反压力机制,尽管它的实现方式不同。
akka streams作为reactive streams规范的一个实现,可以与其他实现(如rxjava或projectreactor)进行互操作。apache flink不是任何更广泛标准的一部分。
我想说,选择apache flink的主要原因是它所带来的一次性保证和自动分发。否则,akka streams是一个非常强大的api,具有更简单的执行模型。
编辑:可能值得一提的是alpakka项目,它为akka流带来了许多技术,以便它们可以插入到基于React流的处理中。
3j86kqsm2#
我不是akka streams方面的Maven,但据我所知,主要的区别在于flink提供了现成的处理分发,而akka streams则没有,因为它是为在单个节点上处理数据而设计的。
两者的相似之处在于它们都提供流处理功能,从这个意义上说,它们可能具有相似的功能。
但是,flink有多个额外的模块,比如sql、cep或机器学习,这些在akka流中是无法获得的。另外,flink提供了故障安全和状态恢复,我不确定是否存在于akka流中。
另一方面,设置akka流将需要较少的工作,因为您不需要关心jobmanager和taskmanager的设置,但是您可以简单地创建一个java/scala应用程序,将其dockerize并在某处运行。
因此,您应该问自己的主要问题是,如果您正在处理的数据足够大,需要在多个节点上处理,那么除了flink之外,您真的别无选择(仅在场景akka streams vs.flink中)。但是,如果要处理的数据可以在单个节点上处理,那么应该评估所需的故障安全和消息传递保证。在一般情况下,使用akka流可能更容易开始,但flink可能会接管生产应用程序。