【AKKA 官方文档翻译】akka库和模块概览

来源:互联网 发布:ip与mac绑定怎么设置 编辑:程序博客网 时间:2024/05/19 19:15

akka库和模块概览

akka版本2.5.8
版权声明:本文为博主原创文章,未经博主允许不得转载。

在深入研究编写actor的一些最佳实践之前,预览一下akka最常用的库将会很有帮助。这将会帮助你开始考虑你要在系统中实用的功能。所有akka的核心功能都能以开源软件(OSS)方式获取。Lightbend赞助akka的开发,你也可以通过其获得商业支持,如培训,咨询,支持和企业套件-用于管理akka系统的全套工具。

Akka OSS包含以下功能,稍后会在本篇介绍:

1、actor库
2、远程处理
3、集群
4、集群分片
5、集群单例
6、集群发布-订阅
7、持久化
8、分布式数据
9、HTTP

借助Lightbend订阅,您可以在生产环境中使用Enterprise Suite。企业套件包括以下Akka核心功能的扩展:

Split Brain Resolver — Detects and recovers from network partitions, eliminating data inconsistencies and possible downtime.

Configuration Checker — Checks for potential configuration issues and logs suggestions.

Diagnostics Recorder — Captures configuration and system information in a format that makes it easy to troubleshoot issues during development and production.

Thread Starvation Detector — Monitors an Akka system dispatcher and logs warnings if it becomes unresponsive.

本文并未列出所有akka的可用模块,但概述了主要功能,并让你了解在Akka之上构建系统时可以达到的复杂程度。

Actor库

Akka的核心库是akka-actor。但是actor被用在整个akka库中,提供了一个一致的、集成的模型,它可以帮你解决一些在构建并发或者分布式系统时遇到的挑战。从整体来看,actor是一种具有封装的编程模式(封装是OOP的核心),actor把封装发挥到了极致。与对象不同,actor不仅封装了内部状态,而且封装了执行过程。与actor进行交流不是通过方法调用,而是通过消息传递。这些区别可能看起来很小,但是它真正解决了我们在并发和远程通信时使用OOP编程遇到的限制。不要被这个描述吓到了,下一章我们将详细介绍actor。现在,重要的一点是,actor是一个可以合理地处理并发和分布式的方法,而不是特别为OOP编程打的一个补丁。

Actor解决了以下挑战:

1、如何构建和设计高性能的并发应用
2、如何处理多线程环境中的错误
3、如何防止并发的缺陷

远程处理(Remoting)

Remoting允许actor分布在不同的计算机上,并且能和单机一样互相传递消息。使用jar文件进行分布式分发时,Remoting更像一个模块而不是一个库。你可以主要通过配置来启动它,并且它只有几个API。多亏了actor模型,使我们在发送远程消息时的操作和本地消息传递是完全一致的。你在本地系统上使用的模式可以直接用在远程系统上。你很少会直接使用Remoting,但它为构建集群子系统提供了基础。

Remoting解决了以下挑战:

1、如何联系在远程主机上的actor系统
2、如何联系远程actor系统上的一个actor
3、如何把消息转换成线路上的字节
4、如何管理低级别的主机间的网络连接(重连接)、检测actor系统和主机的崩溃,这些对操作者都是透明的
5、如何多路复用来自同一网络连接上不同的actor通信

集群(Cluster)

如果你有一套协作的actor系统来帮你解决一些业务问题,那么你应该会想要用一种严谨的方式来管理它们。Remoting帮你解决了与远程系统的连接、通信的问题,而Clustering会为你提供能力,让你通过成员协议把这些系统组织在一起。在大多是情况下,你希望使用Cluster模块而不是直接使用Remoting。Clustering在Remoting之上,提供了额外的一些服务,这些服务是现实应用程序所需要的。

Cluster模块解决了以下挑战:

1、如何维护一组可以互相通信的actor系统(一个集群),并将其视为集群的一部分
2、如何安全地向一组存在的系统里加入一个新的actor系统
3、如何可靠地检测到一个系统暂时无法被访问
4、如何删除失败的主机/系统(或缩小(scale down)系统),让集群剩余的成员仍然可以互相协作
5、如何在当前成员间分配计算工作
6、如何给一个成员指定一个角色。换句话说,这个成员要执行A服务而不是B服务。

集群分片(Cluster Sharding)

Sharding帮助我们解决在akka集群中如何把一组actor分配下去的问题。Sharding是一种模式,它经常会与Persistence配合使用,来平衡将要发送给集群成员的大量持久化元素(由actor支持的),并当集群成员崩溃或离开时转移到其他节点。

Sharding解决了以下挑战:

1、如何在一组系统上建模和扩展一大组状态实体
2、如何确保集群中的实体正确分布,以使各个机器间保持负载均衡
3、如何确保从崩溃的系统中迁移实体而不会丢失状态
4、如何确保一个实体同时不会同时在多个系统上存在,从而保持一致性

集群单例(Cluster Singleton)

在分布式系统中常见的(实际上非常常见)做法是把一个实体分配给一个任务,这个任务为集群中的其他成员所共享,当主机系统出现故障时将其迁移。不可否认这给整个集群的扩展带来了共同的瓶颈,但是在使用这个模式时,这些场景是不可避免的。Cluster singleton允许集群去选择一个actor系统来部署一个特别的actor,这样集群中其他的系统就总是能在其系统内独立地访问这个部署的actor。

Singleton模块解决了以下挑战:

1、如何确保整个集群中只有一个服务实例正在运行
2、当系统主机崩溃、或在缩小集群(scaling down)时被停机,如何确保服务的可用
3、假设这个服务可以随时迁移到其他系统,如何保证集群中的任何成员都可以访问该实例

集群发布-订阅

为了协调系统内成员,经常会需要分发消息给所有成员,或者集群内一组感兴趣的成员。这种模式通常被称为发布-订阅模式,本模块解决了这个特定问题。本模块支持将一个主题的消息广播给所有订阅者,或者将消息发送给任意感兴趣的actor。

集群发布 - 订阅旨在解决以下挑战:

如何将消息广播给群集中感兴趣的一组actor。
如何将消息发送给群集中感兴趣的一组成员。
如何订阅和取消订阅集群中某个主题的事件。

持久化

就像OOP里的对象一样,actor在内存中保持着它们的状态。一旦系统因为正常停止或者崩溃而导致停机,所有在内存中的数据都将丢失。持久化模块提供了可以让actor对其内部状态事件进行持久化的模式,在启动之后,这些事件可以被重现并且恢复actor的内部状态。这个事件流可以被查询并且被放入其他的处理管道(例如外部大数据集群)里或备用视图(如报告)里。

持久化模块旨在解决以下挑战:

1、如何在系统重启或崩溃时恢复实体/actor的状态
2、如何实现一个CQRS系统
3、在面对网络错误和系统崩溃时,如何确保消息分发可靠
4、如何产生领域事件,以便使用它恢复当前状态
5、在项目不断发展的过程中,如何在我的应用程序中使用事件驱动机制来支撑长时间运行的进程

分布式数据

在接受最终一致性的系统里,可以在akka集群中的节点之间共享数据,即使在集群分片的情况下也可以允许读写操作。这可以通过使用Conflict Free Replicated Data Types (CRDTs)来实现,可以并行地在不同节点进行写入,并在之后以可预测的方式合并。分布式数据模块提供了共享数据的方式,也提供了一下有用的数据类型。

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

1、在集群分片的情况下如何写入数据
2、如何共享数据,同时确保低延迟的本地读写访问

Actor是并发的一个基本模型,但是有些公共的模式,需要使用者在使用的时候一次又一次地去实现它们。一种非常常见的场景,actor的链或图可能需要处理巨大的或无限的流序列事件,并且合理地协调资源使用,以便在处理时,较快的处理阶段不会使链或图中的较慢的处理阶段不堪重负。流模块提供了一个在actor模型之上的更高层抽象,简化了一些代码编写(如处理网络、处理所有后台细节)并提供了安全、类型化的可组合编程模型。流模块也是Reactive Streams标准的一个实现,允许和所有其他第三方实现集成在一起。

流模块解决了以下挑战:

1、如何高性能地处理事件流或大型数据集,充分利用并发行并保持资源利用率
2、如何将可重复使用的事件/数据处理组合成灵活的管道
3、如何以一种灵活的方式将异步服务连接在一起,并且拥有良好的性能
4、如何提供与Reactive Streams兼容的接口,如何使用实现了Reactive Streams的第三方库的接口

HTTP

HTTP是提供内部或外部远程API的事实标准,akka提供了一些创建HTTP服务的工具(并服务于它们),也提供了一个可使用其他服务的客户端,让我们可以构建或使用这些HTTP服务,这些工具特别适合于,利用Akka Stream模块里的基础模块来流入流出大量数据,和实时事件。

HTTP模块处理的一些挑战:

1、如何以高性能的方式通过HTTP API将系统或集群的服务公开给外部世界
2、如何使用HTTP将大数据集流入和流入系统
3、如何使用HTTP将系统中的实时事件流入和流出系统

模块使用实例

Akka中各个模块无缝整合在一起。例如,考虑网站用户访问的一大组有状态的业务对象,如文档或购物车。如果使用Sharding和Persistence对这些分片进行建模,则它们将在可以按需扩展的集群中进行平衡。即使因为一些因素产生的高峰流量下,它们也可以顺利地运行,甚至当某些系统崩溃时仍可提供服务。您还可以使用Persistence Query轻松获取实时的域事件流,并使用Streams将其导入流式快速数据引擎。之后,将该引擎的输出视为Stream,使用Akka Streams操作符对其进行操作,并将其暴露为由集群托管的负载均衡HTTP服务器集合提供的Web套接字连接,以便为您的实时业务分析工具提供支持。

我们希望这个概览引起了你的兴趣!下一个主题将介绍一些示例应用程序。

原创粉丝点击