我在Java中处理财务应用程序并且正确地获得并发是痛苦的.Erlang和actors模型应该适合大规模并发应用程序,但我无法弄清楚如何在Java中实现它.我知道有一些库,如Jetlang,FunctionalJava,kilim等,但它们通常不会超越简单的例子.
假设我需要处理三个或四个不同的事件,比如从市场数据源,订单/交易源和"输出"这些数据的某些衍生物中计算一些数字.大多数情况下,这些事件或数据流需要按顺序处理(至少按照某些键的顺序进行处理...例如,必须按顺序处理特定符号的所有订单,但与尊重不相关的符号)
我使用改变状态的方法创建一个普通的Java对象.我不是让这些方法直接改变状态,而是将它们的参数(通过将它们转换为命令对象)放在fifo队列(erlang的邮箱)中,并使用react()方法处理该队列.这样,所有更新都必须通过单个队列,并且react()方法一次只能访问一个更新.从理论上讲,这应该可以节省锁定或同步此方法的需要.
但是,此队列基本上是生产者/消费者队列,这意味着它是阻塞队列.阻塞对于可伸缩性来说非常糟糕.此外,拥有一个队列意味着我的所有更新命令对象(不同类型)都从队列中带出一些过于通用的超类型(如Object),我必须将它们转换回正确的类型并让react()处理它们.
一旦这个actor化对象产生一个输出,由另一个这样的对象消耗,我就会经历同一个过程.换句话说,我已经将编程模型从面向对象改变为返回结果的方法,以及某种延续传递噩梦,其中我的所有方法都变为异步.
我有什么想法可以解决这个问题吗?
最近,akka为Scala提供了一个actor框架,它基于Erlang.