【问题标题】:how to do actors (erlang) in java?如何在java中做演员(erlang)?
【发布时间】:2010-10-22 00:21:02
【问题描述】:

我在 Java 中从事金融应用程序的工作,正确地实现并发是一件很痛苦的事情。 Erlang 和演员模型应该非常适合大规模并发应用程序,但我不知道如何在 Java 中做到这一点。我知道有 Jetlang、FunctionalJava、kilim 等库,但它们通常不会超出简单的示例。

假设我需要处理三个或四个不同的事件,例如从市场数据馈送、订单/交易馈送中计算一些数字以及“输出”这些数据的一些衍生产品。大多数情况下,这些事件或数据流需要按顺序处理(至少相对于某些键的顺序...例如,特定交易品种的所有订单都必须按顺序处理,但与尊重不相关的符号)

我用改变状态的方法创建了一个普通的 Java 对象。我没有让这些方法直接改变状态,而是将它们的参数(通过将它们转换为命令对象)放入一个 fifo 队列(erlang 的邮箱),以及一个处理该队列的 react() 方法。这样,所有更新都必须经过一个队列,并且 react() 方法一次只能访问一个更新。从理论上讲,这应该让我无需在此方法上锁定或同步。

但是,这个队列基本上是一个生产者/消费者队列,这意味着它是一个阻塞队列。阻塞对可扩展性非常不利。此外,拥有一个队列意味着我的所有更新命令对象(不同类型的)都以一些过于通用的超类型(如 Object)从队列中出来,我必须将它们转换回正确的类型并让 react() 处理它们.

一旦这个演员化的对象产生一个输出,被另一个这样的对象消费,我会经历同样的过程。换句话说,我已经将编程模型从面向对象(使用返回结果的方法)更改为某种延续传递噩梦的方式,其中我的所有方法都变为异步。

有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: java erlang concurrency actor


    【解决方案1】:

    最近akka 为Scala 提供了一个基于Erlang 的actor 框架。

    【讨论】:

    • 谢谢。这正是我一直在寻找的。这就是 Java 中的 Erlang 特性。
    【解决方案2】:

    使用最近出现的优秀 Actors 库之一。 Alex Miller 为Javaworld on Actors 写了一篇很好的两部分。

    我个人也挺喜欢Actor's Guild

    【讨论】:

    • 仅供参考,根据演员协会网站,该项目似乎不再维护。
    【解决方案3】:

    您可能还想研究 Scala 的演员(您可以将它们视为一种 Java 库),例如:The busy Java developer's guide to Scala: Dive deeper into Scala concurrency

    【讨论】:

      【解决方案4】:

      您可能还想看看esper,它不像前面提到的actor 框架那么低级,更像是在actor 框架之上构建的通用事件处理系统。非常成熟、完整,我认为是为金融交易中的复杂事件处理而开发的。

      【讨论】:

        【解决方案5】:

        Kontraktor 是一个为 java 8 设计的新演员库。https://github.com/RuedigerMoeller/kontraktor

        【讨论】:

          【解决方案6】:

          您可以考虑另一种选择,即 NettyLMAX Disruptor,它们都是用纯 Java 编写的。 Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。

          什么是干扰器?

          LMAX 旨在成为世界上最快的交易平台。显然,为了实现这一点,我们需要做一些特别的事情来使用我们的 Java 平台实现非常低的延迟和高吞吐量。性能测试表明,使用队列在系统的各个阶段之间传递数据会引入延迟,因此我们专注于优化这方面。

          Disruptor 是我们研究和测试的结果。我们发现 CPU 级别的缓存未命中和需要内核仲裁的锁都非常昂贵,因此我们创建了一个框架,该框架对其运行的硬件具有“机械同理心”,并且是无锁的......

          (取自https://lmax-exchange.github.io/disruptor/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-22
            • 1970-01-01
            • 1970-01-01
            • 2021-03-07
            • 1970-01-01
            • 2011-04-07
            • 2013-11-22
            • 2018-12-10
            相关资源
            最近更新 更多