我在Java中处理财务应用程序并且正确地获得并发是痛苦的。 Erlang和actors模型应该适合大规模并发应用程序,但我无法弄清楚如何在Java中实现它。我知道有一些库,如Jetlang,FunctionalJava,kilim等,但它们通常不会超越简单的例子。
假设我需要处理三到四个不同的事件,比如从市场数据源,订单/交易源和“输出”这些数据的某些衍生物计算一些数字。大多数情况下,这些事件或数据流需要按顺序处理(至少按照某些键的顺序...例如,特定符号的所有订单必须按顺序处理,但与尊重不相关的符号)
我使用改变状态的方法创建一个普通的Java对象。我不是让这些方法直接改变状态,而是将它们的参数(通过将它们转换为命令对象)放在fifo队列(erlang的邮箱)中,并使用react()方法处理该队列。这样,所有更新都必须通过单个队列,并且react()方法一次只能访问一个更新。从理论上讲,这应该可以节省锁定或同步此方法的需要。
但是,此队列基本上是生产者/消费者队列,这意味着它是阻塞队列。阻塞对于可伸缩性来说非常糟糕。此外,拥有一个队列意味着我的所有更新命令对象(不同类型)都从队列中带出一些过于通用的超类型(如Object),我必须将它们转换回正确的类型并让react()处理它们
一旦这个actor化对象产生一个输出,被另一个这样的对象消耗,我就会经历同一个过程。换句话说,我已经将编程模型从面向对象改变为使用返回结果的方法,以及某种延续传递噩梦,其中所有方法都变为异步。
我有什么想法可以解决这个问题吗?
答案 0 :(得分:5)
最近akka为Scala提供了一个actor框架,它基于Erlang。
答案 1 :(得分:3)
使用最近出现的优秀Actors库之一。亚历克斯·米勒为Javaworld on Actors写了一篇很好的两篇文章。
我个人非常喜欢Actor's Guild。
答案 2 :(得分:2)
您可能还想查看Scala的actor(您可以将它们视为一种Java库),例如:The busy Java developer's guide to Scala: Dive deeper into Scala concurrency。
答案 3 :(得分:0)
你可能还想看看esper,它不像提到的actor框架那么低级,更像是你在actor上构建的通用事件处理系统框架。非常成熟,完整,我认为是为金融交易中的复杂事件处理而开发的。
答案 4 :(得分:0)
Kontraktor是专为java 8设计的新演员库。https://github.com/RuedigerMoeller/kontraktor
答案 5 :(得分:0)
你可以考虑另一种选择,即 Netty 以及 LMAX Disruptor ,它们都是用纯java编写的。 Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器&客户端。
什么是干扰者?
LMAX旨在成为全球最快的交易平台。显然,为了实现这一点,我们需要做一些特殊的事情来实现我们的Java平台的低延迟和高吞吐量。性能测试表明,使用队列在系统各阶段之间传递数据会引入延迟,因此我们专注于优化此区域。
Disruptor是我们研究和测试的结果。我们发现CPU级别的高速缓存未命中,并且需要内核仲裁的锁定都非常昂贵,因此我们创建了一个框架,对其运行的硬件具有“机械同情”,并且这是无锁的......