98

I am in the process of starting a new project (java-based). I need to build it as a modular, distributed and resilient architecture.

Therefore I would like to have the business processes to communicate among themselves, be interoperable, but also independent.

I am looking right now at two frameworks that, besides their difference in age, express 2 different views:

What I should consider when choosing one of the above frameworks?

As far as I understand till now, Akka is still somehow coupled (in a way that I have to 'choose' the actor I want to send the messages to), but very resilient. While Reactor is loose (as is based on event posting).

Can someone help me understand how make a proper decision?

UPDATE

After reviewing better the Event Bus of Akka, I believe in some way the features expressed by Reactor are already included in Akka.

For example the subscription and event publishing, documented on https://github.com/reactor/reactor#events-selectors-and-consumers, can be expressed in Akka as following:

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");

Therefore it seems to me now that the major differences between the two are:

  • Akka, more mature, bound to Typesafe
  • Reactor, early stage, bound to Spring

Is my interpretation correct? But what is conceptually the difference between the Actor in Akka and the Consumer in Reactor?

4

3 回答 3

48

在这一点上很难说,因为 Reactor 仍然是一个草图,我(Akka 技术负责人)不知道它会去哪里。看看 Reactor 是否会成为 Akka 的竞争对手将会很有趣,我们对此充满期待。

据我所知,从您的需求列表中,Reactor 缺少弹性(即在 Akka 中为您提供的监督)和位置透明性(即以一种允许您抽象本地或远程消息传递的方式引用活动实体;这就是您暗示“分布式”)。对于“模块化”,我对 Reactor 知之甚少,尤其是如何查找活动组件并管理它们。

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

于 2013-05-21T07:00:55.920 回答
37

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

我对推动生产没有信心,因为我们甚至还不是 Milestone (1.0.0.SNAPSHOT),在这方面,我会更深入地了解Akka,它是一个出色的异步框架 IMO。如果您寻找平台(前者)或可组合期货(后者),还可以考虑Vert.xFinagle 。如果您关注范围广泛的异步模式,也许GPars会为您提供更完整的解决方案。

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

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

于 2013-05-21T15:58:43.270 回答
33

这是一个很好的问题,答案将在未来几周内发生变化。我们现在不能对节点间通信的样子做出任何承诺,因为现在还为时过早。在我们展示 Reactor 中的集群之前,我们还有一些东西需要组装。

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

我们肯定是在讨论和规划 Reactor 中的分布式场景。现在说具体如何运作还为时过早。

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

于 2013-05-16T20:38:04.197 回答