THINGSBOARD

Actor 模型入门与Akka-SpringBoot集成

在当今的数据处理和数据流水线系统中,将数据从源流传输到接收器是一项非常琐碎的任务。因此,有许多[流媒体]解决方案,例如:KafkaStream,SparkStreaming,ApacheFlink等。Akka流在这场战斗中脱颖而出,并具有完全由应用程序驱动的优势。Akka流是在Akka著名的Actor模型(实际上是受Erlang的actor模型启发)的基础上构建的。因此,Akka流可以利用其经过战

在当今的数据处理和数据流水线系统中,将数据从源流传输到接收器是一项非常琐碎的任务。因此,有许多[流媒体]解决方案,例如:Kafka Stream,Spark Streaming,Apache Flink等。
Akka流在这场战斗中脱颖而出,并具有完全由应用程序驱动的优势。Akka流是在Akka著名的Actor模型(实际上是受Erlang的actor模型启发)的基础上构建的。因此,Akka流可以利用其经过战斗考验的弹性,弹性,事件驱动和响应能力。

Actor模型简介

Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成

  • 状态:Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题

  • 行为:行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态

  • 邮箱:邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息

Actor 模型及其说明

87aca100e99061430cba959733871af2.png

  1. Akka 处理并发的方法基于 Actor 模型。(示意图)

  2. 在基于 Actor 的系统里,所有的事物都是 Actor,就好像在面向对象设计里面所有的事物都是 对象一样。

  3. Actor 模型是作为一个并发模型设计和架构的。Actor 与 Actor 之间只能通过消息通信,如图 的信封

  4. Actor 与 Actor 之间只能用消息进行通信,当一个 Actor 给另外一个 Actor 发消息,消息是有 顺序的 (消息队列),只需要将消息投寄的相应的邮箱即可。

  5. 怎么处理消息是由接收消息的 Actor 决定的,发送消息 Actor 可以等待回复,也可以异步处理 【ajax】

  6. ActorSystem 的职责是负责创建并管理其创建的 Actor, ActorSystem 是单例的 (可以 ActorSystem 是一个工厂,专门创建 Actor),一个 JVM 进程中有一个即可,而 Acotr 是可以有多个的。

  7. Actor 模型是对并发模型进行了更高的抽象。

  8. Actor 模型是异步、非阻塞、高性能的事件驱动编程模型。[案例:说明 什么是异步、非阻塞,最 经典的案例就是 ajax 异步请求处理]

  9. Actor 模型是轻量级事件处理 (1GB 内存可容纳百万级别个 Actor),因此处理大并发性能高.

Actor 模型工作机制说明

d63b84605724941181d19203a5680db0.png

说明了 Actor 模型的工作机制 (对应上图)

  1. ActorySystem 创建 Actor

  2. ActorRef: 可以理解成是 Actor 的代理或者引用。消息是通过 ActorRef 来发送,而不能通过 Actor 发 送消息,通过哪个 ActorRef 发消息,就表示把该消息发给哪个 Actor

  3. 消息发送到 Dispatcher Message (消息分发器),它得到消息后,会将消息进行分发到对应的 MailBox。(注: Dispatcher Message 可以理解成是一个线程池,MailBox 可以理解成是消息队列,可以缓 冲多个消息,遵守 FIFO)

  4. Actor 可以通过 receive 方法来获取消息,然后进行处理。  Actor 模型的消息机制 (对应上图)

  5. 每一个消息就是一个 Message 对象。Message 继承了 Runable, 因为 Message 就是线程类。 2) 从 Actor 模型工作机制看上去很麻烦,但是程序员编程时只需要编写 Actor 就可以了,其它的交 给 Actor 模型完成即可。

  6. A Actor 要给 B Actor 发送消息,那么 A Actor 要先拿到 (也称为持有) B Actor 的 代理对象 ActorRef 才能发送消息

spring boot集成akka

根据自身的经验和理解,提供Akka与Spring集成的方案。本文不说明Spring框架的具体使用,并从Spring已经配置完备的情况开始叙述。

Actor系统——ActorSystem

什么是ActorSystem?根据Akka官网的描述——ActorSystem是一个重量级的结构体,可以用于分配1到N个线程,所以每个应用都需要创建一个ActorSystem。通常而言,使用以下代码来创建ActorSystem。

ActorSystem system = ActorSystem.create("Hello");

不过对于接入Spring而言,由IOC(Inversion of Control,控制反转)方式会更接地气,你可以这样:

@Configurationclass ApplicationConfiguration {

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private SpringExtension springExtension;

    @Bean
    public ActorSystem actorSystem() {
        ActorSystem actorSystem = ActorSystem.create("actor-system", akkaConfiguration());
        springExtension.initialize(applicationContext);
        return actorSystem;
    }

    @Bean
    public Config akkaConfiguration() {
        return ConfigFactory.load();
    }}

然后在你需要的地方依赖注入即可。

Actor编程模型

我们可以通过以下代码(代码片段借用了Akka官网的例子)创建一个简单的Actor例子。

Greeter是代表问候者的Actor:

public class Greeter extends UntypedActor {
 
  public static enum Msg {
    GREET, DONE;
  }
 
  @Override
  public void onReceive(Object msg) {
    if (msg == Msg.GREET)

原创不易,完成人机校验,阅读全文

相关推荐