构建响应式应用:从AkkaTyped到AkkaStreams
立即解锁
发布时间: 2025-08-19 00:05:42 阅读量: 3 订阅数: 12 


Scala 2.13编程实战与进阶
# 构建响应式应用:从 Akka Typed 到 Akka Streams
## 1. Akka Typed 测试与应用运行
### 1.1 测试流程
在测试场景中,我们使用 `TestProbe` 创建烤箱和管理器,通过 `ActorTestKit` 的 `spawn` 方法创建烘焙师行为。向烘焙师发送请求,期望其将单个饼干放入烤箱。之后,检查在此期间是否无消息发送,以此确认烘焙师在等待饼干就绪。这里使用年度时间,检查可即时完成。最后,手动推进计时器,让烘焙师从烤箱中取出饼干,并验证烤箱是否按预期收到 `Extract` 消息。
### 1.2 应用运行
若未安装 Java 和 SBT,请先进行安装。我们将在终端中运行应用,为商店和面包店分别开启两个终端会话。可以选择交互模式运行,也可在相应 shell 中执行以下命令:
```plaintext
sbt "runMain ch12.Store"
sbt "runMain ch12.Bakery"
```
由于使用集群而非远程通信,无需像之前那样按特定顺序启动。应用启动后,两部分将建立连接并协同生产饼干。
### 1.3 Akka Typed 特性总结
- **类型安全**:以类型安全的方式实现 actor 系统,在编译时确定输入和输出通道的类型,行为可组合,提高代码复用性。
- **明确行为定义**:Typed actors 不仅接收和发送消息,还需在处理每条消息后明确定义新行为。与其他 actor 的交互受限,如创建、停止、查找和监视子 actor 等。
- **上下文功能**:Actor 上下文提供计时器和暂存等实用功能。
- **监督机制**:Typed 监督直接在行为上定义,必要时需显式实现故障传播到父 actor。
- **测试优势**:Typed Akka 中的 actor 本质上是函数,测试可同步进行,使测试代码具有确定性和稳定性,执行速度快。
- **扩展功能**:提供集群、集群单例、持久化和分布式数据等有用扩展。
## 2. Akka Streams 概述
### 2.1 流的基本概念
在现代计算中,“流” 含义丰富。在 Java 中,不同时期流代表不同概念,如阻塞 IO、非阻塞 IO 以及数据处理查询。本质上,流是数据或指令的流动,通常不会将流的内容完全加载到内存中,这使得在内存有限的设备上处理大量信息成为可能。
流有数据源和数据目的地,分别对应生产者和消费者。在流中,可对传输中的数据进行操作,就像在水管中安装热水器改变水的温度一样,生产者和消费者无需知晓中间操作。为实现模块化和代码复用,通常会定义许多小的转换步骤。
### 2.2 推和拉模型
- **推模型**:由生产者控制流程,数据一旦可用就被推送到流中,要求流的其余部分能够吸收数据。但当数据产生速率不可预测时,可能需要丢弃数据或使用缓冲区,而缓冲区可能会满,导致内存溢出或数据丢失。
- **拉模型**:由消费者驱动流程,消费者在需要时尝试从流中读取数据。若没有数据,消费者可选择等待或稍后再试,但这两种方式都不理想,会导致资源过度消耗和数据处理延迟。
### 2.3 Reactive Streams 与背压
为解决推和拉模型的不足,2013 年,Lightbend、Netflix 和 Pivotal 的工程师提出了 Reactive Streams 标准,引入非阻塞背压机制。
以建筑工地为例,工头负责建筑材料的及时供应。工地最多容纳 100 吨材料,工头向承包商订购材料。非阻塞拉模式下,工头发送语音消息订购 100 吨材料后继续日常工作。承包商根据工地容量发送 96 吨材料。当消耗 30 吨材料后,工头再次订购 30 吨,承包商考虑到之前剩余的 4 吨,发送一辆 32 吨的卡车。请求具有累加性,这就是 Reactive Streams 背压机制的工作原理。
Reactive Streams 规范定义了低级别 API 和技术兼容性套件(TCK),以确保不同库的实现可互操作。API 包含 `Publisher`、`Subscriber`、`Subscription` 和 `Processor` 组件,所有方法返回 `void`,实现异步流处理。
### 2.4 Akka Streams 介绍
Akka Streams 基于 Akka 演员系统构建,实现了 Reactive Streams 标准,提供丰富的高级 API,允许使用高级 DSL 描述流,并展示底层 Akka 机制。其目的是提供直观、安全的流处理设置方式,实现高效执行和有限资源使用。
Akka Streams 出现的动机是解决 Akka actor 系统的常见问题,如缺乏通用流控制机制、消息传递语义不理想和无类型等。它通过在 actor 系统之上添加流层,遵循全面的领域模型和模块化原则,将流描述与执行分离。用户执行流需经过以下步骤:
1. 以构建块和连接的形式描述流,结果通常称为蓝图。
2. 实现蓝图,创建流的实例,通过提供 materializer 实现,在 Akka 中使用 actor 系统或 actor 上下文为每个处理阶段创建 actor。
3. 使用 `run` 方法之一执行已实现的流。实际中,后两步通常合并,materializer 作为隐式参数提供。
### 2.5 依赖设置
为在项目中使用 Akka St
0
0
复制全文