这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
Scala CLI 与工具链现代化:指令声明、打包发布与 CI 集成
Scala CLI 把「单文件脚本、依赖声明、编译运行打包」压进一条命令,用指令注释替代构建文件,让脚本、原型与小型工具不再需要完整的项目结构与繁琐的构建配置。本文讲清指令声明与依赖解析机制、与 sbt 的职责边界、测试与多文件项目的目录布局、打包与发布方式,以及持续集成与工具链迁移的实际路径、常见坑与规避手段。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
Scala CLI 把「单文件脚本、依赖声明、编译运行打包」压进一条命令,用指令注释替代构建文件,让脚本、原型与小型工具不再需要完整的项目结构与繁琐的构建配置。本文讲清指令声明与依赖解析机制、与 sbt 的职责边界、测试与多文件项目的目录布局、打包与发布方式,以及持续集成与工具链迁移的实际路径、常见坑与规避手段。
事件溯源把系统状态定义为事件序列的折叠结果:写模型只追加不可变事件,读模型由投影派生,命令查询职责分离因此成为它的自然搭档。本文讲清持久化 actor 的命令与事件处理模型、日志与快照如何协作、投影与读模型的构建方式、事件版本演进与兼容策略,并给出恢复性能调优与日常运维的实践要点。
JSON 编解码是服务边界上最频繁的一次数据转换,它的性能与健壮性直接决定接口的吞吐和容错能力。circe 用代数数据类型把解析、派生与错误路径都建模成纯函数,jsoniter-scala 则用编译期宏生成无反射的编解码器换取吞吐。本文对比两者的模型与代价,给出派生与自定义的写法、性能实测方法,以及版本演进与向后兼容的实践路径。
流处理的难点从来不在「怎么读数据」,而在背压、并发、错误恢复与资源释放这几件相互牵制的事。fs2 把流建模成惰性的拉取式值:下游不拉取,上游就停,背压因此不是需要调参的配置项,而是模型本身的性质。本文讲清 Stream 与 Pipe 的语义、构造与组合子、并发原语的取舍、错误处理与重试策略、与文件与消息队列的集成,以及有状态聚合与窗口的实现方式。
资源管理是函数式程序里最容易被忽视的一环:文件句柄、数据库连接、线程池、后台任务都有明确的获取与释放时机,手工写在 finally 里一旦遇上取消、异常或嵌套组合就会漏。本文讲清 Cats Effect 的 Resource 抽象如何把获取与释放绑定成可组合的值,覆盖嵌套组合时的释放顺序、作用域与延迟分配、与手工清理的取舍边界,并给出连接池、后台任务与优雅停机的完整落地代码和常见陷阱。
Lightbend 从 Akka 2.7 起把许可证换成商业源码许可,生产环境需要付费,Apache Pekko 因此成为 Apache 协议下的事实续作。本文讲清许可证变更的真实影响,逐项给出依赖坐标与包名替换、配置前缀与序列化绑定改写、生态模块对应关系,并讨论按通信边界切分的渐进迁移、集群跨版本不兼容的硬边界,以及灰度发布与回滚方案。补充了迁移验证清单。
从 CPU、延迟、内存三个问题域出发,用本机 JDK 21 实测的 jcmd 与 JFR 输出演示 VM.flags、GC.heap_info、Thread.print、GC.class_histogram 的读法,讲清 JFR 记录了什么、线程转储怎么找死锁、堆转储怎么拿与怎么分析,并给出 Arthas 类在线诊断工具的适用边界与风险。
给出生产级图书借阅服务的上线检查清单、金丝雀蓝绿滚动的适用条件、上线后必看的 RED 指标与业务指标、基于 SLO 的错误预算与燃烧率告警定法,以及代码、配置、特性开关、数据四类回滚的取舍,附向前兼容的数据库迁移写法、发布演练要点与事故复盘模板,最后收束全书。
卷一交出的七个零件——会话表、路由表、Actor 邮箱、定时器、幂等窗口、同步模型、权威校验——到了卷二《单服架构与玩法系统》手里会长成什么。本节给出「零件 → 卷二章节 → 用途」的交接映射表,讲清为什么玩法必须先有这套地基,把卷二不写的跨服、压测、运营划给卷三与卷四,最后把整张契约编码成可测试的 Go 类型。
把卷一 17 章跑出来的实测数字汇成一张四列总表:指标、数值、成立条件、出处节号。覆盖编解码字节数与吞吐、KCP 弱网重传、时间轮挂载、邮箱背压、幂等窗口、快照与增量、AOI 带宽、goroutine 与虚拟线程、端到端 QPS 与分位,并说明为什么这些数字只能同机比、不能跨栈搬。
卷一 17 章各造了一件零件,却从没按一条主线串起来看过。本节把帧格式、会话表、路由、时间轮、Actor 邮箱、幂等窗口、同步模型与权威校验按依赖顺序排成一张「零件 → 文件 → 验收方式 → 实测结论」总账,逐章交代它解决了什么问题、留下了什么接口、下一章为什么需要它,并用五条贯穿全卷的伏笔说明这些零件如何拼成一个可裁决的世界。
站内没有 k6/wrk,压测器得自己写。本节给出 aegis 自带的机器人客户端:用错峰建连绕开 macOS 的 accept backlog 上限,登录进世界后连发请求、按往返时延汇总 QPS 与 P50/P90/P99,最后交出本机第一组真实承载数字——吞吐天花板约三千消息每秒,以及连接数继续上升后延迟如何塌方。
三个真实客户端连上网关、登录进世界、各自移动,靠一套 AOI 均匀网格做到彼此可见。本节讲清「世界是一个 actor」的事件循环、权威移动的速度校验、以及 AOI 广播只发「集合差」的做法,再用一个 L2 测试与真起三进程的日志证明这条链路确实跑通、瞬移确实被拒。
前 16 章各自造了零件却从没装在一起跑过。本节把 proto、session、router、timing、aoi、world 按依赖顺序装配成可执行文件 aegis,讲清配置结构、启动顺序与优雅关停,并用一次真进程启动与关停日志验证「端口绑定失败即退出」与「SIGTERM 后连接与计数正确收摊」。
加密解决「别人看不懂」,完整性解决「别人改不动」——两者缺一不可。本节给 aegis 的封包加一层 AES-256-GCM 的 Sealer:seq|nonce|密文+tag 的封套、以 seq 作附加认证数据、64 位滑动窗口抗重放,并讲清方向密钥为什么必须由握手密钥材料按标签派生(与 6.3 重连票据呼应)。
连接耗尽靠的不是带宽,而是数量:几十万条只握手、不登录、不发数据的连接就能把接入层拖垮。本节只讲怎么加固自己的服务端——每 IP 连接上限、未登录连接上限、全局上限、握手令牌桶、slowloris 的读写超时兜底与拒绝策略,并用本机 loopback 的几十条连接做真跑验证。
长度字段来自网络,是不可信输入:一个声明「长度 = 4 GiB」的畸形包就能让服务端按声明预分配巨量内存。本节用 Go 原生 testing.F 给 internal/proto 的帧解析写一个 fuzzer,覆盖长度越界、截断、超长与 flags 组合,讲清「解析器必须对任意字节序列都不 panic、不无限分配」,并给出本机 5 秒百万级执行的实测。
主线程为什么是瓶颈、哪些活能挪出去、挪出去要付什么代价。本节讲清 Worker 的数据边界——结构化克隆的复制成本与 Transferable 的零拷贝,用可跑的纯 TS 代码量化两者差异;说明 cc.d.ts 并不导出 Worker,必须走平台全局对象并做特性检测;最后给出分片计算任务与并行化的工程判断。
把《方块冲刺》接一个三方 SDK 的完整链路走一遍:先看 Android/iOS 原生工程里插件该落在哪,再分别写 Java 与 Objective-C 桥接类,然后用 TypeScript 门面包一层平台适配,让业务代码只见接口不见平台;重点讲清原生结果回传给 JS 时的线程约束、回调注册与生命周期坑,最后算一笔插件维护成本的账。
从原生构建产物入手,讲清 Cocos Creator 3.8 在 Android/iOS 上如何把 JS 引擎嵌进 C++ 宿主,JSB 绑定怎样把 cc 的类暴露给脚本层;用 cc.d.ts 实测划出「平台无关 API」与「原生运行时注入对象」的边界,讲对 sys.isNative 与 sys.platform 的用法,量化反射式原生调用的成本,给出下沉原生的工程判断。