Akka或Reactor

时间:2013-05-16 19:02:44

标签: java spring akka reactor project-reactor

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

因此,我希望业务流程能够相互通信,具有互操作性,但也是独立的。

我现在正在寻找两个框架,除了它们的年龄差异外,还表达了两种不同的观点:

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

据我所知,到目前为止,Akka仍然以某种方式耦合(以某种方式我必须'选择'我要发送消息的演员),但非常有弹性。虽然Reactor是松散的(基于事件发布)。

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

更新

在更好地审核了Akka的Event Bus后,我相信{* 3}}已经包含在Akka中了。

例如,features expressed by Reactor上记录的订阅和事件发布可以在Akka中表达如下:

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绑定
  • 反应堆,早期阶段,必然会遇到春天

我的解释是否正确?但概念上Akka中的Actor和Reactor中的Consumer之间的差异

3 个答案:

答案 0 :(得分:44)

在这一点上很难说,因为Reactor仍然是一个草图,而我(Akka tech lead)并没有深入了解它将走向何方。看看Reactor是否成为Akka的竞争者将会很有趣,我们期待着这一点。

据我所知,从您的需求列表中,Reactor缺少弹性(即监督在Akka中为您提供的)和位置透明性(即以一种方式引用活动实体,使您可以通过本地或远程消息传递进行抽象;是你所谓的“分布式”)。对于“模块化”,我对Reactor了解不多,特别是如何查找活动组件并对其进行管理。

如果你现在开始一个真正的项目并需要满足你的第一句话的东西,那么我认为在这一点上推荐Akka并不会引起争议(正如Jon所说)。随意在SO或akka-user mailing list上提出更具体的问题。

答案 1 :(得分:35)

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

我不会对推动生产充满信心,因为我们甚至不是Milestone(1.0.0.SNAPSHOT),在这方面,我会深入了解 Akka 这是一个太棒了异步框架IMO。还可以考虑 Vert.x Finagle ,如果您寻找平台(前者)或可组合期货(后者),可能会对其进行调整。如果您管理各种异步模式, GPars 可能会为您提供更完整的解决方案。

最后,我们肯定会有重叠,实际上我们倾向于采用混合方法(灵活的可组合事件,分布式,而不是绑定到任何调度策略),您可以轻松地从 RxJava <中找到位/ em>, Vert.x Akka 等。我们甚至不满足于语言选择,即使我们坚定地致力于Groovy,人们已经开始 Clojure Kotlin 端口。除此之外,还有一些要求由Spring XDGrails驱动。

非常感谢您亲眼目睹的兴趣,希望您在几个月内获得更多的比较点:)

答案 2 :(得分:31)

这是一个很好的问题,答案将在未来几周内发生变化。我们现在无法做出任何节点间通信的承诺,因为它太早了。在我们演示Reactor中的聚类之前,我们仍然可以将一些部分放在一起。

话虽如此,仅仅因为Reactor没有进行节点间通信,OOTB并不意味着不能。 :)人们只需要一个相当薄的网络层来协调Reactors之间使用像Redis或AMQP这样的东西给它一些集群智能。

我们肯定在Reactor中讨论和规划分布式场景。要确切说明它是如何起作用还为时过早。

如果您现在需要集群化的东西,那么选择Akka会更安全。