Akka或Reactor [关闭]


94

我正在启动一个新项目(基于Java)。我需要将其构建为模块化,分布式和弹性架构。

因此,我希望业务流程能够相互通信,可互操作且独立。

我现在看的是两个框架,除了年龄不同外,它们还表达两种不同的观点:

选择上述框架之一时应该考虑什么?

据我到目前为止所知,Akka仍然以某种方式耦合在一起(以某种方式我必须“选择”我想向其发送消息的演员),但非常有弹性。当Reactor松动时(基于事件发布)。

有人可以帮助我了解如何做出正确的决定吗?

更新

在更好地回顾了Akka 的事件总线之后,我认为Akka已经包含了Reactor表达功能

例如,可以在Akka中表示为https://github.com/reactor/reactor#events-selectors-and-consumers上记录的订阅和事件发布:

final ActorSystem system = ActorSystem.create("system");
final ActorRef actor = system.actorOf(new Props(
    new UntypedActorFactory() {

        @Override
        public Actor create() throws Exception {

            return new UntypedActor() {
                final LoggingAdapter log = Logging.getLogger(
                        getContext().system(), this);

                @Override
                public void onReceive(Object message)
                        throws Exception {
                    if (message instanceof String)
                        log.info("Received String message: {}",
                                message);
                    else
                        unhandled(message);
                }
            };
        }
    }), "actor");

system.eventStream().subscribe(actor, String.class);
system.eventStream().publish("testing 1 2 3");

因此,在我看来,两者之间的主要区别在于:

  • Akka更成熟,绑定到Typesafe
  • 早期反应堆,绑定到Spring

我的解释正确吗?但是,Akka中的Actor和Reactor中的Consumer之间在概念上有什么区别


8
Scala并不一定要使用Akka,实际上,大多数是Java来使用的。
维克多·巴生

1
大卫:有点像:与Akka Actor配合使用的Akka EventBus API实现了Reactor模式
Viktor Klang

9
只是要澄清一下:Reactor完全不受Spring约束。我们有意排除任何Spring依赖项,因为作为基础框架,仅将其使用范围限制为Spring用户是没有意义的。关于Actor与Consumer之间的区别:就Reactor而言,您的Consumer可以是有状态的。假定您要使用无状态匿名类或Java 8 lambda,但这不是必需的。就像我在回答中提到的那样,对于早期迭代,Reactor工具集是故意简洁的。我们不是要创建“下一个Akka”。
乔恩·布里斯宾

8
只是提到vertx.io,因为我认为它是在同一事件驱动的领域中,对于那些正在研究的人们也有类似的有趣观点
。.– Opentune

1
经过几年的发展,我也处于类似的情况。我的应用程序主要是基于Spring的,现在我需要处理事件驱动的功能。Akka和Spring-reactor是否有明显的赢家?我正在寻找具有活动用户社区的框架,以防万一遇到更复杂的情况。
tintin

Answers:


47

在这一点上很难说出来,因为Reactor仍然是草图,而我(Akka技术负责人)对此一无所知。看到Reactor是否成为Akka的竞争对手将是一件很有趣的事情,我们对此很期待。

据我所知,在您的需求列表中,Reactor缺少弹性(即Akka的监督功能)和位置透明性(即以使您可以通过本地或远程消息抽象的方式引用活动实体),这就是您所需要的暗示“分布式”)。对于“模块化”,我对Reactor的了解还不够,尤其是如何查找活动组件并进行管理。

如果您现在开始一个真实的项目并且需要满足您第一句话的要求,那么我认为此时推荐Akka不会引起争议(正如Jon也指出的那样)。随时在SO或akka用户邮件列表上提出更具体的问题。


感谢Roland,我很高兴看到两个项目的人们都在为答案做出贡献。我目前正在尝试Akka。如您所料,现在提供该问题的最终答案还为时过早,除了Reactor仍处于早期阶段,因此尚不适合进行比较。因此,让我们拭目以待,看看事情如何发展:-)谢谢,大卫
大卫·里奇切利

7
谢谢您的回答,罗兰。我只是想澄清一下,Reactor不是Akka的竞争对手。由于有关异步应用程序的关注领域重叠,因此存在相似之处。但是Reactor旨在成为可以构建其他系统的基础框架。这些其他系统与Akka的重叠可能比Reactor本身更多。但是在可预见的将来,Reactor仍将是一个支持其他系统的框架,而本身不会是一个完整的框架。您将不得不延迟对Reactor / Akka枪战的满足。;)
Jon Brisbin

不用担心,我认为您会做的很好,而且我可以肯定,随着更多图书馆进入该领域,我们将看到异花授粉。
罗兰·库恩

37

Reactor未绑定到Spring,它是一个可选模块。我们希望Reactor具有可移植性,这是Jon概述的基础。

由于我们甚至还不是Milestone(1.0.0.SNAPSHOT),因此我对投入生产没有信心,在这方面,我将更深入地研究Akka,它是一种出色的IMO异步框架。同时考虑Vert.xFinagle,如果您寻找平台(前者)或可组合期货(后者),则可能会对其进行修改。如果您照顾各种各样的异步模式,则GPar可能会为您提供更完整的解决方案。

最后,我们当然可能会有重叠,实际上,我们倾向于混合方法(灵活的可组合事件,分布式,并且不受任何调度策略的约束),您可以在其中轻松地从RxJavaVert.xAkka等中找到位。即使我们坚定地致力于Groovy,人们也已经开始选择ClojureKotlin港口,我们对语言的选择甚至没有意见。除此以外,Spring XDGrails推动了一些需求。

非常感谢您见证的兴趣,希望您在几个月后能获得更多的比较点:)


感谢Stephane,我相信您的回答(以及Jon的评论,stackoverflow.com/ questions/16595393/akka-or- reactor/…)提供了更加清晰的视角。正如您所说,在标记已回答的问题之前,我仍然会坚持,让我们看看在不久的将来会出现什么。我再次非常感谢参与这两个项目的人们花时间提供有用的见解。
David Riccitelli,

我同意Vert.x。我曾在几个项目的生产环境中使用过Vert.x,以在组件之间进行通信,并且它可以无缝工作。
赢得

33

这是一个很好的问题,答案将在未来几周内发生变化。我们不能就现在的节点间通信做出任何保证,因为还为时过早。在演示Reactor中的集群之前,我们还有一些内容需要整理。

话虽如此,仅仅因为Reactor不进行节点间通信OOTB并不意味着它不能。:)使用Redis或AMQP之类的东西,只需一个相当薄的网络层即可在Reactor之间进行协调,从而为它提供一些集群智能。

我们肯定是在讨论和计划Reactor中的分布式方案。确切说说它是如何工作还为时过早。

如果您需要立即进行群集的某些内容,则选择Akka会更安全。


谢谢乔恩,我觉得反应堆非常有前途。但是我需要了解Reactor和Akka之间是否存在概念上的区别,除了Reactor缺少的功能(当然,还处于早期阶段)。总之,Akka中的Actor和Reactor中的Consumer之间在概念上有什么区别?我还用Akka中的示例事件更新了我的问题,我认为它类似于Reactor GitHub页面上的事件订阅/调度。谢谢。
David Riccitelli

乔恩(Jon),我在这里阅读您的回复:blog.springsource.org/2013/05/13/…-因此,我们可以假设从长远来看,Akka和Reactor将是类似的框架,同时支持Reactor模式和Actor模型。
David Riccitelli


我不明白此评论现在有何不正确?这里没有与反应堆战略方向的解释相矛盾。
乔恩·布里斯宾

1
知道了 是的,您理解正确。感谢您提出这些问题!:)
Jon Brisbin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.