关于java:Akka或Reactor

Akka or Reactor

我正在启动一个新项目(基于Java)。我需要把它构建成一个模块化、分布式和弹性的体系结构。

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

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

  • 阿克卡(http://akka.io)
  • 反应堆(https://github.com/reactor/reactor)

在选择上述框架时,我应该考虑什么?

据我所知,直到现在,阿卡仍然以某种方式结合在一起(在某种程度上,我必须"选择"我想传达信息的演员),但非常有弹性。反应堆松动时(根据事件发布)。

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

更新

在更好地回顾了阿克卡事件总线之后,我相信在某种程度上,反应堆所表达的特性已经包含在了阿克卡中。

例如,在https://github.com/reactor/reactor events selectors and consumers上记录的订阅和事件发布可以用akka表示,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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,更成熟,绑定到类型安全
  • 反应堆,早期,绑定到弹簧

我的解释正确吗?但是在概念上,阿克卡的演员和反应堆的消费者有什么区别?


现在很难说,因为反应堆仍然是一个草图,我(Akka技术负责人)不知道它会去哪里。很有意思的是,看看反应堆是否会成为AKKA的竞争对手,我们期待着这一点。

据我所见,从您的需求列表中,反应器缺少弹性(即,在Akka中什么样的监督赋予您)和位置透明度(即,以一种允许您抽象本地或远程消息的方式引用活动实体;这就是您所说的"分布式"的含义)。对于"模块化",我对反应堆还不够了解,特别是如何查找和管理活动组件。

如果你现在开始一个真正的项目,并且需要满足你第一句话的东西,那么我认为在这一点上推荐Akka是没有争议的(Jon也指出)。您可以在So或Akka用户邮件列表中提出更多具体问题。


反应堆不与弹簧相连,它是一个可选模块。我们希望反应堆是便携式的,正如乔恩所概述的。

我对推动生产没有信心,因为我们甚至没有里程碑(1.0.0.Snapshot),在这方面,我会更深入地了解Akka,它是一个非常棒的异步框架imo。同时考虑Vert.x和finagle,如果您寻找一个平台(前者)或可组合的未来(后者),它可能会被调整。如果您关注广泛的异步模式,那么GPAR可能会为您提供一个更完整的解决方案。

最后,我们肯定会有重叠,事实上,我们倾向于一种混合的方法(灵活的可组合事件、分布式,并且不受任何调度策略的约束),在这种方法中,您可以很容易地从rxjava、vert.x、akka等中找到位。我们甚至对语言选择没有意见,即使我们强烈地致力于groovy,人们也会已经开始了Clojure和Kotlin港口。另外,一些需求是由SpringXD和Grails驱动的。

非常感谢您的关注,希望您在几个月内有更多的比较点:)


这是一个很好的问题,答案将在未来几周改变。我们不能仅仅因为现在还太早就对节点间通信做出任何承诺。在我们演示在反应堆中的聚集之前,我们还有一些片段要组合在一起。

尽管如此,仅仅因为reactor不做节点间通信OOTB并不意味着它不能。:)一个人只需要一个相当薄的网络层来协调使用诸如redis或amqp之类的东西的reactor,以使其具有集群智能。

我们肯定在讨论和规划反应堆中的分布式场景。现在说到底该如何运作还为时过早。

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