Akka 框架的最佳用例是什么 [已关闭]

What are the best use cases for Akka framework [closed]

提问人:StaxMan 提问时间:12/21/2010 最后编辑:ChristopheStaxMan 更新时间:5/18/2022 访问量:178183

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

10年前关闭。

我听说过很多关于 Akka 框架(Java/Scala 服务平台)的赞美,但到目前为止,还没有看到很多实际的用例示例。因此,我很想听听开发人员成功使用它的内容。

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

java scala 异步 akka stm esb

评论

10赞 Kennet 12/21/2010
从问题开始并找到解决方案,难道不是比拥有解决方案并寻找问题来应用它更容易吗?我的猜测是,与使用 RMI 相比,Akka 及其参与者看起来更容易/更简单地编写代码。
75赞 StaxMan 12/21/2010
是的,如果我有具体问题要解决。无论如何,我都不是在寻找“使用 Akka 的借口”,但我有兴趣了解更多。这也可能有助于解决未来的问题,但主要是为了持续的学习过程。
0赞 ses 5/22/2013
有相关的问题,但关于将 AKKA 应用于现有应用程序 + 一些用例:stackoverflow.com/questions/16595685/...
2赞 user2684301 1/14/2014
Akka 是比 JMS 或 MQ 风格的分布式消息队列系统更好的解决方案。对于最近问完全相同的问题的我自己来说,这是理解它的最好方式:“我知道如何使用它,看看我可以在哪里使用它,但我看不出这会在哪些方面提供真正的优势”。Akka 背后的核心设计假设比 JMS/MQ 背后的设计假设要好得多,特别是在进程隔离、无锁设计和重试/故障处理方面。其次,API 比 JMS/MQ 工具优雅得多。
2赞 StaxMan 1/15/2014
@user2684301嗯。我觉得这个答案有点不公平,就像苹果对橙子一样。MQ 是(逻辑上)简单的构建块,其功能比 Akka 少得多,我不会将它们并排比较。但我想,如果我把它读作“与使用 JMS 构建的分布式系统相比,以声明方式编写”,那么它会更有意义。

答:

38赞 tylerweir 12/21/2010 #1

如果你把聊天服务器抽象上一个层次,那么你就会得到答案。

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

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

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

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

不要对聊天服务器的例子感到恼火,把它看作是某类解决方案的一个例子。

凭借他们所有出色的文档,我觉得这个确切的问题、用例和示例存在差距。请记住,这些例子并非平凡。

(我只用观看视频和玩源的经验编写的,我没有使用 akka 实现任何内容。

评论

2赞 StaxMan 12/21/2010
谢谢 - 我并不是说聊天服务器一定不好,只是我想要补充的例子;更容易更好地了解潜力。
0赞 software.wikipedia 1/9/2019
想知道REST服务器如何适应这里吗?您是否在 Node.js 样式异步服务器的上下文中提到它?感谢您分享示例用例。我发现它们很有用。
80赞 Wade Arnold 12/21/2010 #2

我们如何使用它的一个例子是在借记卡/信用卡交易的优先级队列中。我们有数以百万计的此类字符串,工作量取决于输入字符串类型。如果交易是 CHECK 类型,我们几乎没有处理,但如果它是销售点,那么有很多事情要做,例如与元数据(类别、标签、标签等)合并并提供服务(电子邮件/短信警报、欺诈检测、低资金余额等)。 根据输入类型,我们编写处理工作和执行工作所需的各种特征(称为混合)的类。所有这些工作都以实时模式从不同的金融机构进入同一个队列。清理数据后,会将其发送到不同的数据存储进行持久化、分析,或推送到套接字连接或 Lift 彗星执行器。工作参与者不断对工作进行自我负载平衡,以便我们可以尽快处理数据。我们还可以为关键决策点提供额外的服务、持久性模型和

在 JVM 上传递的 Erlang OTP 样式消息构成了一个伟大的系统,用于在现有库和应用服务器的肩膀上开发实时系统。

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

评论

1赞 StaxMan 12/21/2010
那么,公平地说,这是(某些)长延迟请求的情况,其中每个请求的单线程无法很好地扩展?
7赞 Wade Arnold 12/21/2010
我认为 actor 编程中最重要的部分是消息流。一旦你开始在没有副作用的数据流中概念化,你只希望每个节点发生尽可能多的流。这与高性能计算有很大不同,因为高性能计算具有半同构作业,这些作业不发送消息并且需要很长时间才能处理。我认为基于参与者的斐波那契实现是一个非常有限的例子,因为它没有展示为什么使用参与者,而只是参与者瘫痪了 taks。考虑用例的事件驱动架构。
4赞 Wade Arnold 12/22/2010
事件驱动架构是一种不同的思考问题的方式。如果您正在考虑在 Akka 中编码,那么值得一读 Erlang OTP in Action from manning。akka 中的许多结构都受到 Erlang OTP 的影响,这本书为您提供了 Jonas Boner 为什么以他的方式构建 akka api 的原则。阿卡是你所站立的一座大山!如果你的 actor 在状态变化中持续存在,你真的需要 10k 次写入
8赞 James 7/17/2012
韦德,你们是如何处理消息保证的?您提到:(电子邮件/短信警报、欺诈检测、低资金余额等),我认为这些可能会发送给远程参与者?您如何确保这些操作实际发生?如果节点在处理欺诈警报时出现故障怎么办?它永远消失了吗?您是否有一个最终一致的系统来清理它?谢谢!
2赞 Kaan Yy 9/5/2012
好问题詹姆斯。很明显,它适合一个不需要急需回复的系统。例如,您可以处理信用卡账单;算;发送电子邮件等我真的想知道当需要回复时如何处理这些事情(交易)。最后;如果请求来自外部(互联网用户、呼叫中心代表等);他或她等待回复。我如何确保子任务(异步执行)被执行;在 xa 事务中,以便我可以返回回复?
331赞 Raymond Roestenburg 12/21/2010 #3

到目前为止,我已经在两个实际项目中非常成功地使用了它。两者都处于近乎实时的交通信息领域(交通如高速公路上的汽车),分布在多个节点上,集成多方之间的消息,可靠的后端系统。我还不能随意提供有关客户的详细信息,当我得到 OK 时,也许可以将其添加为参考。

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

其中一大优点是,你可以很容易地用Actor和消息组成一个系统,几乎没有样板,它的扩展性非常好,没有手工线程的所有复杂性,而且你几乎可以免费获得在对象之间传递的异步消息。

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

然后是优秀的附加模块。 Camel 模块确实很好地插入了 Akka,并实现了具有可配置端点的异步服务的简单开发。

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

评论

15赞 magiconair 9/23/2012
在您看来,与使用消息传递后端(例如 ActiveMQ)进行消息传递相比,这种方法有什么好处?
27赞 Raymond Roestenburg 1/2/2013
MQ 产品实际上适用于不同的用例。不同的保证和截然不同的性能。MQ 产品需要大量的设置,您不会像使用对象那样在此类产品中使用队列。Actor 是 akka 中的一等公民,您可以随心所欲地使用它们,类似于使用对象的方式,因此编程模型中的开销和设置中的开销都要小得多。MQ 产品,你会更多地用于与其他外部系统集成,而不是构建系统的“内部”,这是你会使用 actor 来实现的。
27赞 Bas 12/8/2013
DBP 案例研究的新 URL downloads.typesafe.com/website/casestudies/...
2赞 floer32 5/22/2015
基于 @RaymondRoestenburg re: MQ 系统和替代方案进行构建。例如,RabbitMQ 是基于 actor 的编程语言 Erlang 构建的。这是思考 actor 和 MQ 之间关系(和区别)的一种方式。同时,Apache Spark 既不是基于 worker 和队列的,也不是基于 actor 的,但可以与 Akka 一起使用:Typesafe 演示了如何在 Akka 中使用 Spark Streaming
6赞 rapt 12/7/2017
@RaymondRoestenburg 你忽略了 Actor 模型的原样提倡类似意大利面条的结构。你写的《Akka in Action》一书就是这个“功能”的最好示范。代码示例处理相当基本的故事。然而,工作流程很难从代码中理解和遵循。一个相关的问题是,Akka 代码将以你能想象到的最侵入性的方式不可逆地遍布你的业务逻辑。比任何其他非参与者框架都要多得多。如果不将基本工作流分解为不同的单独部分,就不可能编写基本工作流。
227赞 Viktor Klang 12/21/2010 #4

免责声明:我是 Akka 的 PO

除了提供更易于推理和正确(参与者、代理、数据流并发)的并发性大杂烩之外,还以 STM 的形式提供并发控制。

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

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

评论

12赞 Martin Konicek 7/10/2013
我了解 Futures 和 STM 的好处,但没有找到适合演员的好用例。对于游戏或投注服务器,与负载均衡器后面的多个应用服务器相比,使用 Actor 的优势是什么?
8赞 taylorcressy 7/16/2017
@ViktorKlang PO != 技术主管。他们一起工作,但角色不同。
0赞 JustTry 6/12/2023
我无法理解如何将 Akka 用于 BI/数据挖掘/通用处理
39赞 Luciano Fiandesio 12/21/2010 #5

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

评论

0赞 Aktau 9/24/2012
您能告诉我们更多吗?Afaik Futures 不能通过电汇(序列化)发送。你是用了很多期货,演员很少,还是两者混合,或者......?您是否将 protobuf 用于所有序列化并作为消息发送给参与者?
0赞 Erik Kaplun 6/22/2014
如果没有 Akka,这似乎可以很容易地处理。
1赞 Roman Kagan 3/3/2016
TDC是Fiaddesio的电信公司。
15赞 Daniel Ribeiro 12/21/2010 #6

我最近在 Akka 中实现了规范的 map-reduce 示例:字数统计。因此,这是 Akka 的一个用例:更好的性能。这更像是 JRuby 和 Akka 的 actor 的实验,但它也表明 Akka 不仅仅是 Scala 或 Java:它适用于 JVM 之上的所有语言。

评论

0赞 StaxMan 12/22/2010
您知道什么负责更好的性能(以及与哪种替代方案进行比较)吗?这是由于在 JVM 上使用 JRuby(相对于原生 Ruby)、由于非阻塞 I/O 或其他原因导致的 scalalibililiy?
2赞 Daniel Ribeiro 12/22/2010
我写的比较是:Jruby 顺序 VS Jruby 与演员。因此,唯一可以负责更快执行的是参与者的参与。实验中没有参与 I/O(文件是从磁盘加载的,但在设置基准计时器之前完成)。
0赞 chaostheory 8/27/2011
我最近也实现了一个map reduce示例,但它只是普通的java github.com/chaostheory/jibenakka
18赞 Matthias L. Jugel 12/21/2010 #7

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

评论

0赞 Erik Kaplun 6/22/2014
您是否也在使用 Akka 的容错功能?
0赞 skjagini 9/19/2019
如果我们有权访问 Spark 集群,那么 Spark Streaming 怎么样?
25赞 rossputin 12/21/2010 #8

我们在几个项目中使用 Akka,其中最有趣的是与车祸维修有关。主要在英国,但现在扩展到美国、亚洲、大洋洲和欧洲。 我们使用参与者来确保实时提供碰撞维修信息,以实现安全且具有成本效益的车辆维修。

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

评论

0赞 StaxMan 12/22/2010
那么,如果必须选择,您最喜欢哪个方面呢?其他框架的现有集成、自动容错还是其他什么?
6赞 rossputin 12/23/2010
从个人角度来看,我最喜欢的是 Akka 带来的提升抽象层次。从企业的角度来看,它是集成能力。必须谋生,Akka 很好地涵盖了商业和娱乐:-)
0赞 surfmuggle 9/27/2018
您能详细说明一下消息的流动情况吗?用户是维修店的人员,并将有关崩溃的详细信息输入到 http-form 中,然后将数据发送到服务器。这会创建由 akka 处理的消息吗?如何处理此消息?提取输入的信息以查询数据库,然后将回复排队以将其发送回 Web 前端?
20赞 sutanu dalui 6/22/2012 #9

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

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

对于 Akka,我使用了 BalancedDispatcher(用于线程之间的负载均衡)和 RoundRobinRouter(以保持对函数参与者的限制)。对于 Java,我使用了简单的分叉连接技术(在没有任何工作窃取算法的情况下实现),该技术将分叉映射/减少执行并连接结果。中间结果保存在阻塞队列中,以使连接尽可能并行。如果我没记错的话,那可能会以某种方式模仿 Akka 演员的“邮箱”概念,他们在那里接收消息。

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

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

所以对我来说,Akka 似乎比传统的 Java 多线程解决方案更能扩展。原因可能是 Scala 的底层魔力。

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

测试执行于: Java版本:1.6 集成开发环境:Eclipse 3.7 Windows Vista 32 位。3GB 内存。Intel Core i5 处理器,2.5 GHz 时钟速度

请注意,用于测试的问题域可以进行辩论,我试图在我的 Java 知识允许的范围内尽可能公平:-)

评论

3赞 n1r3 9/5/2012
“我可以与任何有兴趣进行交叉检查的人分享代码。”如果你不介意的话,我愿意。
3赞 Gautam 10/31/2012
我也想要代码,你能发布一个github链接吗?
0赞 sutanu dalui 1/31/2013
感谢您的关注。不幸的是,我在设置 github 存储库时遇到了一些问题。如果你能把你的电子邮件给我,我可以邮寄源代码。并为迟到的回复感到遗憾!
0赞 Jay 6/17/2015
@sutanudalui 请问你还有代码吗,如果是这样,我可以分享我的电子邮件?
47赞 piotrga 11/17/2012 #10

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

告诉你的老板,你的AWS托管账单将下降10倍,这是不费吹灰之力的!嘘。。。不过不要告诉亚马逊...... :)

评论

4赞 piotrga 11/17/2012
而且我忘了提到 akka 期货的一元性质,这导致了更干净的并行代码,为我们节省了数千美元的代码维护......
8赞 StaxMan 11/18/2012
我假设调用是高延迟、低吞吐量的?就像调用其他服务器,等待响应(代理)一样?
17赞 Arseniy Zhizhelev 8/9/2013 #11

我们在口语对话系统(primetalk)中使用Akka。无论是内部还是外部。为了在单个群集节点上同时运行大量电话通道,显然需要一些多线程框架。Akka工作得很完美。我们之前有过关于java并发的噩梦。而对于 Akka,它就像一个秋千——它只是工作。坚固可靠。24*7,不间断。

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

为了实现复杂信号处理的互连,我们使用 SynapseGrid。它的好处是在复杂的执行组件系统中对 DataFlow 进行编译时检查。

25赞 Joa Ebert 8/9/2013 #12

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

我当时在一个网站上工作,在那里我将技术堆栈迁移到了 Scala 和 Akka。我们几乎将它用于网站上发生的所有事情。尽管您可能认为 Chat 示例很糟糕,但所有示例基本上都是一样的:

  • 网站上的实时更新(例如浏览量、点赞等)
  • 显示实时用户评论
  • 通知服务
  • 搜索和所有其他类型的服务

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

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

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

自从Google Reader关闭后,我开始使用RSS阅读器,当然使用Akka。对我来说,这一切都是关于封装服务的。总而言之:actor 模型本身是你应该首先采用的,而 Akka 是一个非常可靠的框架,可以帮助你实现它,并在此过程中获得很多好处。

评论

0赞 surfmuggle 9/27/2018
您好乔,您能解释一下如何使用消息来更新网站吗?您是否有一个内容作者系统?他创建了一篇新文章并点击保存。这是否会创建一条消息,该消息将发送到处理传入流量的多个服务器。每个服务器都会尽快处理更新消息。然后,每个新的浏览器请求都会获得页面的更新版本?谢谢