Java 阿克卡或反应堆

Java 阿克卡或反应堆,java,spring,akka,reactor,project-reactor,Java,Spring,Akka,Reactor,Project Reactor,我正在启动一个新项目(基于java)。我需要将其构建为一个模块化、分布式和弹性架构 因此,我希望业务流程能够相互通信,具有互操作性,但也具有独立性 我现在看到的两个框架,除了年龄差异外,还表达了两种不同的观点: 阿克卡() 反应器() 当选择上述框架之一时,我应该考虑什么? 据我所知,到目前为止,Akka仍然以某种方式结合在一起(在某种程度上,我必须“选择”我想要向其发送信息的演员),但非常有弹性。反应堆松动时(根据事件公告) 有人能帮我理解如何做出正确的决定吗 更新 在回顾了Akka的优点

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

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

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

  • 阿克卡()
  • 反应器()
当选择上述框架之一时,我应该考虑什么?

据我所知,到目前为止,Akka仍然以某种方式结合在一起(在某种程度上,我必须“选择”我想要向其发送信息的演员),但非常有弹性。反应堆松动时(根据事件公告)

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

更新

在回顾了Akka的优点之后,我相信在某种程度上,Akka已经包含了这些优点

例如,记录在上的订阅和事件发布可以用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,更成熟,一定是类型安全的
  • 反应堆,早期,绑定到弹簧

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

这是一个很好的问题,答案将在未来几周内改变。我们不能保证现在节点间的通信会是什么样子,因为现在还为时过早。在我们能够在Reactor中演示集群之前,我们还需要将一些片段组合在一起

话虽如此,反应堆不进行节点间通信并不意味着它不能我们只需要一个相当薄的网络层就可以使用Redis或AMQP之类的东西在反应堆之间进行协调,从而为它提供一些集群智能

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


如果您现在需要一些可以进行集群的东西,那么选择Akka会更安全。

现在很难说,因为反应堆仍然是一个草图,我(Akka技术负责人)不知道它将走向何方。这将是有趣的,看看反应堆是否成为一个竞争对手阿克卡,我们期待着这一点

据我所见,从您的需求列表中,反应器缺少弹性(即,在Akka中,监管会给您带来什么)和位置透明度(即,以一种让您能够通过本地或远程消息进行抽象的方式引用活动实体;这就是您所指的“分布式”)。对于“模块化”,我对反应堆了解不够,尤其是如何查找和管理活动组件


如果你现在开始一个真正的项目,并且需要满足你第一句话的东西,那么我认为在这一点上推荐Akka不会引起争议(Jon也指出了这一点)。请随意提出更多关于SO或上的具体问题。

反应堆不一定是弹簧,它是一个可选模块。我们希望反应堆是便携式的,正如乔恩所概述的那样。p> 我不会对推出产品有信心,因为我们甚至不是里程碑(1.0.0.SNAPHOT),在这方面,我将深入研究艾加,这是一个奇妙的异步框架IMO,也可以考虑Vert,X和FiaGLE,如果你寻找平台(前者)或可组合期货(后者),它可能会被改编。如果您关注广泛的异步模式,那么GPAR可能会为您提供更完整的解决方案

最后,我们肯定会有重叠,事实上,我们倾向于一种混合方法(灵活的可组合事件处理、分布式,并且不受任何调度策略的约束),在这种方法中,您可以很容易地从RxJava、Vert.x、Akka等中找到位。我们甚至不会因为语言选择而固执己见,即使我们坚定地致力于Groovy,人们已经开始使用Clojure和Kotlin港口。再加上一些需求是由和驱动的事实


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

谢谢Jon,我觉得反应堆非常有希望。但我需要了解,除了反应堆缺失的特征(当然,处于早期阶段)之外,反应堆和阿克卡之间是否存在概念上的差异。总之,阿克卡的演员和反应堆的消费者在概念上有什么不同?我还用Akka中的一个示例事件更新了我的问题,我认为它类似于反应堆GitHub页面上的事件订阅/调度。谢谢。乔恩,我在这里读到了你的回复:-所以我们可能会假设,从长远来看,Akka和Reactor将是类似的框架,都支持Reactor模式和Actor模型。由于以下原因,上述评论不再正确:我不明白这个评论现在是怎么不正确的?这里没有任何东西与反应堆战略方向的解释相矛盾。明白了。是的,你理解正确。谢谢你提出这些问题!:)Akka不一定会被Scala使用,事实上,大多数人都是从Java使用它。David:类似于:Akka事件总线API与Akka参与者一起实现反应堆模式只是为了澄清:反应堆根本不一定会启动。我们有意排除任何Spring依赖项,因为作为一个基本框架,将其使用限制为Spring用户是没有意义的。至于参与者和消费者之间的区别:就反应器而言,消费者可以是有状态的,也可以不是。假设您希望使用无状态匿名类或Java8Lambda,但这不是必需的。正如我在回答中提到的,对于早期迭代,Reactor工具集是有意简洁的。我们并不是要创造“下一个阿克卡”,只是在我相信的情况下,不提它