<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Scala 专题：从 Actor 并发到函数式编程与大数据生态 on PlumePHP</title><link>https://plumephp.com/posts/scala/</link><description>Recent content in Scala 专题：从 Actor 并发到函数式编程与大数据生态 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 28 Sep 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/scala/index.xml" rel="self" type="application/rss+xml"/><item><title>Scala 3 元编程实战：inline、透明内联与编译期计算</title><link>https://plumephp.com/scala-metaprogramming/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-metaprogramming/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;元编程（Metaprogramming）是 Scala 3（Dotty）最「硬核」的能力：&lt;strong&gt;让编译器替你写代码&lt;/strong&gt;。它从 Scala 2 的反射/宏重构成三层递进的体系——&lt;code&gt;inline&lt;/code&gt; 内联、&lt;code&gt;transparent inline&lt;/code&gt; 透明内联（含编译期求值）、以及基于 &lt;code&gt;Quotes&lt;/code&gt; 的完整宏（可拼接语法树）。本文按难度递进，每层给原理 + 可运行示例，最终落到两个生产级用途：&lt;strong&gt;编译期校验&lt;/strong&gt; 与 &lt;strong&gt;零开销抽象&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Scala JVM 性能调优实战：JIT、GC、热点定位与 Scala 特有陷阱</title><link>https://plumephp.com/scala-performance-jvm/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-performance-jvm/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;「Scala 慢」多半是&lt;strong&gt;用错姿势&lt;/strong&gt;：隐式 boxing、无谓的不可变拷贝、String+ 拼接、没利用 JIT。JVM 本身并不慢——它是高度优化的运行时，&lt;strong&gt;慢的是算法与内存行为&lt;/strong&gt;。本文从 JVM 的三个发动机讲起（JIT、GC、线程），讲清 G1/ZGC 选型与堆调优，再重点剖析 Scala 特有的性能陷阱，最后给出一套可操作的调优流程：profiler 定位热点 → 针对性改 → 基准验证，并用 JFR/metrics 建立持续可观测性。&lt;/p&gt;</description></item><item><title>Scala Web 与 HTTP 服务：Play、akka-http 与 http4s</title><link>https://plumephp.com/scala-web-http-apps/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-web-http-apps/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 写 Web 服务有三条主流路线：&lt;strong&gt;Play Framework&lt;/strong&gt;（全家桶、有状态）、&lt;strong&gt;akka-http&lt;/strong&gt;（Akka 生态、低层灵活）、&lt;strong&gt;http4s&lt;/strong&gt;（纯函数式、效果类型驱动）。三者都能扛生产流量，差别在&lt;strong&gt;抽象层级与生态哲学&lt;/strong&gt;。本文逐个落地最小可用服务，再讲透 JSON、中间件、WebSocket 与部署，最后给选型矩阵。&lt;/p&gt;</description></item><item><title>Scala 微服务实践：服务拆分、通信、弹性与可观测性</title><link>https://plumephp.com/scala-microservices-practice/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-microservices-practice/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;微服务在 Scala 生态是「第一方公民」——从 Akka 的 Actor 到 http4s/circe 的类型安全 HTTP，再到 Cats Effect 的并发原语，Scala 几乎为微服务的每个环节都准备了工具。但微服务的难点从来不是「写服务」，而是&lt;strong&gt;拆分边界、通信协议、分布式事务、弹性与可观测性&lt;/strong&gt;。本文按落地顺序展开：拆分 → 通信 → 网关契约 → 服务发现配置 → 分布式事务 → 可观测性 → 弹性 → 测试部署。&lt;/p&gt;</description></item><item><title>Scala 数据库访问：Slick、Doobie 与 Quill 类型安全 SQL</title><link>https://plumephp.com/scala-database-access/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-database-access/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 访问数据库的三个主流方案各代表一种哲学：&lt;strong&gt;Slick&lt;/strong&gt; 把表建模成函数式集合（&lt;code&gt;TableQuery&lt;/code&gt; 就是集合）；&lt;strong&gt;Doobie&lt;/strong&gt; 让 SQL 字符串带上类型（纯 JDBC + Cats Effect）；&lt;strong&gt;Quill&lt;/strong&gt; 用「源码宏」把 DSL 在&lt;strong&gt;编译期&lt;/strong&gt;翻译成 SQL（错误提前到编译）。三者都承诺「类型安全」，但落地手感差异很大。本文各给最小实战，并重点讲连接与事务这些绕不开的工程点。&lt;/p&gt;</description></item><item><title>Scala 构建工具实战：sbt、Mill 与 Scala CLI 工程化</title><link>https://plumephp.com/scala-build-tooling/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-build-tooling/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 的构建工具经历三代演化：&lt;strong&gt;sbt&lt;/strong&gt;（行业标准，功能最全但学习曲线陡）、&lt;strong&gt;Mill&lt;/strong&gt;（sbt 的去魔法替代，配置即 Scala 代码）、&lt;strong&gt;Scala CLI&lt;/strong&gt;（面向脚本与快速起步）。理解它们共有的核心模型——&lt;strong&gt;声明式配置 + 增量编译 + 依赖图解析&lt;/strong&gt;——就能在三者间自由切换。本文以 sbt 为主线讲透概念，再给 Mill 与 Scala CLI 的对比落地。&lt;/p&gt;</description></item><item><title>Scala 流处理实战：Akka Streams、fs2 与反压机制</title><link>https://plumephp.com/scala-stream-processing/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-stream-processing/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;「流处理」不是大数据专属——日志采集、消息队列消费、文件管道、实时聚合，处处都在处理无限数据序列。Scala 生态有两套主流流库：&lt;strong&gt;Akka Streams&lt;/strong&gt;（Reactive Streams 标准实现，图式 DSL）与 &lt;strong&gt;fs2&lt;/strong&gt;（纯函数式流，天然嵌合 Cats Effect）。两者共享同一个灵魂：&lt;strong&gt;背压（Backpressure）&lt;/strong&gt;——慢的消费者不能被快的生产者淹没。本文先讲清流的心智模型与反压机制，再分别深入两套流库的核心用法、错误处理、并发流、外部系统桥接与测试。&lt;/p&gt;</description></item><item><title>Scala 测试体系实战：ScalaTest、MUnit、Mock 与属性测试</title><link>https://plumephp.com/scala-testing-practice/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-testing-practice/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 生态的测试工具多到让人挑花眼：ScalaTest、MUnit、Specs2、ScalaCheck、Mockito……但它们共同服务于同一套&lt;strong&gt;测试金字塔&lt;/strong&gt;——底层大量快速的单元测试，中层少量集成测试，顶层极少数端到端测试。本文按金字塔自底向上，讲透每个层次在 Scala 里的落地工具与写法。&lt;/p&gt;</description></item><item><title>Scala 类型级编程实战：Shapeless、Match Types 与编译期计算</title><link>https://plumephp.com/scala-typelevel-programming/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-typelevel-programming/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;普通编程用&lt;strong&gt;值&lt;/strong&gt;计算，类型级编程用&lt;strong&gt;类型&lt;/strong&gt;计算——把「参数的数量、单位、状态机的合法状态」写进类型里，让&lt;strong&gt;编译器在编译期替你检查&lt;/strong&gt;。Scala 3 的 &lt;strong&gt;Match Types&lt;/strong&gt; 与 given/using 推导把它从炫技变成可用的生产力工具。本文从字面量类型讲起，到类型级函数（Nat/布尔/列表）、Match Types、类型类推导，再进入 Shapeless 的 HList/Coproduct 泛型推导，最后落地到类型安全状态机与编译期校验，并讨论性能陷阱与调试。&lt;/p&gt;</description></item><item><title>Scala 领域建模实战：ADT、类型驱动设计与模块化架构</title><link>https://plumephp.com/scala-domain-modeling/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-domain-modeling/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;领域建模决定代码的「形状」——模型烂，后续所有功能都别扭。Scala 的建模语言是&lt;strong&gt;类型&lt;/strong&gt;：&lt;code&gt;sealed trait&lt;/code&gt; 表达「互斥的分支」，&lt;code&gt;case class&lt;/code&gt; 表达「不可变的值」，&lt;code&gt;opaque type&lt;/code&gt; 隔离「语义不同的同值类型」，&lt;code&gt;Either&lt;/code&gt; 表达「可能出错的计算」。本文按一条主线展开：从 ADT 建模领域对象，到值对象与类型驱动设计，再到错误建模、依赖注入、六边形架构与状态机，最后给出演进与重构成熟度模型。&lt;/p&gt;</description></item><item><title>Scala.js 与 Scala Native：跨平台编译、互操作与工程实践</title><link>https://plumephp.com/scala-js-native/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-js-native/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 不止活在 JVM 上：&lt;strong&gt;Scala.js&lt;/strong&gt; 把 Scala 编译成 JavaScript（浏览器 + Node），&lt;strong&gt;Scala Native&lt;/strong&gt; 编译成原生二进制（无 JVM 运行时）。这意味着同一套领域逻辑可以三平台共享——后端跑 JVM、前端跑 JS、CLI 工具跑原生。本文讲三平台的定位与选择、Scala.js 的前端工程（DOM/框架/JS 互操作）、Scala Native 的原生工程（C 互操作/资源）、crossProject 的共享代码组织，最后对比性能与部署方式。&lt;/p&gt;</description></item><item><title>纯函数式效果系统实战：Cats Effect IO 与 ZIO</title><link>https://plumephp.com/scala-functional-effects/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-functional-effects/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;「纯函数式程序」听上去很学术，落到生产只有一个问题：&lt;strong&gt;副作用（网络、数据库、时间）怎么办？&lt;/strong&gt; 效果系统（Effect System）的答案是把副作用&lt;strong&gt;包装成值&lt;/strong&gt;——&lt;code&gt;IO[User]&lt;/code&gt; 不是「拿到一个 User」，而是「一份能拿到 User 的程序描述」。你在纯代码里组合这份描述，最后才在唯一的边界执行它。Cats Effect 与 ZIO 是 JVM 上两套主流实现，本文讲透核心模型并给出可直接运行的写法。&lt;/p&gt;</description></item><item><title>Akka 集群实战：Actor 分布式、集群分片与容错</title><link>https://plumephp.com/scala-akka-cluster/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-akka-cluster/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Actor 模型解决了单机并发，但要支撑「水平扩展、高可用、跨机器分布」，需要把 Actor 系统升级为&lt;strong&gt;集群&lt;/strong&gt;。Akka Cluster 正是为此而生：它让 Actor 可以透明地分布在多台机器上，一个 Actor 系统跨节点协作，故障节点自动摘除，消息路由自动重定向。&lt;/p&gt;</description></item><item><title>Scala 3 新特性实战：enum、given/using、缩进语法与迁移指南</title><link>https://plumephp.com/scala3-modern-features/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala3-modern-features/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 3（代号 Dotty）是 Scala 语言十年磨一剑的重写：语法更简洁、类型系统更强、学习曲线更平缓。它吸收了大量社区反馈，把 Scala 2 的「高级但难学」改造成「高级且好懂」。&lt;/p&gt;</description></item><item><title>Scala 函数式编程实战：不可变、纯函数、高阶函数与 Option</title><link>https://plumephp.com/scala-functional-programming/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-functional-programming/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 是一门多范式语言，但函数式编程（FP）是它区别于 Java 的「灵魂」。很多 Java 开发者转向 Scala，最先遇到的困惑不是语法，而是&lt;strong&gt;思维模式的转变&lt;/strong&gt;：不再问「怎么改状态」，而是问「怎么用表达式描述计算」。&lt;/p&gt;</description></item><item><title>Scala 大数据生态实战：Spark 核心与数据处理范式</title><link>https://plumephp.com/scala-bigdata-spark/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-bigdata-spark/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;大数据领域，Scala 是 Spark 的「母语」——Spark 核心用 Scala 写成，Spark 的 API 在 Scala 下最完整、最原生。理解 Scala，才能读懂 Spark 源码、写出高效的数据处理管道，也是进入大数据工程师岗位的硬门槛。&lt;/p&gt;</description></item><item><title>Scala 类型系统实战：泛型、ADT、协变逆变与类型类</title><link>https://plumephp.com/scala-type-system/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-type-system/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 类型系统是 JVM 上最强类型系统之一，也是「为什么写 Scala 不容易出错」的底气。它允许你用&lt;strong&gt;类型本身来表达领域约束&lt;/strong&gt;：&lt;code&gt;Option[Int]&lt;/code&gt; 告诉你「可能没有值」、&lt;code&gt;Either[String, Order]&lt;/code&gt; 告诉你「失败带原因」、case class 建模出的 ADT 让非法状态根本编译不过。&lt;/p&gt;</description></item><item><title>Scala 集合库实战：不可变集合、性能选择与常用操作速查</title><link>https://plumephp.com/scala-collections/</link><pubDate>Sun, 27 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/scala-collections/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;Scala 集合库（Scala Collections）是函数式编程的「弹药库」。&lt;code&gt;List(1,2,3).map(...)&lt;/code&gt; 这样一行代码背后，是设计精良的不可变数据结构与数百个操作方法的组合。但集合库的强大也带来困惑：List 和 Vector 到底选谁？&lt;code&gt;map&lt;/code&gt;、&lt;code&gt;flatMap&lt;/code&gt;、&lt;code&gt;fold&lt;/code&gt; 什么时候用哪个？数据量大时怎么避免内存爆炸？&lt;/p&gt;</description></item><item><title>并发编程模式actor详解</title><link>https://plumephp.com/actor-model-detailed-explanation/</link><pubDate>Wed, 18 Sep 2024 10:47:00 +0800</pubDate><guid>https://plumephp.com/actor-model-detailed-explanation/</guid><description>&lt;p&gt;Actor模型是一种并发计算的数学模型，最初由Carl Hewitt在1970年代提出，并由William Clinger在其研究生数学工作中进一步发展。这个模型基于一个简单的观点，即自治代理（称为Actor）是并发计算的原始构建块。Actor模型的核心思想是Actor之间通过消息传递进行通信，并且不共享任何状态。每个Actor都有自己的状态和行为，并且可以通过接收消息来触发行为。这种模型受到了多种编程语言研究的启发，并在各种编程语言中得到了具体实现，对系统研究产生了深远的影响 。&lt;/p&gt;</description></item></channel></rss>