Akka的好用例
我听说过很多关于Akka框架(Java / Scala服务平台)的言论,但是到目前为止还没有看到很多用例的实例。 所以我会有兴趣听到开发人员使用它的事情。
只有一个限制:请不要包括编写聊天服务器的情况。 (为什么?因为这已被过度使用作为很多类似的事情的例子)
我已经非常成功地在两个真正的项目中使用了它。 两者都在近实时交通信息领域(高速公路上的车辆交通),分布在多个节点上,在多方之间集成消息,可靠的后端系统。 我不能自由地给客户提供具体细节,当我确定的时候也许它可以作为参考添加。
虽然我们是在0.7版本的时候开始的,但Akka真的完成了这些项目。 (我们正在使用scala)
其中一个重要的优点是你可以很容易地从演员和消息中组成一个系统,而且几乎不用花样板,它的缩放非常好,而且不需要手动滚动的线程的复杂性,你几乎可以免费地在对象之间传递asynchronous消息。
对任何types的asynchronous消息处理进行build模是非常好的。 我宁愿写这种风格的任何types的(networking)服务系统比任何其他风格。 (你有没有试过用JAX-WS编写一个asynchronous的Web服务(服务器端)?这是很多的pipe道)。 所以我会说任何不想挂在其中一个组件上的系统,因为一切都是用同步方法隐式调用的,而且一个组件是locking某些东西的。 这是非常稳定的,让崩溃+监督失败的解决scheme真的很好。 一切都很容易以编程方式进行设置,并不难于unit testing。
然后是优秀的附加模块。 Camel模块非常适合Akka,可以通过可configuration的terminal轻松开发asynchronous服务。
我对这个框架非常满意,它正在成为我们构build的连接系统的事实标准。
免责声明:我是Akka的采购订单
除了提供一个简单得多的并发smorgasbord,并以STM的forms获得正确的(actors,agents,dataflow concurrency)和并发控制。
以下是您可能会考虑的一些使用案例:
- 交易处理(在线游戏,金融,统计,博彩,社交媒体,电信等)
- 扩展,扩展,容错/ HA
- 服务后端(任何行业,任何应用程序)
- 服务REST,SOAP,cometd等
- 充当消息集线器/集成层
- 扩展,扩展,容错/ HA
- pipe理单元并发/并行(任何应用程序)
- 正确
- 简单的工作和理解
- 只需将jar添加到现有的JVM项目(使用Scala,Java,Groovy或JRuby)
- 批处理(任何行业)
- 骆驼集成与批处理数据源挂钩
- 行动者分批处理批量工作量
- 通讯枢纽(电信,networking媒体,手机媒体)
- 扩展,扩展,容错/ HA
- 游戏服务器(在线游戏,投注)
- 扩展,扩展,容错/ HA
- BI / datamining /通用计算
- 扩展,扩展,容错/ HA
- 在这里插入其他好用例
我们如何使用它的一个例子就是借记卡/信用卡交易的优先队列。 我们有数以百万计这些工作的努力取决于inputstringtypes。 如果事务types是CHECK,那么我们的处理很less,但是如果它是一个销售点,那么还有很多事情要做,比如合并元数据(类别,标签,标签等)并提供服务(电子邮件/短信提醒,欺诈检测,资金平衡低等)。 基于inputtypes,我们组成了处理作业所需的各种特征(称为混合类)的类,然后执行工作。 所有这些工作都来自不同金融机构的实时模式。 一旦数据被清理,它将被发送到不同的数据存储区以进行持久化,分析,或推送到套接字连接,或者提升彗星演员。 工作人员不断自我负载平衡工作,以便我们可以尽可能快地处理数据。 我们还可以捕获额外的服务,持久性模型,以及关键的决策点。
在JVM上传递的Erlang OTPtypes的消息为开发实时系统提供了一个很好的系统,可以在现有的库和应用程序服务器上运行。
阿卡允许你做消息传递,就像你在传统的esb,但速度! 它还为您提供了框架中的工具来pipe理您的解决scheme所需的大量参与者池,远程节点和容错。
我们使用Akkaasynchronous处理REST调用 – 与asynchronousweb服务器(基于Netty的)一起,与传统的按用户请求模式的线程相比,我们可以使每个节点/服务器的用户数量提高10倍。
告诉你的老板,你的AWS托pipe账单将下降10倍,这是一个明智之举! 嘘…不要告诉它到亚马逊虽然… 🙂
如果你将聊天服务器提取一个级别,那么你会得到答案。
Akka提供了一个类似于Erlang的“让它崩溃”的信息系统。
所以例子是需要不同级别的消息传递的持久性和可靠性的事情:
- 聊天服务器
- networking层的MMO
- 财务数据泵
- iPhone /手机/任何应用程序的通知系统
- REST服务器
- 也许类似于WebMachine(猜测)
关于Akka的好处是它提供的持久性的select,它是STM的实现,REST服务器和容错。
不要被聊天服务器的例子搞混了,把它看作是某种解决scheme的一个例子。
有了他们所有的优秀文档,我觉得差距就是这个确切的问题,用例和例子。 牢记这些例子是不平凡的。
(只写video和播放源代码的经验,我没有实施任何使用akka。)
我们在大规模的Telco项目中使用Akka(不幸的是我不能透露很多细节)。 Akka演员由Web应用程序远程部署和访问。 通过这种方式,我们有一个基于Google protobuffer的简化RPC模型,我们使用Akka Futures实现了并行性。 到目前为止,这个模式已经非常出色。 一个注意:我们正在使用Java API。
我们在工作中的几个项目中使用Akka,其中最有趣的是与车辆碰撞修理有关。 主要在英国,但现在扩展到美国,亚洲,澳大利亚和欧洲。 我们使用演员来确保实时提供碰撞修理信息,以实现对车辆的安全和成本效益的修理。
阿卡的问题实际上更多的是“阿卡不能做什么”。 它与强大的框架集成的能力,强大的抽象以及所有的容错方面使其成为一个非常全面的工具包。
你可以使用阿卡几种不同的东西。
我正在一个网站上工作,在那里我把技术栈迁移到了Scala和Akka。 我们几乎用了网站上发生的一切。 尽pipe你可能认为一个聊天的例子不好,但基本上都是一样的:
- 在网站上的实时更新(如观点,喜欢…)
- 显示活的用户评论
- 通知服务
- search和所有其他types的服务
特别是实时更新很容易,因为它们归结为一个聊天的例子。 服务部分是另一个有趣的话题,因为您可以简单地select使用远程参与者,即使您的应用程序没有群集,也可以轻松地将其部署到不同的计算机。
我也使用Akka作为PCB自动布线应用程序,可以从笔记本电脑扩展到数据中心。 你赋予的权力越大,结果就越好。 如果您尝试使用通常的并发性,这是非常难以实现的,因为Akka还为您提供位置透明度。
目前作为一个自由时间的项目,我只用演员build立一个web框架。 同样的好处是从单一机器到整个机器集群的可扩展性。 此外,使用消息驱动的方法使您的软件服务从一开始就面向您。 你拥有所有这些很好的组件,彼此交谈,但不一定彼此了解,生活在同一台机器上,甚至不在同一个数据中心。
而且由于谷歌阅读器closures,我开始使用RSS阅读器,当然使用阿卡。 这一切都是关于我封装的服务。 作为结论:演员模型本身就是你应该首先采用的,而Akka是一个非常可靠的框架,可以帮助你实现它,并带来很多好处。
我们正在使用阿卡与骆驼插件分发twimpact.com的分析和趋势处理。 我们必须每秒处理50到1000条消息。 除了使用骆驼进行多节点处理之外,它还可以将单个处理器上的工作分配给多个工作人员以实现最佳性能。 工作得很好,但需要对如何处理拥塞有所了解。
我正在尝试Akka(Java API)。 我所尝试的是将Akka的基于actor的并发模型与普通的Java并发模型(java.util.concurrent classes)进行比较。
用例是简单的规范映射,减less了字符数的实现。 数据集是随机生成的string(400个字符长度)的集合,并计算它们中的元音数量。
对于Akka,我使用了BalancedDispatcher(用于线程之间的负载均衡)和RoundRobinRouter(对我的函数actor保持限制)。 对于Java,我使用了简单的fork连接技术(实现了没有任何工作的偷窃algorithm),将fork / map执行和join结果。 中间结果是阻止排队,尽可能平行的join。 也许,如果我没有错,那就会模仿阿卡演员的“邮箱”概念,在那里他们收到消息。
观察:直到中等负载(~50000串input),结果是可比较的,在不同的迭代中略微变化。 但是,随着我将负载增加到〜100000,它将挂起Java解决scheme。 我在这种情况下用20-30个线程configuration了Java解决scheme,并且在所有迭代中都失败了。
将负荷增加到100万,对阿卡也是致命的。 我可以与任何有兴趣进行交叉检查的人分享代码。
所以对我来说,看起来Akka比传统的Javamultithreading解决scheme更好。 而可能的原因是Scala的魔力之下。
如果我可以将问题域build模为事件驱动的消息,那么我认为Akka是JVM的一个好select。
在以下版本上执行testing:Java版本:1.6 IDE:Eclipse 3.7 Windows Vista 32位。 3GB RAM。 英特尔酷睿i5处理器,2.5 GHz时钟速度
请注意,用于testing的问题域可以辩论,我尽可能公平的,因为我的Java知识允许:-)
我们在口语对话系统( primetalk )中使用Akka。 内部和外部。 为了在单个集群节点上同时运行很多电话通道,显然需要有一些multithreading框架。 阿卡作品完美。 我们有与java并发性的噩梦。 而阿卡它就像一个swing – 它只是工作。 坚固可靠。 24 * 7,不停。
在通道内部,我们有实时的并行处理事件stream。 特别是: – 冗长的自动语音识别 – 与演员完成; – audio输出制作者混合一些audio源(包括合成语音); – 文本到语音转换是通道之间共享的一组独立的angular色; – 语义和知识处理。
为了使复杂的信号处理互连,我们使用SynapseGrid 。 它具有在复杂的angular色系统中编译时检查DataFlow的好处。
我最近在Akka:Word count中实现了规范的map-reduce示例。 所以这是Akka的一个用例:更好的性能。 这更像是JRuby和Akka的演员的一个实验,而且它也表明Akka不仅仅是Scala或Java:它适用于JVM之上的所有语言。