Nix 求值是个调度问题:Evix 把求值变成可驻留、可查询、可分布的服务
来源:notashelf.dev — 2026-07-30
📋 概述
作者为 Nix 生态打造的 Evix,是一个库优先的异步求值引擎,通过稳定的 Nix C API 求值 flake、文件或内联表达式,并把求值结果报告成带类型的结构化事件。核心是一个长寿命的 Session:首跑流式填充热图,之后可查询、可 diff、可监听本地输入变化,还支持跨机器的远程 worker,把每次重新求值变成问一个已经求值好的世界。
🔑 核心要点
- Nix 工具共同的痛点是想要一份表达式产生的 derivation 列表,而这往往是一次性成本。这意味着常规做法都是每次从头跑一遍求值,命令一结束中间状态就丢弃,白白重复同样的开销。
- Evix 的 worker 不求值整个 flake,而是每个属性路径求一次、返回一个事件。这样做的价值在于粒度更细、结果可独立处理,调用方按需订阅具体路径,而不是被迫承受全量求值的代价。
- 递归不在栈里而在队列里,协调者派发路径,worker 返回 typed event,结果图与调度顺序无关。这说明求值可并行分发而不改变最终语义,天然适合水平扩展与故障重试。
- worker 是子进程而非线程,按 RSS 限制自动重启,泄漏的内存随 worker 一起消失。好处是长期驻留的服务不会因个别表达式积累内存而逐渐劣化,稳定性更强。
- 远程 worker 走 Cap'n Proto 协议,可跨机器求值,系统在求值后才能路由。这意味着在结果真正算出前,下游还无法决定把依赖派往何处,跨机器协作由此成为可能。
- Session 让求值从事件变成对象:可调度、隔离、查询、diff、跨机器。这样做的好处是把一次性求值升级为可复用、可增量更新的长期资产,每次重新求值都像在问一个已经求值好的世界。
💡 金句
如果一次性把列表喂给 jq 就够,那你并不需要这些。但我需要求值在程序里活着。
👍 0
👎 0
← 返回 Lobsters 首页