我听过很多关于Akka框架(Java/Scala服务平台)的赞不绝口,但到目前为止,还没有看到很多实际用例的例子。因此,我很有兴趣了解开发人员如何成功地使用它。
只有一个限制:请不要包括写聊天服务器的情况。 (为什么?因为这已经被过度用作许多类似事情的例子)
我听过很多关于Akka框架(Java/Scala服务平台)的赞不绝口,但到目前为止,还没有看到很多实际用例的例子。因此,我很有兴趣了解开发人员如何成功地使用它。
只有一个限制:请不要包括写聊天服务器的情况。 (为什么?因为这已经被过度用作许多类似事情的例子)
当前回答
我们正在使用akka及其camel插件为twimpact.com分发我们的分析和趋势处理。我们必须每秒处理50到1000条消息。除了使用camel进行多节点处理外,它还用于将单个处理器上的工作分配给多个工作人员,以获得最大性能。工作得很好,但需要了解如何处理拥塞。
其他回答
我正在试用Akka (Java api)。我所尝试的是比较Akka的基于参与者的并发模型和普通Java并发模型(Java .util。并发类)。
这个用例是一个简单的规范映射减少字符计数的实现。数据集是随机生成的字符串(长度为400个字符)的集合,并计算其中元音的数量。
For Akka I used a BalancedDispatcher(for load balancing amongst threads) and RoundRobinRouter (to keep a limit on my function actors). For Java, I used simple fork join technique (implemented without any work stealing algorithm) that would fork map/reduce executions and join the results. Intermediate results were held in blocking queues to make even the joining as parallel as possible. Probably, if I am not wrong, that would mimic somehow the "mailbox" concept of Akka actors, where they receive messages.
观察: 直到中等负载(~50000字符串输入),结果是可比较的,在不同的迭代中略有变化。但是,当负载增加到100000时,Java解决方案就挂起了。在这种情况下,我将Java解决方案配置为20-30个线程,它在所有迭代中都失败了。
将负载增加到1000000,对Akka来说也是致命的。我可以与任何有兴趣进行交叉检查的人分享代码。
所以对我来说,Akka似乎比传统的Java多线程解决方案更好。原因可能是Scala的底层魔力。
如果我可以将问题域建模为事件驱动的消息传递,那么我认为Akka是JVM的一个很好的选择。
测试对象: Java版本:1.6 IDE: Eclipse 3.7 Windows Vista 32位。3 gb ram。英特尔酷睿i5处理器,2.5 GHz时钟速度
请注意,用于测试的问题域是可以争论的,我试图在我的Java知识允许的范围内尽可能地公平:-)
到目前为止,我已经在两个实际项目中非常成功地使用了它。两者都在接近实时的交通信息领域(就像高速公路上的汽车一样),分布在几个节点上,集成各方之间的消息,可靠的后端系统。我现在还不能透露客户的具体情况,当我得到批准的时候,也许可以把它作为参考。
Akka确实完成了这些项目,尽管我们在0.7版本时就开始了。(顺便说一下,我们正在使用scala)
最大的优势之一是,你可以轻松地用角色和消息组成一个系统,几乎没有样板,它的伸缩性非常好,没有手摇线程的复杂性,你几乎可以免费地在对象之间传递异步消息。
It is very good in modeling any type of asynchronous message handling. I would prefer to write any type of (web) services system in this style than any other style. (Have you ever tried to write an asynchronous web service (server side) with JAX-WS? that's a lot of plumbing). So I would say any system that does not want to hang on one of its components because everything is implicitly called using synchronous methods, and that one component is locking on something. It is very stable and the let-it-crash + supervisor solution to failure really works well. Everything is easy to setup programmatically and not hard to unit test.
还有一些优秀的附加模块。 Camel模块可以很好地插入到Akka中,并且可以使用可配置的端点轻松开发异步服务。
我对这个框架非常满意,它正在成为我们所构建的连接系统的事实上的标准。
我们在语音对话系统(primetalk)中使用Akka。无论是对内还是对外。为了在单个集群节点上同时运行许多电话通道,显然需要一些多线程框架。Akka的工作非常完美。我们以前有过java并发性的噩梦。和Akka一起,它就像一个秋千——它简单地工作。坚固可靠。24 * 7,不间断。
在通道中,我们有并行处理的实时事件流。特别是: -冗长的自动语音识别-由演员完成; -音频输出生成器,混合一些音频源(包括合成语音); 文本到语音的转换是一个单独的在频道之间共享的角色集 -语义和知识加工。
为了实现复杂信号处理的互连,我们使用SynapseGrid。它具有在复杂参与者系统中对DataFlow进行编译时检查的好处。
我们在工作中的几个项目中使用了Akka,其中最有趣的是与车辆碰撞修复有关。主要在英国,但现在扩展到美国,亚洲,大洋洲和欧洲。 我们使用参与者来确保实时提供碰撞修复信息,以实现安全且具有成本效益的车辆修复。
关于Akka的问题其实更多的是“你不能用Akka做什么”。它与强大的框架集成的能力、强大的抽象性和所有的容错能力使它成为一个非常全面的工具包。
我们使用Akka来异步处理REST调用——与异步web服务器(基于net)一起,与传统的每个用户请求线程模型相比,我们可以在每个节点/服务器服务的用户数量上实现10倍的提高。
告诉你的老板,你的AWS托管费用将下降10倍,这是一个不用动脑筋的事情!嘘……不过别告诉亚马逊…:)