Akka的好用例

Sta*_*Man 596 java asynchronous scala use-case akka

我听说过很多关于Akka框架(Java/Scala服务平台)的狂热,但到目前为止还没有看到很多用例的实际例子.所以我有兴趣听听开发人员成功使用它的事情.

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

Ray*_*urg 319

到目前为止,我已经在两个真正的项目中使用它非常成功.两者都处于近实时交通信息领域(高速公路上的车辆中的交通),分布在多个节点上,在多方之间集成消息,可靠的后端系统.我还不能自由地给客户提供具体信息,当我确实得到确定时可能会添加它作为参考.

尽管我们从0.7版本开始,Akka已经真正完成了这些项目.(我们顺便使用scala)

其中一个巨大的优势是,您可以轻松地从演员和消息中构建一个系统,而且几乎没有电子设备,它可以很好地扩展,而不需要手动线程的所有复杂性,并且几乎可以免费在对象之间传递异步消息.

它非常适合建模任何类型的异步消息处理.我宁愿用这种风格编写任何类型的(网络)服务系统,而不是任何其他风格.(您是否曾尝试使用JAX-WS编写异步Web服务(服务器端)?这是很多管道工程).所以我会说任何不希望挂在其中一个组件上的系统,因为所有内容都是使用同步方法隐式调用的,并且一个组件锁定某些东西.它非常稳定,故障的崩溃+主管解决方案确实运行良好.一切都很容易以编程方式设置,并且不难进行单元测试.

然后是优秀的附加模块.Camel模块确实可以很好地插入Akka,并通过可配置的端点实现异步服务的轻松开发.

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

  • MQ产品实际上是针对不同的用例.不同的保证和非常不同的表现.MQ产品需要大量设置,您不会像使用对象一样在这样的产品中使用队列.演员是akka中的一等公民,你可以随心所欲地使用它们,类似于你如何使用对象,所以编程模型和设置中的开销都要少得多.您将更多地使用MQ产品与其他外部系统集成,而不是构建系统的"内部",这是您将使用actor的东西. (27认同)
  • DBP案例研究的新URL是http://downloads.typesafe.com/website/casestudies/Dutch-Border-Police-Case-Study-v1.3.pdf (26认同)
  • 与您在意见中使用消息传递后端(例如ActiveMQ)进行消息传递相比,此方法有什么好处? (12认同)
  • @RaymondRoestenburg你忽略了提到演员模型as-is促进了意大利面条般的结构.你写的"Akka in Action"一书是这个"特色"的最佳演示.代码示例处理相当基本的故事.然而,工作流程很难理解并遵循代码.一个相关的问题是,Akka代码将以您可以想象的最具侵入性的方式在您的业务逻辑中不可逆转.比任何其他非参与者框架都要多得多.如果不将其分解为不同的单独部分,则编写基本工作流是根本不可能的. (4认同)
  • 建立@RaymondRoestenburg re:MQ 系统和替代方案。例如,RabbitMQ 建立在*上* 一种基于actor 的编程语言Erlang。这是考虑参与者和 MQ 之间关系(和区别)的一种方式。同时 [Apache Spark](https://spark.apache.org/) 既不是 worker-and-queue 也不是 Actor-based,但可以与 Akka 一起使用:[Typesafe 演示如何将 Spark Streaming 与 Akka 一起使用](http: //www.typesafe.com/activator/template/spark-streaming-scala-akka)。 (2认同)

Vik*_*ang 219

免责声明:我是Akka的PO

除了提供一个更简单的并发smorgasbord和正确(演员,代理,数据流并发)和STM形式的并发控制.

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

  1. 交易处理(在线游戏,金融,统计,博彩,社交媒体,电信......)
    • 向上扩展,向外扩展,容错/ HA
  2. 服务后端(任何行业,任何应用程序)
    • 服务REST,SOAP,cometd等
    • 充当消息中心/集成层
    • 向上扩展,向外扩展,容错/ HA
  3. 管理单元并发/并行(任何应用程序)
    • 正确
    • 简单易用和理解
    • 只需将jar添加到现有的JVM项目中(使用Scala,Java,Groovy或JRuby)
  4. 批处理(任何行业)
    • Camel集成以与批处理数据源连接
    • 参与者划分和征服批处理工作负载
  5. 通信中心(电信,网络媒体,移动媒体)
    • 向上扩展,向外扩展,容错/ HA
  6. 游戏服务器(在线游戏,投注)
    • 向上扩展,向外扩展,容错/ HA
  7. BI /数据挖掘/通用计算
    • 向上扩展,向外扩展,容错/ HA
  8. 在这里插入其他好用例

  • 我理解Futures和STM的好处,但没有为演员找到好的用例.对于游戏或投注服务器,在负载均衡器后面使用Actors与多个应用服务器的优势是什么? (10认同)
  • @ViktorKlang POs!=技术主管.他们一起工作,但角色不同. (8认同)
  • 什么是"PO"? (3认同)

Wad*_*old 79

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

传递在JVM上的Erlang OTP样式消息为在现有库和应用程序服务器的肩膀上开发实时系统提供了一个很好的系统.

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

  • 韦德,你们如何处理邮件保证?你提到:(电子邮件/短信提醒,欺诈检测,低资金余额等),我认为这些可能发送给远程演员?你如何确保这些操作实际发生?如果节点在处理欺诈警报时失败怎么办?它永远消失了吗?你有一个最终一致的系统来清理它吗?谢谢! (8认同)
  • 我认为演员编程的重要部分一般是消息流.一旦开始概念化没有副作用的数据流,您只需要尽可能多的流量发生在每个节点上.这与高性能计算有很大不同,如果你有半同质的工作,不发送消息并花费很长时间来处理.我认为基于演员的Fibonacci实现是一个非常有限的例子,因为它没有展示为什么使用演员,只有演员瘫痪了.考虑用例的事件驱动架构. (7认同)
  • 事件驱动的架构是一种思考问题的不同方式.如果您正在考虑在Akka中进行编码,那么值得阅读Manlang中的Erlang OTP in Action.akka中的许多构造都受到Erlang OTP的影响,本书为您提供了为什么Jonas Boner以他的方式构建akka api的原则.阿卡是你站在的一座大山!如果你的演员通过状态变化持续存在,你真的需要10k写入第二次持续 (4认同)
  • 好问题詹姆斯.很明显,它适用于不急需回复的系统.例如,您可以处理信用卡账单; 计算; 发送电子邮件等我真的很想知道在需要回复时如何处理这些事情(交易).在末尾; 如果请求来自外部(互联网用户;来自呼叫中心的代表等); 他或她等待回复.如何确保执行子任务(执行异步); 在xa事务中,以便我可以回复? (2认同)

pio*_*rga 44

我们使用Akka异步处理REST调用 - 与异步Web服务器(基于Netty)一起,与每个用户请求模型的传统线程相比,我们可以将每个节点/服务器服务的用户数量提高10倍.

告诉你的老板,你的AWS托管账单将减少10倍,这是一个明智的做法!嘘......不要告诉亚马逊...... :)

  • 我假设呼叫是高延迟,低吞吐量?就像打电话给其他服务器一样,等待响应(代理)? (7认同)
  • 而且我忘了提到akka期货的monadic性质,它导致了更清晰的并行代码,为我们节省了数千个代码维护... (3认同)

Luc*_*sio 38

我们正在大规模的Telco项目中使用Akka(遗憾的是我无法透露很多细节).Akka actor由Web应用程序远程部署和访问.通过这种方式,我们有一个基于Google protobuffer的简化RPC模型,我们使用Akka Futures实现了并行性.到目前为止,这个模型运作得非常出色.一个注意事项:我们正在使用Java API.


tyl*_*eir 37

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

Akka提供的消息系统类似于Erlang的"让它崩溃"的心态.

所以示例是需要不同级别的持久性和消息传递可靠性的事物:

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

关于Akka的好处是它为持久性提供的选择,它是STM实现,REST服务器和容错.

不要被聊天服务器的例子弄得烦恼,把它想象成某类解决方案的例子.

凭借他们所有出色的文档,我觉得这个问题,用例和示例存在差距.记住这些例子并非易事.

(仅根据观看视频和玩源的经验编写,我没有使用akka实现任何功能.)

  • 谢谢 - 我不是说聊天服务器一定是坏的,只是我想要补充的例子; 更容易更好地了解潜力. (2认同)

ros*_*tin 24

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

与Akka的问题更多的是"你不能用Akka做什么".它与强大的框架集成,强大的抽象和所有容错方面的能力使其成为一个非常全面的工具包.

  • 从个人的角度来看,Akka带来的提升抽象层次是我最喜欢的.从企业的角度来看,它是集成功能.得到了生活,Akka非常好地涵盖了商业和娱乐:-) (6认同)

Joa*_*ert 24

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

我正在一个网站上工作,我将技术堆栈迁移到Scala和Akka.我们将它用于网站上发生的所有事情.即使您可能认为聊天示例不好,但所有内容基本相同:

  • 网站上的实时更新(例如观看次数,喜欢......)
  • 显示实时用户评论
  • 通知服务
  • 搜索和所有其他类型的服务

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

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

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

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


小智 18

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


sut*_*lui 18

我正在尝试Akka(Java api).我试过的是将Akka基于actor的并发模型与普通Java并发模型(java.util.concurrent类)进行比较.

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

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

观察:直到中等载荷(约50000弦输入),结果具有可比性,在不同的迭代中略有不同.但是,当我将负载增加到~100000时,它会挂起Java解决方案.在这种情况下,我使用20-30个线程配置了Java解决方案,并且在所有迭代中都失败了.

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

所以对我来说,似乎Akka比传统的Java多线程解决方案更好.也许原因在于Scala的引擎盖下魔力.

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

测试执行于:Java版本:1.6 IDE:Eclipse 3.7 Windows Vista 32位.3GB内存.英特尔酷睿i5处理器,2.5 GHz时钟速度

请注意,用于测试的问题域可以辩论,我试图尽可能公平,因为我的Java知识允许:-)

  • "我可以与任何有兴趣进行交叉检查的人分享这些代码." 如果你不介意,我想. (3认同)
  • 我也想要代码,你可以发布一个github链接吗? (3认同)

Ars*_*lev 16

我们在口语对话系统(primetalk)中使用Akka .内部和外部.为了在单个集群节点上同时运行许多电话通道,显然需要有一些多线程框架.Akka的作品非常完美.我们之前曾经遇到过java-concurrency的噩梦.和Akka一样,它就像一个秋千 - 它只是起作用.坚固可靠.24*7,不停.

在频道内部,我们拥有并行处理的实时事件流.特别是: - 冗长的自动语音识别 - 由演员完成; - 混合少量音频源(包括合成语音)的音频输出制作者; - 文本到语音转换是在通道之间共享的一组独立的参与者; - 语义和知识处理.

为了实现复杂信号处理的互连,我们使用SynapseGrid.它具有复杂actor系统中DataFlow的编译时检查的好处.


Dan*_*iro 14

我最近在Akka中实现了规范的map-reduce示例:字数统计.所以它是Akka的一个用例:更好的性能.它更像是JRuby和Akka演员的实验而不是其他任何东西,但它也表明Akka不仅仅是Scala或Java:它适用于JVM之上的所有语言.

  • 我写的比较是:Jruby顺序VS Jruby与演员.因此,唯一能够加快执行速度的是参与者的参与.没有I/O参与实验(文件是从磁盘加载的,但它是在设置基准计时器之前完成的). (2认同)