章节摘要:翻过类型系统主峰后,路线进入高海拔地段——并发。本章以 Future 与 Promise 为主线讲异步组合,用 Actor 模型讲消息驱动架构,最后收拾并发集合与线程安全的遗留问题。第三章的 Monad 直觉在这里兑现成真实的并行能力。
金句:Future 是"时间维度上的容器",第六章的 map 与第三章的 map 是同一个 map。
三节对应三种并发需要:算得快(6.1 异步组合)、管得住状态(6.2 消息隔离)、存得安全(6.3 并发集合)。多数业务系统 6.1 为主,6.2 出现在高状态密度场景,6.3 是前两者的公共地基建。
[Future 异步管线] —— 无状态的并行计算 [Actor 消息隔离] —— 有状态的并发协调 [并发集合] —— 两者脚下共享的数据层
前置:3.2 的 flatMap(Future 就是 Monad)、5.3 的 given(ExecutionContext)。延伸:7.2 与 Java 线程池互操作、8.1 的 sbt 并行测试。
把前面积累的温度分析管线放到并发环境:8 个采集节点各自上报,平台并发拉取、聚合、告警。三步改造:
val nodes = (1 to 8).map(n => s"node-$n") val readings: Future[List[Reading]] = Future.traverse(nodes)(n => fetch(n)) // 并发拉全部节点 val alert = readings.map(_.filter(_.asCelsius > 40)) .map(_.take(3)) alert.foreach(hot => if hot.nonEmpty then notifyOps(hot))
Future.traverse 把"列表逐个做异步"压成一个 Future[List],是并发批处理的黄金组合子;告警链全部用 map/foreach 串联,无一处共享可变状态——本章三节的知识在一个方法里各就各位:traverse 来自 6.1、告警目标可换成 Actor 邮箱(6.2)、聚合若必须就地累积则上 TrieMap(6.3)。