Akka框架的最佳用例是什么

我听过很多关于Akka框架(Java/Scala服务平台)的夸夸其谈,但到目前为止还没有看到很多实际的用例。因此,我很有兴趣了解开发人员如何成功地使用它。

只有一个限制:请不要包括写聊天服务器的情况。 (为什么?因为这已经被过度用作许多类似事情的例子)

177030 次浏览

如果您将聊天服务器抽象到一个级别,那么您将得到答案。

Akka提供了一个类似于Erlang的“让它崩溃”的消息传递系统。

例如,需要不同级别的持久性和可靠性的消息传递:

  • 聊天服务器
  • MMO的网络层
  • 财务数据泵
  • iPhone/手机/任何应用的通知系统
  • 其他服务器
  • 也许类似WebMachine(猜测)

Akka的优点是它为持久性、STM实现、REST服务器和容错提供了选择。

不要被聊天服务器的例子惹恼,把它看作是某一类解决方案的例子。

在他们所有优秀的文档中,我觉得这个确切的问题、用例和示例存在差距。请记住,这些例子不是简单的。

(仅凭观看视频和玩源代码的经验编写,我没有使用akka实现任何东西。)

我们如何使用它的一个例子是在借记卡/信用卡事务的优先队列上。我们有数百万这样的工作,工作的努力取决于输入的字符串类型。如果交易类型是CHECK,我们的处理很少,但如果它是一个销售点,那么就有很多事情要做,如合并元数据(类别,标签,标签等)和提供服务(电子邮件/短信警报,欺诈检测,低资金余额等)。 基于输入类型,我们组成了处理工作和执行工作所必需的各种特征的类(称为mixin)。在实时模式下,来自不同金融机构的所有这些作业都进入同一个队列。一旦数据被清除,它就被发送到不同的数据存储以进行持久化、分析,或者推送到套接字连接或Lift comet actor。工作参与者不断地自我负载平衡工作,以便我们能够尽可能快地处理数据。我们还可以在关键决策点插入额外的服务、持久性模型和。< / p >

在JVM上传递的Erlang OTP风格的消息对于在现有库和应用程序服务器的肩膀上开发实时系统来说是一个很棒的系统。

Akka允许您像在传统的中一样进行消息传递,但速度更快!它还为您提供了框架中的工具,以管理解决方案所需的大量参与者池、远程节点和容错。

到目前为止,我已经在两个实际项目中非常成功地使用了它。两者都在接近实时的交通信息领域(就像高速公路上的汽车一样),分布在几个节点上,集成各方之间的消息,可靠的后端系统。我现在还不能透露客户的具体情况,当我得到批准的时候,也许可以把它作为参考。

Akka确实完成了这些项目,尽管我们在0.7版本时就开始了。(顺便说一下,我们正在使用scala)

最大的优势之一是,你可以轻松地用角色和消息组成一个系统,几乎没有样板,它的伸缩性非常好,没有手摇线程的复杂性,你几乎可以免费地在对象之间传递异步消息。

它非常适合建模任何类型的异步消息处理。我更喜欢用这种风格来编写任何类型的(web)服务系统。(您曾经尝试过用JAX-WS编写异步web服务(服务器端)吗?这需要很多管道)。所以我想说的是,任何一个系统都不想挂起它的某个组件,因为所有东西都是使用同步方法隐式调用的,而且那个组件锁定了某个组件。它非常稳定,“让它崩溃+管理器”的失败解决方案真的很有效。一切都很容易以编程方式设置,并且不难进行单元测试。

然后是优秀的附加模块。 Camel模块可以很好地插入到Akka中,并且可以使用可配置的端点轻松开发异步服务。< / p >

我对这个框架非常满意,它正在成为我们所构建的连接系统的事实上的标准。

免责声明:我是Akka的采购订单

此外,它还提供了一个更容易推理和纠正的并发大杂烩(参与者、代理、数据流并发),并以STM的形式进行并发控制。

下面是一些你可以考虑的用例:

  1. 事务处理(在线 游戏,金融,统计, 博彩、社交媒体、电信……)
    • 向上扩展,向外扩展,容错/ HA
    • 李< / ul > < / > 服务后端(任何行业,任何应用)
      • 服务REST、SOAP、cometd等
      • 充当消息中心/集成层
      • 向上扩展,向外扩展,容错/ HA
      • 李< / ul > < / > 管理并发/并行(任何应用程序)
        • 正确的
        • 易于操作和理解
        • 只需将jar添加到您现有的JVM项目(使用Scala, Java, Groovy或JRuby) 李< / ul > < / >
        • 批处理(任何行业)
          • Camel集成用于连接批处理数据源
          • 参与者划分并克服批处理工作负载
          • 李< / ul > < / >
          • 通信枢纽(电信、网络媒体、移动媒体)
            • 向上扩展,向外扩展,容错/ HA
            • 李< / ul > < / >
            • 游戏服务器(网游、博彩)
              • 向上扩展,向外扩展,容错/ HA
              • 李< / ul > < / >
              • BI/数据挖掘/通用运算
                • 向上扩展,向外扩展,容错/ HA
                • 李< / ul > < / >
                • 在这里插入其他好的用例
我们正在一个大规模的电信项目中使用Akka(不幸的是,我不能透露很多细节)。 Akka角色由web应用程序远程部署和访问。这样,我们就有了一个基于谷歌原型缓冲区的简化RPC模型,并使用Akka Futures实现了并行。 到目前为止,这种模式运行得非常出色。注意:我们正在使用Java API。

我最近在Akka中实现规范映射减少示例:单词计数。所以这是Akka的一个用例:更好的性能。它更像是JRuby和Akka的演员的一个实验,但它也表明Akka不仅仅是Scala或Java:它可以在JVM之上的所有语言上工作。

我们正在使用akka及其camel插件来分发我们对twimpact.com的分析和趋势处理。我们必须每秒处理50到1000条消息。除了使用camel进行多节点处理外,它还用于将单个处理器上的工作分配给多个工作人员,以获得最大性能。工作得很好,但需要了解如何处理拥塞。

我们在工作中的几个项目中使用Akka,其中最有趣的是与车辆碰撞修复有关。主要在英国,但现在扩展到美国,亚洲,大洋洲和欧洲。 我们使用角色来确保实时提供碰撞修复信息,以实现安全且经济有效的车辆修复

关于Akka的问题其实更多的是“你不能用Akka做什么”。它与强大的框架集成的能力、强大的抽象性和所有的容错能力使它成为一个非常全面的工具包。

我正在试用Akka (Java api)。我所尝试的是比较Akka的基于参与者的并发模型和普通Java并发模型(Java .util。并发类)。

这个用例是一个简单的规范映射减少字符计数的实现。数据集是随机生成的字符串(长度为400个字符)的集合,并计算其中元音的数量。

对于Akka,我使用了BalancedDispatcher(用于线程之间的负载平衡)和RoundRobinRouter(用于限制我的函数角色)。对于Java,我使用了简单的fork连接技术(没有任何工作窃取算法实现),它可以fork映射/减少执行并连接结果。中间结果保存在阻塞队列中,以使连接尽可能地并行。如果我没有错的话,这可能在某种程度上模仿了Akka演员的“邮箱”概念,他们在那里接收消息。

< p >观察: 直到中等负载(~50000字符串输入),结果是可比较的,在不同的迭代中略有变化。但是,当负载增加到100000时,Java解决方案就挂起了。在这种情况下,我将Java解决方案配置为20-30个线程,它在所有迭代中都失败了。< / p >

将负载增加到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来异步处理REST调用——与异步web服务器(基于net)一起,与传统的每个用户请求线程模型相比,我们可以在每个节点/服务器服务的用户数量上实现10倍的提高。

告诉你的老板,你的AWS托管费用将下降10倍,这是一个不用动脑筋的事情!嘘……不过别告诉亚马逊…:)

我们在语音对话系统中使用Akka (primetalk)。无论是对内还是对外。为了在单个集群节点上同时运行许多电话通道,显然需要一些多线程框架。Akka的工作非常完美。我们以前有过java并发性的噩梦。和Akka一起,它就像一个秋千——它简单地工作。坚固可靠。24 * 7,不间断。

在通道中,我们有并行处理的实时事件流。特别是: -冗长的自动语音识别-由演员完成; -音频输出生成器,混合一些音频源(包括合成语音); 文本到语音的转换是一个单独的在频道之间共享的角色集 -语义与知识加工。

为了实现复杂信号处理的互连,我们使用SynapseGrid。它具有在复杂参与者系统中对DataFlow进行编译时检查的好处。

您可以将Akka用于几种不同的事情。

我在一个网站上工作,在那里我将技术堆栈迁移到Scala和Akka。我们用它来处理网站上发生的几乎所有事情。尽管你可能认为一个聊天的例子很糟糕,但基本上都是一样的:

  • 网站上的实时更新(例如,浏览量,点赞,…)
  • 显示实时用户评论
  • 通知服务
  • 搜索和其他各种服务

特别是实时更新很容易,因为他们归结为什么聊天的例子ist。服务部分是另一个有趣的话题,因为你可以简单地选择使用远程参与者,即使你的应用程序不是集群的,你也可以轻松地将它部署到不同的机器上。

我还将Akka用于PCB自动外接应用程序,其想法是能够从笔记本电脑扩展到数据中心。你给它的力量越大,结果就会越好。如果您尝试使用常见的并发性,这是非常难以实现的,因为Akka还提供了位置透明性。

目前作为一个空闲时间的项目,我正在构建一个只使用演员的web框架。同样,它的好处是从一台机器到整个机器集群的可伸缩性。此外,使用消息驱动方法可以使您的软件从一开始就面向服务。您拥有所有这些良好的组件,它们彼此通信,但不一定相互了解,它们位于同一台机器上,甚至不在同一个数据中心中。

自从谷歌阅读器关闭后,我开始使用RSS阅读器,当然使用Akka。对我来说,这完全是关于封装的服务。总之:参与者模型本身是您首先应该采用的,Akka是一个非常可靠的框架,可以帮助您实现它,并在此过程中获得许多好处。