Akka的libs和模块概述

官方链接

总结

这一章有点问题,很多概念不了解,等以后深入学习后再重新思考,也会对使用到的模块写更详细的使用经验,以及更多的底层挖掘.目前个人觉得比较基础的先使用核心库,到牵扯到集群后需要去了解一下通信的库,之后对Kafka的引入可能了解怎么集成中间件,因为Reactive编程的流行,对于Stream相关操作也要做一些了解(类似于webFlux,vert.x).

概述    

    在深入研究一些关于码actor的最佳实践之前,我们应该先预览一下Akka 最常用的的libs.这将帮助我们怎么在自己系统中使用这些功能.Akka是一个 开源的软件(OpenSource Software OSS) Lightbend 赞助Akka的开发,可以通过商业模式帮助我们,比如培训,咨询,企业能力-一个完成的工具集来管理Akka

下面是Akka OSS的一些功能:

         Actor library,Remoting,Cluster,Cluster Sharding,Cluster Singleton,Persistence,Projections,Distributed Data,Streams,Alpakka,HTTP,gRPC, Other Akka modules

通过 lightbend 平台订阅,你可以使用 Akka de 增强功能:

Akka Resilience Enhancements:

  • Configuration Checker — 检查潜在的配置问题并且记录一些建议
  • Diagnostics Recorder — 以一种格式捕获配置和系统信息,让我们在生产和开发阶段更容易定位问题.
  • Thread Starvation Detector — 监控Akka系统调度并且当没反应的时候记录警告
  • Fast Failover — 快速的集群分片故障切换.

Akka Persistence Enhancements:

  • GDPR for Akka Persistence — Data shredding 可以"忘记"事件中的数据.

Actor library

<properties>

  <scala.binary.version>2.13</scala.binary.version>

</properties>

<dependencyManagement>

  <dependencies>

    <dependency>

      <groupId>com.typesafe.akka</groupId>

      <artifactId>akka-bom_${scala.binary.version}</artifactId>

      <version>2.6.15</version>

      <type>pom</type>

      <scope>import</scope>

    </dependency>

  </dependencies>

</dependencyManagement>

<dependencies>

  <dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-actor-typed_${scala.binary.version}</artifactId>

  </dependency>

</dependencies>

          akka-actor-typed 是Akka library的核心,但是Actor在整个Akka库中都被用到,提供一个一致的,集成的模型来减轻我们在解决并发挥或者分布式系统设计中的一些挑战.鸟瞰来看,actors是一个把封装(OOP的核心之一)发挥到极致的编程范式(programming paradigm).不像对象的封装,Actor的封装不仅封装状态也封装了它的执行.Actors之间的通信不是通过方法而是通过传递消息.这种改变看起来很小,但是它能够在并发和远程通信上打破OOP的局限性.Actors模型是一个从基层处理并行和分布式的模型而不是临时的(ad hoc patched)把这些特性在OOP中打补丁.

actors解决的挑战包括:

  • 如果创建并且设计高性能,并发的应用
  • 如果在多线程环境处理错误
  • 如何让我的项目远离并发危害的影响.

Remoting

<dependencies>

  <dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-remote_${scala.binary.version}</artifactId>

  </dependency>

Remoting能够让actors在不同的电脑上运行并且能互相交换消息.虽然如同一个Jar被发布,Remoting更像一个模块而不是作为一个库.我们通过配置启用他,他只有一些APIs.由于actor模型,一个远程和一个本地的消息发送看起来完全一样.这个模式让我们使用在本地的系统可以直接转换到远程系统.你将很少的直接使用Remoting,试试它在一个集群子系统被创建时提供了基础.

Remoting解决的挑战:

  • 如何与运行在远程主机的actor系统通信
  • 如何和远程actor系统中的个别actor通信
  • 如何把消息转换成字节
  • 如何在主机之间管理低级别,网络连接(以及重连),检测崩溃的actor系统和主机,这些都是透明的.
  • 如何在相同网络里不相关的actor集合进行多路通信(multiplex communications),这些也是透明的。

Cluster

<dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-cluster-typed_${scala.binary.version}</artifactId>

</dependency>

       如果你又一个actor集合 来协助解决一些商业问题,你可能想要有纪律的管理这些系统集合.Remoting解决了远程系统组件之间的通信问题,Clustering通过一个成员协议让你给你能把这些系统组织在一个"元系统"里.大多数情况下,你想要使用Cluster 模块而不是直接使用Remoting.Clustering在Remoting的基础上提供了额外的服务集合,这是大多俗话现实世界应用需要的.

Cluster模块解决的一些挑战:

  • 如何维护一个actor系统集合(一个集群),彼此之间可以互相通信并且把彼此当作集群的一部分.
  • 如何给一个已经存在的成员引入一个安全的新系统.
  • 如何可靠的检测暂时不可达的系统
  • 如何删除已经挂掉的 主机/系统(或者缩减系统),所有剩下的成员在集群的剩余子集中继续工作(agree on).
  • 如何分配计算给当前成员集合
  • 如何给集群中的成员指定一个角色,换言之,提供确定的服务而不是其他的.

Cluster Sharding

<dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-cluster-singleton_${scala.binary.version}</artifactId>

</dependency>

分片帮助我们解决在Akka集群中的成员中给部分actor集合下发任务的问题.分片是一个模式,最常用的场景是一个大量的持久化元素集合(由actor支持)发送给集群的成员时保持平衡,当成员离开或者崩溃了它也能迁移他们去另一个节点.

解决的挑战:

  • 如何在一个系统的集合上建模和横向扩展一个巨大的有状态实体的集合.
  • 如何确保集群中的实体分布正确,因此在机器之间是负载均衡的.
  • 如何确保从宕掉的系统中迁移出来的实体不丢掉状态.
  • 如何确保一个实体不会同时存在在多个系统中并且因此保证一致性.

Cluster Singleton

<dependency>

        <groupId>com.typesafe.akka</groupId>

        <artifactId>akka-cluster-singleton_${scala.binary.version}</artifactId>

</dependency>

在分布式系统中的一个普通的用例是有个单一的实体来响应给定的任务,这个任务是在集群中的其他成员中共享的并且当主机系统挂掉了还会迁移.这不可否认的给整个集群引入了一个共同的瓶颈-限制了伸缩,这是在使用这种模式的时候不可避免的地方.Clster singleton允许一个集群选择一个actor系统来承载一个特殊的actor,这样其它系统总是可以从它在的地方独立访问所述服务.

解决的挑战:

  • 如何确保只有一个服务的实例跑在整个集群中
  • 如何确保服务是启动的即使系统的宿主在缩减的过程中崩溃或者关机了.
  • 如何从集群中的任何成员中访问这个实例,它可以随时迁移到其他系统.

Persistence

<dependency>

        <groupId>com.typesafe.akka</groupId>

        <artifactId>akka-persistence-typed_${scala.binary.version}</artifactId>

</dependency>
就如同面向对象中的对象,Actor也是在内存中保持状态的.一旦系统挂掉了,所有的在内存中的数据就会丢失.Persistence提供了一个模式能够让actors持久化让他们到当前的状态的事件.启动后,事件可以重放,可以恢复actor中实体的状态.这个事件流可以被查询并且投给其他的处理管道(比如一个外部的大数据集群)或者一个备用视图(比如reports)

应对了下列挑战:

  • 如何在系统重启或者奔溃后恢复实体/actor的状态
  • 如何实现一个CQRS(Command Query Responsibility Segregation)系统
  • 如何确保消息的分发是可信的 当面对网络错误或者系统崩溃
  • 如何内省导致实体变为当前状态的领域事件.
  • 如何在项目持续进步中,引入事件驱动(event Sourcing)来维持长运进程

Projections

 <dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-projection-core_${scala.binary.version}</artifactId>

  </dependency>

Projections提供了简单的APi来消费事件的流,用来投影到各种下游选项.API仅提供了核心依赖

不同的soure以及sink的实现需要其他提供者依赖.

Projections解决的挑战:

  • 在事件流上构建备用的或者聚合的视图(alternate or aggregate views).
  • 传播一个事件流朝一个其他的下游媒介 比如Kafka topic.
  • 一个简单的方法在事件驱动和CQRS系统上建立read-side投影.

Distributed Data

<dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-cluster-typed_${scala.binary.version}</artifactId>

  </dependency>

当最终一致性可以接受的情况下,可以在Akka集群之间共享数据,同时接收读和写的事件在面对集群分区的.这个的实现通过 CRDTs(conflict Free Replicated Data Types),在并发的写入不同的节点,并且在之后用可预测的方式合并.Distributed Data 模块体统了基础设施去分享数据和一个有用的数据类型.

Distributed Data 意图去解决下面的挑战:

  • 在面对集群分区的时候如何接受写的事件
  • 如何共享数据同时保证低延迟的本地读写访问

Streams

<dependency>

    <groupId>com.typesafe.akka</groupId>

    <artifactId>akka-cluster-typed_${scala.binary.version}</artifactId>

  </dependency>

Actor是一个以并行性为基础的模型,但是这儿有一些常见的模式需要人们一遍又一遍的实现.一种很常见的情况,actors的链或者图需要处理一个潜在的巨大或者无限的顺序事件流,正确的资源使用是快的处理阶段不会让慢的处理阶段应接不暇. Streams在actors上提供了一个高级别的抽象,简化了比如处理网络的一些代码编写,在后台处理所有的细节并且提供安全的,类型化的可组合的变成模型.Streams 也是Reactive Streams starndard的实现,允许整合所有按照这个标准的第三方实现.

Streams解决的挑战:

  • 如何高性能的处理事件或者大数据集的流,利用并发保持高资源利用率.
  • 如何把重复的事件/数据片段组装到有弹性的管道中.
  • 如何在好性能的情况下使用一个简便的方法连接异步的服务
  • 如何提供或者使用兼容第三方库的 Reactive Streams接口.

Alpakka

Alpakka是一个从Akka独立的模块.

ta是一个模块的集合,基于 Streams API 建立,用来提供 Reactive Stream 连机器的实现,这样能够对接各种各样的云和基础设施领域的技术.

详细overview页面

解决的问题:

  • 基于Stream,用来链接各种基础设施或者持久化组件
  • 以符合Reactive Streams API的方式连接保留系统(legacy systems).

HTTP

Akka Http 也是一个独立的模块。

HTTP是实际上提供标准给远程API,内部或者外部.Akka提供一个库用来构建或者消费HTTP服务.通过提供一个工具集来创建HTTP服务(并且服务他们),也可以用一个客户端来消费其他服务.这些工具特别合适使用Akka Streams 流入流出大的数据的集合或者实时的事件.

Http应付的挑战:

  • 如何暴漏系统的服务或者集群给外部世界,使用一种由HTTP API提供的高效方法
  • 如何通过HTTP将大数据集流入或者流出系统
  • 如何通过HTTP将实时事件流入或者流出系统

gRPC

Akka gRPC 也是一个独立的模块。

这个库提供了一个gRPC的实现并且它与HTTP和Streams模块集成的很好.它有通过 protobuf服务定义生成客户端和服务端的能力,然后通过Akka HTTP暴露,通过Streams来处理.

一些gRPC应付的问题:

  • 通过gRPC和protobuf的有点暴漏服务
  • 架构优先契约(Schema-first contract)
  • 支持架构演进
  • 高效的二进制协议
  • 对于流式编程的支持
  • 广泛的操作性
  • Http2.0的使用,连接复用

模块使用的例子

Akka可以无缝的整合模块.举个例子, 想象一下有一大堆有状态的BO(business objects),比如文档或者购物卡,网站用户可以访问.如果你用Sharding喝Persistence把他们建模成分片实体,他们可以按照你的需求来扩展,并且在集群中进行平衡.他们将在一些广告宣传或者假期前访问量比较大的时候保持有效,甚至在有些系统崩溃了也能运行.你可以通过Peersistence Query 获取实时的领域事件的流,并且使用Streams将他们引入流式快速引擎.然后,将引擎的输出作为Stream,通过Akka Streams操作符来操作他们,并且如同web socket 连接服务一样暴漏他,这些服务通过负载均衡的HTTP服务集合托管在你得集群上 来为你的实时商业分析工具提供能量.


 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FantasyBaby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值