5

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

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

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

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

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

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

4

6 回答 6

5

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

于 2011-06-25T10:30:45.140 回答
3

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

我个人也挺喜欢演员公会的

于 2009-04-27T08:28:35.167 回答
2

您可能还想研究 Scala 的参与者(您可以将它们视为一种 Java 库),例如:忙碌的 Java 开发人员的 Scala 指南:深入了解 Scala 并发性

于 2009-04-27T08:55:21.140 回答
0

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

于 2011-12-27T01:45:02.953 回答
0

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

在此处输入图像描述

什么是破坏者?

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

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

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

于 2015-07-31T00:14:25.307 回答
0

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

于 2015-07-30T23:51:41.970 回答