java - 如何在 java 中做 Actor (erlang)?

标签 java erlang concurrency actor

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

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

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

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

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

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

最佳答案

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

关于java - 如何在 java 中做 Actor (erlang)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792638/

相关文章:

java - 获取 java.lang.NoClassDefFoundError : javax/ws/rs/Path when dependency is in buiild. sbt

multithreading - Smalltalk Visual Works并发

Java并发代码改进思路

erlang - 用Erlang和其他语言进行的多核编程有什么区别?

erlang - 为远程 erlang 节点运行观察者 : making it simpler

erlang - 如何检查输入是否是Erlang中的字符串?

python - python ThreadPoolExecutor 线程安全吗?

Java 相当于 GC.SuppressFinalize

java - 为什么添加这个防御性副本可以避免死锁?

java - 重定向和 POST 方法