我在 Java 中从事金融应用程序的工作,并且获得正确的并发性是很痛苦的。Erlang 和演员模型应该非常适合大规模并发应用程序,但我不知道如何在 Java 中做到这一点。我知道有 Jetlang、FunctionalJava、kilim 等库,但它们通常不会超出简单的示例。
假设我需要处理三个或四个不同的事件,例如从市场数据馈送、订单/交易馈送中计算一些数字以及“输出”这些数据的一些衍生产品。大多数情况下,这些事件或数据流需要按顺序处理(至少相对于某些键的顺序...例如,特定交易品种的所有订单都必须按顺序处理,但与尊重不相关的符号)
我用改变状态的方法创建了一个普通的 Java 对象。我没有让这些方法直接改变状态,而是将它们的参数(通过将它们转换为命令对象)放入一个 fifo 队列(erlang 的邮箱),以及一个处理该队列的 react() 方法。这样,所有更新都必须经过一个队列,并且 react() 方法一次只能访问一个更新。从理论上讲,这应该让我无需在此方法上锁定或同步。
然而,这个队列基本上是一个生产者/消费者队列,这意味着它是一个阻塞队列。阻塞对可扩展性非常不利。此外,拥有一个队列意味着我的所有更新命令对象(不同类型的)都以一些过于通用的超类型(如 Object)从队列中出来,我必须将它们转换回正确的类型并让 react() 处理它们.
一旦这个演员化的对象产生一个输出,被另一个这样的对象消费,我就会经历同样的过程。换句话说,我已经将编程模型从面向对象(使用返回结果的方法)更改为某种持续传递噩梦,在这种噩梦中我的所有方法都变为异步。
有什么想法可以解决这个问题吗?