提问人:StaxMan 提问时间:12/21/2010 最后编辑:ChristopheStaxMan 更新时间:5/18/2022 访问量:178183
Akka 框架的最佳用例是什么 [已关闭]
What are the best use cases for Akka framework [closed]
问:
我听说过很多关于 Akka 框架(Java/Scala 服务平台)的赞美,但到目前为止,还没有看到很多实际的用例示例。因此,我很想听听开发人员成功使用它的内容。
只有一个限制:请不要包括编写聊天服务器的情况。 (为什么?因为这已被过度用作许多类似事物的示例)
答:
如果你把聊天服务器抽象上一个层次,那么你就会得到答案。
Akka 提供了一个类似于 Erlang 的“让它崩溃”心态的消息传递系统。
因此,例如,需要不同级别的消息传递的持久性和可靠性:
- 聊天服务器
- MMO 的网络层
- 财务数据泵
- iPhone/手机/任何应用程序的通知系统
- REST服务器
- 也许类似于 WebMachine(猜测)
Akka 的优点在于它为持久性提供了选择,它是 STM 实现、REST 服务器和容错。
不要对聊天服务器的例子感到恼火,把它看作是某类解决方案的一个例子。
凭借他们所有出色的文档,我觉得这个确切的问题、用例和示例存在差距。请记住,这些例子并非平凡。
(我只用观看视频和玩源的经验编写的,我没有使用 akka 实现任何内容。
评论
我们如何使用它的一个例子是在借记卡/信用卡交易的优先级队列中。我们有数以百万计的此类字符串,工作量取决于输入字符串类型。如果交易是 CHECK 类型,我们几乎没有处理,但如果它是销售点,那么有很多事情要做,例如与元数据(类别、标签、标签等)合并并提供服务(电子邮件/短信警报、欺诈检测、低资金余额等)。 根据输入类型,我们编写处理工作和执行工作所需的各种特征(称为混合)的类。所有这些工作都以实时模式从不同的金融机构进入同一个队列。清理数据后,会将其发送到不同的数据存储进行持久化、分析,或推送到套接字连接或 Lift 彗星执行器。工作参与者不断对工作进行自我负载平衡,以便我们可以尽快处理数据。我们还可以为关键决策点提供额外的服务、持久性模型和 stm。
在 JVM 上传递的 Erlang OTP 样式消息构成了一个伟大的系统,用于在现有库和应用服务器的肩膀上开发实时系统。
Akka 允许您像在传统 esb 中一样进行消息传递,但速度更快!它还在框架中提供了一些工具,用于管理解决方案所需的大量执行组件池、远程节点和容错能力。
评论
到目前为止,我已经在两个实际项目中非常成功地使用了它。两者都处于近乎实时的交通信息领域(交通如高速公路上的汽车),分布在多个节点上,集成多方之间的消息,可靠的后端系统。我还不能随意提供有关客户的详细信息,当我得到 OK 时,也许可以将其添加为参考。
Akka 确实在这些项目上取得了进展,尽管我们是在 0.7 版本上开始的。(顺便说一句,我们使用的是 scala)
其中一大优点是,你可以很容易地用Actor和消息组成一个系统,几乎没有样板,它的扩展性非常好,没有手工线程的所有复杂性,而且你几乎可以免费获得在对象之间传递的异步消息。
它非常适合对任何类型的异步消息处理进行建模。我宁愿用这种风格编写任何类型的(Web)服务系统,而不是任何其他风格。(你有没有尝试过用 JAX-WS 编写一个异步 Web 服务(服务器端)?这是很多管道)。因此,我想说的是,任何不想挂在其中一个组件上的系统,因为所有东西都是使用同步方法隐式调用的,并且该组件锁定了某些东西。它非常稳定,让它崩溃 + 主管故障解决方案确实效果很好。一切都很容易以编程方式设置,单元测试也不难。
然后是优秀的附加模块。 Camel 模块确实很好地插入了 Akka,并实现了具有可配置端点的异步服务的简单开发。
我对这个框架非常满意,它正在成为我们构建的互联系统的事实标准。
评论
免责声明:我是 Akka 的 PO
除了提供更易于推理和正确(参与者、代理、数据流并发)的并发性大杂烩之外,还以 STM 的形式提供并发控制。
以下是您可以考虑的一些用例:
- 交易处理(在线)
游戏、金融、统计学、
博彩、社交媒体、电信等)
- 纵向扩展、横向扩展、容错/高可用
- 服务后端(任何行业、任何应用程序)
- 服务 REST、SOAP、cometd 等
- 充当消息中心/集成层
- 纵向扩展、横向扩展、容错/高可用
- 管理单元并发/并行性(任何应用)
- 正确
- 易于使用和理解
- 只需将 jar 添加到您现有的 JVM 项目中(使用 Scala、 Java、Groovy 或 JRuby)
- 批处理(任何行业)
- Camel 集成以连接批处理数据源
- 参与者分而治之 批处理工作负载
- 通信枢纽(电信、网络媒体、移动媒体)
- 纵向扩展、横向扩展、容错/高可用
- 游戏服务器(在线游戏、博彩)
- 纵向扩展、横向扩展、容错/高可用
- BI/数据挖掘/通用处理
- 纵向扩展、横向扩展、容错/高可用
- 在此处插入其他不错的用例
评论
我们正在一个大型电信项目中使用 Akka(不幸的是,我不能透露很多细节)。 Akka 参与者由 Web 应用程序远程部署和访问。这样,我们就有了基于 Google protobuffer 的简化 RPC 模型,并使用 Akka Futures 实现了并行性。 到目前为止,这个模型运行得非常出色。需要注意的是:我们使用的是 Java API。
评论
我最近在 Akka 中实现了规范的 map-reduce 示例:字数统计。因此,这是 Akka 的一个用例:更好的性能。这更像是 JRuby 和 Akka 的 actor 的实验,但它也表明 Akka 不仅仅是 Scala 或 Java:它适用于 JVM 之上的所有语言。
评论
我们正在使用 akka 及其 camel 插件来分发我们的分析和趋势处理,以供 twimpact.com 使用。我们必须每秒处理 50 到 1000 条消息。除了使用骆驼进行多节点处理外,它还用于将单个处理器上的工作分配给多个工作线程,以实现最佳性能。效果很好,但需要对如何处理拥塞有一定的了解。
评论
我们在几个项目中使用 Akka,其中最有趣的是与车祸维修有关。主要在英国,但现在扩展到美国、亚洲、大洋洲和欧洲。 我们使用参与者来确保实时提供碰撞维修信息,以实现安全且具有成本效益的车辆维修。
Akka 的问题实际上更多的是“你不能用 Akka 做什么”。它与强大的框架集成的能力、强大的抽象和所有容错方面使其成为一个非常全面的工具包。
评论
我正在尝试使用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 知识允许的范围内尽可能公平:-)
评论
我们使用 Akka 来异步处理 REST 调用 - 与传统的线程每用户请求模型相比,与异步 Web 服务器(基于 Netty)一起,我们可以将每个节点/服务器服务的用户数量提高 10 倍。
告诉你的老板,你的AWS托管账单将下降10倍,这是不费吹灰之力的!嘘。。。不过不要告诉亚马逊...... :)
评论
我们在口语对话系统(primetalk)中使用Akka。无论是内部还是外部。为了在单个群集节点上同时运行大量电话通道,显然需要一些多线程框架。Akka工作得很完美。我们之前有过关于java并发的噩梦。而对于 Akka,它就像一个秋千——它只是工作。坚固可靠。24*7,不间断。
在通道内,我们有并行处理的实时事件流。特别: - 冗长的自动语音识别 — 由演员完成; - 混合一些音频源(包括合成语音)的音频输出制作器; - 文本到语音转换是频道之间共享的一组单独的参与者; - 语义和知识处理。
为了实现复杂信号处理的互连,我们使用 SynapseGrid。它的好处是在复杂的执行组件系统中对 DataFlow 进行编译时检查。
您可以将 Akka 用于几种不同类型的事情。
我当时在一个网站上工作,在那里我将技术堆栈迁移到了 Scala 和 Akka。我们几乎将它用于网站上发生的所有事情。尽管您可能认为 Chat 示例很糟糕,但所有示例基本上都是一样的:
- 网站上的实时更新(例如浏览量、点赞等)
- 显示实时用户评论
- 通知服务
- 搜索和所有其他类型的服务
特别是实时更新很容易,因为它们归结为聊天示例。服务部分是另一个有趣的话题,因为你可以简单地选择使用远程参与者,即使你的应用程序没有集群,你也可以轻松地将其部署到不同的机器上。
我还将 Akka 用于 PCB 自动布线器应用,其想法是能够从笔记本电脑扩展到数据中心。你给它的力量越大,结果就会越好。如果您尝试使用通常的并发性,这将非常难以实现,因为 Akka 还为您提供了位置透明度。
目前,作为一个空闲时间的项目,我正在构建一个仅使用actor的Web框架。同样,好处是从单台机器到整个机器集群的可伸缩性。此外,使用消息驱动的方法使您的软件服务从一开始就面向。你有所有这些很好的组件,彼此交谈,但不一定彼此认识,生活在同一台机器上,甚至不在同一个数据中心。
自从Google Reader关闭后,我开始使用RSS阅读器,当然使用Akka。对我来说,这一切都是关于封装服务的。总而言之:actor 模型本身是你应该首先采用的,而 Akka 是一个非常可靠的框架,可以帮助你实现它,并在此过程中获得很多好处。
评论