在深刻研究编写Actor的一些最佳实践以前,先预览一下最经常使用的Akka库会颇有帮助。这将帮助您开始考虑要在系统中使用的功能。全部核心Akka功能均可以做为开源软件(OSS)使用。Lightbend赞助了Akka开发,但也能够为您提供培训,咨询,支持和Enterprise Suite 等商业产品,这是一套管理Akka系统的综合工具。html
Akka OSS包含如下功能,将在本页后面介绍:编程
使用Lightbend订阅,您能够在生产中使用Enterprise Suite ,包括如下对Akka核心功能的扩展:安全
此页面未列出全部可用模块,但概述了主要功能,并让您了解在Akka上开始构建系统时能够达到的复杂程度。服务器
核心Akka库是akka-actor,在Akka库中使用了actor,提供了一致的集成模型,使您没法单独解决并发或分布式系统设计中出现的挑战。Actor是一种编程范式,它将封装(OOP的支柱之一)带到极致。与对象不一样,actor不只封装了它们的状态,还封装了它们的执行。与actor的通讯不是经过方法调用,而是经过传递消息。虽然这种差别可能看起来很小,但实际上它容许咱们在并发和远程通讯方面打破OOP的限制。若是这个描述感受过高而没法彻底掌握,请不要担忧,在下一章中咱们将详细解释Actor。目前,重要的一点是,这是一个处理基本级别的并发和分发的模型,而不是将这些功能引入OOP的临时修补尝试。网络
Actor解决的挑战包括:多线程
远程处理使位于不一样计算机上的Actor可以无缝地交换消息。虽然做为JAR包分发,但Remoting比模块库更像模块。您主要使用配置启用它,它只有几个API。因为actor模型,远程和本地消息发送看起来彻底相同。您在本地系统上使用的模式直接转换为远程系统。您不多须要直接使用Remoting,但它提供了构建Cluster子系统的基础。并发
远程解决的挑战包括如下内容:负载均衡
若是您有一组合做解决某些业务问题的actor系统,那么您可能但愿以一种规范的方式管理这些系统。虽然Remoting解决了与远程系统组件进行寻址和通讯的问题,但Clustering使您可以将这些组织成一个由成员协议捆绑在一块儿的“元系统”。在大多数状况下,您但愿使用群集模块而不是直接使用远程处理。群集在远程处理之上提供了一组额外的服务,这是大多数实际应用程序所须要的。异步
Cluster模块解决的挑战包括如下内容:分布式
分片有助于解决在Akka集群成员之间分配一组Actor的问题。Sharding是一种主要与Persistence一块儿使用的模式,用于平衡大量持久性实体(由actor支持)到集群成员,并在成员崩溃或离开时将它们迁移到其余节点。
Sharding解决的挑战包括:
分布式系统中常见的(实际上有点常见)用例是让一个实体负责给定任务,该任务在集群的其余成员之间共享,并在主机系统出现故障时进行迁移。虽然这无能否认地引入了限制扩展的整个集群的共同瓶颈,可是有些状况下使用这种模式是不可避免的。群集单例容许群集选择将托管特定actor的actor系统,而其余系统始终能够独立于其所在位置访问所述服务。
Singleton模块可用于解决这些挑战:
对于系统之间的协调,一般须要将消息分发到群集中的一组感兴趣系统的全部或一个系统。这种模式一般称为发布 - 订阅,该模块解决了这个问题。能够向主题的全部订户广播消息或者向表示感兴趣的任意玩家发送消息。
Cluster Publish-Subscribe旨在解决如下挑战:
就像OOP中的对象同样,actor会将它们的状态保存在易失性内存中。一旦系统关闭,正常或因为崩溃,内存中的全部数据都将丢失。持久性提供模式以使Actor可以持续致使其当前状态的事件。启动时,能够重播事件以恢复由actor主持的实体的状态。能够查询事件流并将其输入其余处理管道(例如,外部大数据集群)或备用视图(如报告)。
Persistence应对如下挑战:
Actor是并发的基本模型,但有一些常见的模式,它们的使用要求用户反复实现相同的模式。很是常见的状况是,Actor的链或图须要处理潜在的大型或无限的顺序事件流并正确协调资源使用,以便更快的处理阶段不会压倒链或图中较慢的处理阶段。Streams在actor之上提供了更高级别的抽象,简化了编写这样的处理网络,处理后台全部精细细节并提供安全,类型化,可组合的编程模型。Streams也是Reactive Streams标准的实现,它能够与该标准的全部第三方实现集成。
Streams能够解决如下的问题:
在最终一致性可接受的状况下,能够在Akka群集中的节点之间共享数据,而且即便面对群集分区也能够接受读取和写入。这可使用无冲突复制数据类型(CRDT)来实现,其中不一样节点上的写入能够同时发生而且以后以可预测的方式合并。分布式数据模块提供了共享数据和许多有用数据类型的基础结构。
Distributed Data旨在解决如下挑战:
Akka HTTP是Akka的独立模块。
远程,内部或外部提供API的事实标准是HTTP。Akka提供了一个库,用于构建或使用此类HTTP服务,方法是提供一组工具来建立HTTP服务(并提供服务)和一个可用于使用其余服务的客户端。这些工具特别适合经过利用Akka Streams的底层模型来流入和流出大量数据或实时事件。
HTTP模块解决的一些挑战:
Akka模块无缝集成在一块儿。例如,考虑网站用户访问的大量有状态业务对象,例如文档或购物车。若是使用分片和持久性将它们建模为分片实体,它们将在群集中平衡,您能够按需扩展。它们将在来自广告活动的峰值期间或在假期处理以前提供,即便某些系统崩溃也是如此。您还可使用持久性查询获取域事件的实时流,并使用Streams将它们传输到流式快速数据引擎。而后,将该引擎的输出做为Stream,使用Akka Streams运算符对其进行操做,并将其做为由群集托管的负载均衡的HTTP服务器集提供的Web套接字链接公开,以支持您的实时业务分析工具。
咱们但愿此文档引发您的兴趣!下一个主题介绍了咱们将在本指南的教程部分中构建的示例应用程序。
原文:https://doc.akka.io/docs/akka/current/guide/modules.html
有什么讨论的内容,能够加我公众号: