关于Java:Akka的好用例

Good use case for Akka

我听说过很多关于AKKA框架(Java/Scala服务平台)的文章,但到目前为止还没有看到很多有用的用例。因此,我有兴趣了解开发人员成功使用它的情况。

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


到目前为止,我已经在两个真正的项目中成功地使用了它。两者都在接近实时的交通信息领域(如高速公路上的汽车交通),分布在多个节点上,在多个参与方之间集成消息,可靠的后端系统。我还没有自由给出客户的具体情况,当我确定的时候,也许可以添加它作为参考。

尽管我们是从0.7版开始的,但Akka确实在这些项目上取得了进展。(顺便说一下,我们正在使用scala)

其中一个最大的优点是,您可以很容易地用参与者和消息组成一个系统,几乎没有样板文件,它的规模非常好,没有手工滚线程的所有复杂性,您几乎可以免费获得对象之间的异步消息传递。

它非常适合于建模任何类型的异步消息处理。我更喜欢用这种风格编写任何类型的(Web)服务系统,而不是任何其他风格。(您是否尝试过用JAX-WS编写异步Web服务(服务器端)?那是很多水管)。所以我要说的是,任何一个系统都不想挂起它的一个组件,因为所有的东西都是使用同步方法隐式调用的,并且有一个组件正在锁定某个东西。它非常稳定,让它崩溃+主管解决故障的方法真的很有效。所有东西都易于编程设置,而不难进行单元测试。

还有一些优秀的附加模块。camel模块确实可以很好地插入到akka中,并且能够轻松地开发具有可配置端点的异步服务。

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


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

除了提供一个并发性的smorgansbord,它更容易解释和得到正确的(参与者、代理、数据流并发)以及以stm的形式进行并发控制。

下面是一些您可能会考虑的用例:

  • 交易处理(在线游戏、金融、统计,博彩、社交媒体、电信等)
    • 放大、缩小、容错/公顷
  • 服务后端(任何行业、任何应用程序)
    • 服务休息、SOAP、Comet等
    • 充当消息中心/集成层
    • 放大、缩小、容错/公顷
  • 管理单元并发性/并行性(任何应用程序)
    • 对的
    • 简单易懂
    • 只需将JAR添加到现有的JVM项目中(使用scala,Java、Groovy或JRube
  • 批处理(任何行业)
    • 与批处理数据源连接的camel集成
    • 参与者划分并征服批处理工作负载
  • 通信枢纽(电信、网络媒体、移动媒体)
    • 放大、缩小、容错/公顷
  • 游戏服务器(在线游戏、投注)
    • 放大、缩小、容错/公顷
  • BI/数据挖掘/通用处理
    • 放大、缩小、容错/公顷
  • 在此处插入其他好的用例

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

    在JVM上传递的ErlangOTP风格的消息使得在现有库和应用服务器的基础上开发实时系统成为了一个很好的系统。

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


    我们使用AKKA异步处理REST调用-与异步Web服务器(基于netty)一起,与传统的每用户线程请求模型相比,我们可以在每个节点/服务器上服务的用户数上实现10倍的改进。

    告诉你的老板,你的自动焊接系统托管帐单将下降10倍,这是一个不需要大脑的!嘘…但不要告诉亚马逊…:)


    我们在一个大型电信项目中使用Akka(不幸的是,我不能透露很多细节)。AKKA参与者由Web应用程序远程部署和访问。这样,我们就有了一个基于Google ProtoBuffer的简化的RPC模型,并使用Akka Futures实现了并行性。到目前为止,这一模式已经取得了很好的效果。注意:我们使用的是Java API。


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

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

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

    • 聊天服务器
    • MMO的网络层
    • 财务数据泵
    • iPhone/Mobile/Whatever应用程序的通知系统
    • REST服务器
    • 可能是类似于WebMachine的东西(猜测)

    AKKA的好处在于它为持久性、STM实现、REST服务器和容错性提供了选择。

    不要被聊天服务器的例子所烦扰,把它看作某种解决方案的例子。

    有了他们所有优秀的文档,我觉得这个问题、用例和示例之间存在差距。记住这些例子是不平凡的。

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


    你可以用阿克卡做几种不同的东西。

    我在一个网站上工作,在那里我把技术栈移植到了scala和akka。我们几乎把它用于网站上发生的所有事情。尽管您可能认为聊天示例不好,但基本上都是相同的:

    • 网站上的实时更新(例如视图、喜欢等)
    • 显示实时用户评论
    • 通知服务
    • 搜索和所有其他类型的服务

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

    我还使用AKKA作为印刷电路板自动路由器的应用程序,以实现从笔记本电脑到数据中心的扩展。你给它的力量越大,效果就越好。如果您尝试使用常见的并发性,那么这将非常难以实现,因为Akka还为您提供了位置透明性。

    目前,作为一个空闲时间项目,我只使用参与者构建一个Web框架。同样的好处是从一台机器到整个机器集群的可扩展性。此外,使用消息驱动方法使您的软件从一开始就面向服务。您拥有所有这些不错的组件,彼此交谈但不一定了解彼此,生活在同一台机器上,甚至不在同一个数据中心。

    自从GoogleReader关闭后,我开始使用RSS阅读器,当然是使用Akka。这一切都是关于我的封装服务。结论:演员模型本身就是你应该首先采用的,而AKKA是一个非常可靠的框架,它可以帮助你实现它,并为你带来很多好处。


    我们在几个项目中使用AKKA,其中最有趣的是与车辆碰撞维修有关。主要在英国,但现在扩展到美国、亚洲、澳大拉西亚和欧洲。我们使用行动者来确保实时提供碰撞维修信息,以确保车辆的安全和经济高效维修。

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


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


    我正在尝试AKKA(Java API)。我尝试将Akka的基于角色的并发模型与普通Java并发模型(JavaUTIL并发类)进行比较。

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

    对于Akka,我使用了BalancedDispatcher(用于线程之间的负载平衡)和RoundRobinRouter(用于限制我的函数参与者)。对于Java,我使用了简单的FooFixJoin技术(没有任何工作窃取算法实现),它可以叉映射/减少执行并加入结果。中间结果保存在阻塞队列中,以使连接尽可能并行。也许,如果我没有错的话,这会以某种方式模仿阿卡演员的"邮箱"概念,他们在那里接收信息。

    观察:在中等负载(大约50000个字符串输入)之前,结果是可比较的,在不同的迭代中略有不同。但是,当我把负载增加到100000时,它会挂起Java解决方案。在这种情况下,我配置了20-30线程的Java解决方案,在所有迭代中都失败了。

    将负载增加到1000000,对Akka来说也是致命的。我可以与任何有兴趣进行交叉检查的人共享代码。

    因此,对我来说,Akka比传统的Java多线程解决方案要好得多。可能是因为斯卡拉的魔法。

    如果我可以将问题域建模为事件驱动的消息传递域,我认为AKKA是JVM的一个好选择。

    测试执行日期:Java版本:1.6IDE:Eclipse 3.7Windows Vista 32位。3GB RAM。Intel Core i5处理器,2.5 GHz时钟速度

    请注意,测试中使用的问题域可以被讨论,并且我试图和我所允许的Java知识一样公平:


    我们在口语对话系统(primetalk)中使用akka。内部和外部。为了在一个集群节点上同时运行大量的电话信道,显然需要有一些多线程框架。阿克卡的工作非常完美。我们以前有过Java并发的噩梦。而对于阿卡来说,它就像一个秋千——它很简单。坚固可靠。24×7,不停。

    在一个通道中,我们有并行处理的实时事件流。特别地:-冗长的自动语音识别——由演员完成;-音频输出制作者,混合几个音频源(包括合成语音);-文本到语音的转换是一组单独的演员在频道之间共享;-语义和知识处理。

    为了实现复杂信号处理的互连,我们使用synapsegrid。它具有在复杂的actor系统中对数据流进行编译时检查的优点。


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