Akka库和模块概述

在深入研究编写演员的一些最佳实践之前,预览最常用的Akka库会很有帮助。这将帮助您开始考虑要在系统中使用的功能。所有核心Akka功能都可以作为开源软件(OSS)使用。Lightbend赞助了Akka开发,但也可以为您提供培训,咨询,支持和Enterprise Suite商业产品,这是一套管理Akka系统的综合工具。

Akka OSS包含以下功能,将在本页后面介绍:

使用Lightbend订阅,您可以在生产中使用Enterprise Suite。Enterprise Suite包括以下对Akka核心功能的扩展:

此页面未列出所有可用模块,但概述了主要功能,并让您了解在Akka上开始构建系统时可以达到的复杂程度。

演员图书馆

SBTMaven的


1
2
3
4
5
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-actor_2.11</artifactId>
  <version>2.5.19</version>
</dependency>

摇篮

核心Akka图书馆是 

1
akka-actor

,但是整个Akka库使用了actor,提供了一致的集成模型,使您无法单独解决并发或分布式系统设计中出现的挑战。从鸟瞰角度来看,演员是一种编程范式,它将封装(OOP的支柱之一)带到极致。与对象不同,actor不仅封装了它们的状态,还封装了它们的执行。与actor的通信不是通过方法调用,而是通过传递消息。虽然这种差异可能看起来很小,但实际上它允许我们在并发和远程通信方面打破OOP的限制。如果这个描述感觉太高而无法完全掌握,请不要担心,在下一章中我们将详细解释演员。目前,

演员解决的挑战包括:

  • 如何构建和设计高性能的并发应用程序。
  • 如何在多线程环境中处理错误。
  • 如何保护我的项目免受并发性的困扰。

远程处理

SBTMaven的


1
2
3
4
5
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-remote_2.11</artifactId>
  <version>2.5.19</version>
</dependency>

摇篮

远程处理使位于不同计算机上的演员能够无缝地交换消息。虽然作为JAR工件分发,但Remoting比模块库更像模块。您主要使用配置启用它,它只有几个API。由于actor模型,远程和本地消息发送看起来完全相同。您在本地系统上使用的模式直接转换为远程系统。您很少需要直接使用Remoting,但它提供了构建Cluster子系统的基础。

远程解决的挑战包括以下内容:

  • 如何解决生活在远程主机上的actor系统。
  • 如何解决远程演员系统上的各个演员。
  • 如何将消息转换为线路上的字节。
  • 如何透明地管理主机之间的低级网络连接(和重新连接),检测崩溃的actor系统和主机。
  • 如何透明地在同一网络连接上复用来自不相关的一组参与者的通信。

SBTMaven的


1
2
3
4
5
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-cluster_2.11</artifactId>
  <version>2.5.19</version>
</dependency>

摇篮

如果您有一组合作解决某些业务问题的actor系统,那么您可能希望以一种规范的方式管理这些系统。虽然Remoting解决了与远程系统组件进行寻址和通信的问题,但Clustering使您能够将这些组织成一个由成员协议捆绑在一起的“元系统”。在大多数情况下,您希望使用群集模块而不是直接使用远程处理。群集在远程处理之上提供了一组额外的服务,这是大多数实际应用程序所需要的。

Cluster模块解决的挑战包括以下内容:

  • 如何维护一组可以相互通信并将彼此视为集群的一部分的actor系统(集群)。
  • 如何安全地将新系统引入现有成员集。
  • 如何可靠地检测暂时无法访问的系统。
  • 如何删除失败的主机/系统(或缩小系统),以便所有剩余成员就群集的剩余子集达成一致。
  • 如何在当前成员集之间分配计算。
  • 如何将群集成员指定为某个角色,换句话说,提供某些服务而不是其他服务。

群集分片

SBTMaven的


1
2
3
4
5
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-cluster-sharding_2.11</artifactId>
  <version>2.5.19</version>
</dependency>

摇篮

分片有助于解决在Akka集群成员之间分配一组演员的问题。Sharding是一种主要与Persistence一起使用的模式,用于平衡大量持久性实体(由actor支持)到集群成员,并在成员崩溃或离开时将它们迁移到其他节点。

Sharding解决的挑战包括:

  • 如何在一组系统上建模和扩展大量有状态实体。
  • 如何确保群集中的实体正确分布,以便在计算机之间正确平衡负载。
  • 如何确保从崩溃的系统迁移实体而不会丢失状态。
  • 如何确保实体不会同时存在于多个系统上,从而保持一致。

群集单身人士

SBTMaven的


1
2
3
4
5
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-cluster-singleton_2.11</artifactId>
  <version>2.5.19</version>
</dependency>

摇篮

分布式系统中的一个常见(实际上有点太常见)用例是让一个实体负责给定任务,该任务在集群的其他成员之间共享,并在主机系统出现故障时进行迁移。虽然这无可否认地引入了限制扩展的整个集群的共同瓶颈,但是有些情况下使用这种模式是不可避免的。群集单例允许群集选择将托管特定actor的actor系统,而其他系统始终可以独立于其所在位置访问所述服务。

Singleton模块可用于解决这些挑战:

  • 如何确保整个群集中只运行一个服务实例。
  • 即使托管它的系统当前在缩小过程中崩溃或关闭,如何确保服务已启动。
  • 如何从群集的任何成员到达此实例,假设它可以随时间迁移到其他系统。

群集发布 – 订阅

SBT


1
libraryDependencies += "com.typesafe.akka" %% "akka-cluster-tools" % "2.5.19"

Maven的摇篮

对于系统之间的协调,通常需要将消息分发到群集中的一组感兴趣系统的所有或一个系统。这种模式通常称为发布 – 订阅,该模块解决了这个问题。可以向主题的所有订户广播消息或者向表示感兴趣的任意玩家发送消息。

Cluster Publish-Subscribe旨在解决以下挑战:

  • 如何向群集中感兴趣的一方广播消息。
  • 如何从群集中感兴趣的一方向成员发送消息。
  • 如何订阅和取消订阅群集中某个主题的事件。

坚持

SBTMaven的


1
2
3
4
5
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-persistence_2.11</artifactId>
  <version>2.5.19</version>
</dependency>

摇篮

就像OOP中的对象一样,actor会将它们的状态保存在易失性内存中。一旦系统关闭,正常或由于崩溃,内存中的所有数据都将丢失。持久性提供模式以使参与者能够持续导致其当前状态的事件。启动时,可以重播事件以恢复由actor主持的实体的状态。可以查询事件流并将其输入其他处理管道(例如,外部大数据集群)或备用视图(如报告)。

坚持不懈地应对以下挑战:

  • 如何在系统重新启动或崩溃时恢复实体/ actor的状态。
  • 如何实施CQRS系统
  • 如何确保在网络错误和系统崩溃时可靠地传递消息。
  • 如何内省导致实体进入其当前状态的域事件。
  • 如何利用应用程序中的事件源来支持在项目不断发展的同时支持长时间运行的流程。

分布式数据

SBT


1
libraryDependencies += "com.typesafe.akka" %% "akka-distributed-data" % "2.5.19"

Maven的摇篮

在最终一致性可接受的情况下,可以在Akka群集中的节点之间共享数据,并且即使面对群集分区也可以接受读取和写入。这可以使用无冲突复制数据类型(CRDT)来实现,其中不同节点上的写入可以同时发生并且之后以可预测的方式合并。分布式数据模块提供了共享数据和许多有用数据类型的基础结构。

分布式数据旨在解决以下挑战:

  • 即使面对集群分区,如何接受写入。
  • 如何在共享数据的同时确保低延迟的本地读写访问。

SBT


1
libraryDependencies += "com.typesafe.akka" %% "akka-stream" % "2.5.19"

Maven的摇篮

Actor是并发的基本模型,但有一些常见的模式,它们的使用要求用户反复实现相同的模式。非常常见的情况是,参与者的链或图需要处理潜在的大型或无限的顺序事件流并正确协调资源使用,以便更快的处理阶段不会压倒链或图中较慢的处理阶段。Streams在actor之上提供了更高级别的抽象,简化了编写这样的处理网络,处理后台所有精细细节并提供安全,类型化,可组合的编程模型。Streams也是Reactive Streams标准的实现,它可以与该标准的所有第三方实现集成。

Streams解决了以下挑战:

  • 如何处理具有高性能的事件流或大型数据集,利用并发性并保持资源使用紧密。
  • 如何将可重用的事件/数据处理组件组装成灵活的管道。
  • 如何以高性能以灵活的方式将异步服务相互连接。
  • 如何提供或使用符合Reactive Streams标准的接口与第三方库进行交互。

HTTP

Akka HTTPAkka的独立模块。

远程,内部或外部提供API的事实标准是HTTP。Akka提供了一个库,用于构建或使用此类HTTP服务,方法是提供一组工具来创建HTTP服务(并提供服务)和一个可用于使用其他服务的客户端。这些工具特别适合通过利用Akka Streams的底层模型来流入和流出大量数据或实时事件。

HTTP解决的一些挑战:

  • 如何通过HTTP API以高效的方式将系统或集群的服务公开给外部世界。
  • 如何使用HTTP将大型数据集传入和传出系统。
  • 如何使用HTTP将实时事件传入和传出系统。

模块使用示例

Akka模块无缝集成在一起。例如,考虑网站用户访问的大量有状态业务对象,例如文档或购物车。如果使用分片和持久性将它们建模为分片实体,它们将在群集中平衡,您可以按需扩展。它们将在来自广告活动的峰值期间或在假期之前处理,即使某些系统崩溃。您还可以使用持久性查询获取域事件的实时流,并使用Streams将它们传输到流式快速数据引擎。然后,将该引擎的输出作为Stream,使用Akka Streams运算符对其进行操作,并将其作为由群集托管的负载均衡的HTTP服务器集提供的Web套接字连接公开,以支持您的实时业务分析工具。

我们希望此预览引起您的兴趣!下一个主题介绍了我们将在本指南的教程部分中构建的示例应用程序。

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注