Rust

32 篇内容

工程实践Simon Willison

parse_number() as a SQLite extension: C vs Rust

文章记录作者用 Claude 辅助为 SQLite 编写 parse_number() 扩展,并比较 C 与 Rust 实现的性能、代码复杂度和产物体积。Rust 版借助 rusqlite 或 sqlite-loadable-rs 生成约 298–321 KB 的扩展,C 版仅 14 KB;但 Rust 版最初更快,因为其 strtod 等价实现约为 C 的两倍。作者继续让模型实现自定义 C 解析器,采用 Clinger fast path,在 200 万行基准中把混合数据从 67 ns/行降至 19 ns/行,整数和纯小数场景也显著优于 Rust。结论表明扩展体积与运行时性能存在权衡,C 手写解析在特定数据形态下可以反超。文章主要是 AI 辅助原型与基准摘要,完整方法、可复现性和适用边界需参考链接报告。

推荐收录:文章给出了可核对的产物体积和 ns/行基准,展示了 C 与 Rust 在 SQLite 扩展场景下的实际取舍,并说明 Clinger fast path 对数字解析性能的影响。适合数据库扩展、Rust/C 互操作和性能优化读者参考;不过它依赖 AI 生成代码与摘要,复现细节和统计严谨性需结合完整报告判断。

科研议题Microsoft Research Blog

Formally verifying agent-written full-stack web apps with PDD Kit

文章介绍 Microsoft Research 的 PDD Kit:它把开发者的自然语言意图逐步澄清为 Verus 形式规范,再由编码代理实现代码并生成证明,由 Verus 对规范覆盖的所有输入做穷尽验证;证明无法触及的 bcrypt、SQLx、时钟、JWT 签名等部分被显式列为可信计算基,并用测试补足。作者在 GitHub Next 的 Chopin 环境中以全 Rust 的 Pet Store 登录逻辑为案例,通过决策卡、意图图、规范签核、任务图和变异检查,证明登录满足“只有正确密码才发 token”等性质,并发现原有缺陷。文章强调审查重心从逐行代码转向意图和规范,但也明确证明只保证代码符合规范,不保证规范本身正确;目前仅支持 Rust,仍是研究原型,可信边界承担主要保证。

推荐收录,因为文章不是产品宣传,而是给出 Proof-Driven Development 的完整方法链条:意图澄清、形式规范、Verus 证明、可信边界测试和变异检查,并以约 5000 行 Rust 全栈应用的登录逻辑说明其可操作性。适合研究形式化方法、AI 编码代理、代码质量与 CI 集成的读者,其中“规范即合同、可信边界显式化、证明与测试分层”具有迁移价值;但需注意其结论受研究原型、仅支持 Rust 和可信假设限制。

工程实践知乎 - 罗宸

想爽用 Agent 控制一切, 但又害怕密码泄露? 我做了一个保护你密码的工具

文章介绍作者为解决 Coding Agent 使用中私密凭据(API key、token)外泄风险而自研的 LLM 网关 Secret Guard。作者先否定早期本地 27B 模型加 MCP 脱敏的方案(太慢且仍是概率性保证),转而采用确定性思路:在请求发往厂商前把真实密钥替换为假密钥,本地再反向还原,并确保生成的假密钥不出现在原请求中以保证替换安全,用 proptest 作为数学性质来验证。文中披露了流式 SSE 中密钥可能跨包边界需先合流开窗匹配、WebUI 存储请求原文导致数 GB 内存后改做 DAG 去重、协议转换实现 codex 与 claude 模型互调等具体工程问题,最终用 Rust 实现约 10M 的单文件。方案依赖本地维护完整密钥登记表,适用范围受配置管理条件约束。

推荐收录,因为它呈现了从安全威胁建模、确定性替换、性质测试到流式边界处理和内存去重的完整工程闭环,失败尝试与架构取舍都有交代。适合做 Agent/LLM 基础设施、网关、密钥安全与 Rust 工程实践的读者,其确定性替换加性质验证的思路可迁移到任何敏感数据外发场景;风险在于方案依赖本地密钥登记表,读者需评估自身配置管理与维护成本。

工程实践Cloudflare Blog

Filter, reshape, and redact logs before export with Transformers

Cloudflare 介绍 Logpush Transformers:在日志导出流水线内嵌 SQL 转换,客户可按数据集用 WHERE 过滤、SELECT 重塑/重命名/嵌套字段并脱敏,再以 NDJSON 投递,避免额外处理服务与下游成本。实现上选用 Apache DataFusion/Arrow,在 Go 服务 Bufstream 内通过 cgo 与 Arrow IPC 跨 Rust 边界执行,并按时序切片缓存逻辑计划、按 job 并行。基准中 5000 行单 goroutine 约 3ms,约 160 万行/秒。设计强调失败关闭、重试和自动禁用持续失败任务,并暴露健康指标。限制是仅适用于同数据集 NDJSON 作业,会引入 CPU 开销,且跨语言边界仍有序列化与内存管理成本。

推荐收录:文章不是产品发布稿,而是完整披露在每秒亿级事件的日志导出链路中嵌入 SQL 转换的工程方案,包括 DataFusion/Arrow 选型、Go/Rust FFI 所有权管理、逻辑计划缓存、按 job 并行和 fail-closed 策略。适合可观测性、数据管道、高吞吐服务与跨语言性能边界的工程师参考,其性能数据与取舍可迁移到类似日志处理系统。

技术文章Niko Matsakis

Why 'externalized' proofs of cyclic trait impls does not work

文章探讨 Rust 中循环 trait impl 处理 supertrait 的两种证明策略:模块化证明(impl 自身必须证明 supertrait 成立)与外部证明(调用方需证明 supertrait)。作者先用 Magic: Copy 等例子说明模块化证明的直觉与递归风险,再指出外部证明虽然能让非法 impl 合法但不可用,却与 unsafe trait 的语义冲突:unsafe impl 被信任去证明安全性,同理 impl 也应被信任去证明 supertrait。因此作者结论是必须采用模块化证明,并需引入防止证明递归依赖 impl 自身的规则;文章属于系列讨论,尚未给出完整终止性方案。

推荐收录:文章用清晰的推理规则和函数契约类比,论证了外部证明方案与 unsafe trait 语义的不兼容,并明确得出模块化证明是唯一可行路径。适合 Rust 编译器开发者、编程语言研究者及类型系统爱好者阅读,有助于理解 trait 系统的证明义务、unsafe 语义及循环 impl 设计权衡。局限是方案尚未落地,终止性规则留待后续。

工程实践Datadog Engineering

How we extended Apache DataFusion to execute one query across many machines

Datadog 为统一查询栈,选择 Arrow 作为内存格式、Substrait 作为执行计划格式、Apache DataFusion 作为可组合查询引擎,但 DataFusion 只能在单机执行查询,无法支撑其最大的交互式负载。为此团队开发了开源 Rust 框架 Distributed DataFusion,仅作用于物理计划层,复用 DataFusion 分区模型并把分区扩展到多机,引入 stage、task、DistributedLeafExec 等概念,以及 NetworkShuffle、NetworkCoalesce 等节点完成跨机重分区与结果汇聚,支持分区连接、广播连接、分布式 union 和树形归约聚合。文章给出在 12 节点 c5n.2xlarge 集群上基于 TPC-H/TPC-DS(1GB–100GB)与其他引擎的对比,并说明生产中重查询最高提速 10 倍,而计划器会在分布收益不足时让轻查询留在单机。作者还解释了为何放弃 ClickHouse、Spark、Ballista、Trino:需要的是可扩展框架而非完整引擎,且必须低延迟、零拷贝、与 Arrow/Substrait 及自有网络栈集成。其边界在于面向交互式低延迟场景,而非后台容错批处理作业。

推荐收录:文章基于真实生产约束(低延迟交互式查询、DataFusion 单机瓶颈)给出了完整的设计取舍、物理计划改造细节和可复现的 TPC-H/TPC-DS 基准,并明确说明何时不分布。对构建查询引擎、数据基础设施或评估分布式执行框架的工程师,其分区扩展、网络 shuffle/coalesce 机制与引擎选型理由都可迁移参考。

技术文章Armin Ronacher

Deser: Rethinking Rust Serialization

文章从 Serde 在 Rust 序列化生态中的统治地位与长期限制切入,用任意精度数字、flatten 整数键、适配器不可组合等案例,指出问题源于统一 trait、固定数据模型和基于调用栈递归的设计。作者介绍实验库 Deser:把类型驱动的反序列化改为格式向 sink 推送事件,sink/emitter 由 driver 在堆/arena 中管理,从而避免栈溢出、支持可暂停流式解析、无损缓冲和可扩展数据模型,并以 layers、组合式 adapter、真实表达式派生属性提升可用性。Deser 已覆盖 JSON/JSON5/CBOR/MessagePack/YAML/TOML/XML/plist 等格式,并展示 TOML datetime、XML 命名空间等场景。代价是动态分发与堆分配导致运行时性能混合、二进制膨胀更大,内部使用 unsafe,且生态仍难撼动 Serde。

推荐收录:文章不是泛泛介绍新库,而是给出 Serde 三类可复现边界案例,并系统解释 Deser 的 sink/emitter、堆上状态、无损缓冲和 layers 架构如何规避这些问题,同时明确性能、二进制体积、unsafe 与生态锁定等代价。适合 Rust 库作者、序列化/格式设计者和需要评估反序列化架构的工程师,其中的设计权衡与验证方式可迁移到其他语言或数据格式工具链。

工程实践Cloudflare Blog

Supporting native Rust in Workers with the new Emscripten target for wasm-bindgen

文章介绍 Cloudflare 在 wasm-bindgen 与 Rust Workers 上实验性支持 wasm32-unknown-emscripten 目标,使原生 Rust 代码乃至 Tokio 应用可在 Workers、Node.js 和 Web 上运行。核心工作包括通过 -sWASM_BINDGEN 让 Emscripten 与 wasm-bindgen 协同,补丁支持 libc、socket2、Mio 等库,并为 Tokio 设计 JSPI 挂起语义和 LocalEventLoop 事件循环集成。为解决 Tokio I/O,作者用 node:net 桥接 Emscripten 的 epoll/TCP/UDP socket,并贡献 -sNODERAWSOCKETS。文中以 Pumpkin Minecraft 服务器跑在 Durable Object 为例,验证多人、持久化和 TCP 入口可行性。当前仍为预发布实验补丁,上游评审、JSPI 重入上下文和 API 稳定性尚待完善。

推荐收录:文章给出 wasm-bindgen/Emscripten 互操作、Tokio 在单线程 JS 事件循环中的两种集成方案,以及 epoll/socket 桥接的完整工程证据,并用 Minecraft 服务器验证可行性。对 Rust、WebAssembly、边缘运行时、异步运行时和网络栈开发者有较高迁移价值;需注意当前仍是实验性补丁,上游 API 与实现可能变化。

工程实践ScyllaDB Engineering

Building a Faster (Rust-Based) Python Driver for ScyllaDB

本文介绍用 Rust 重写 ScyllaDB Python 官方驱动的原因、设计与性能结果。作者选择 PyO3 作为 Rust-Python 绑定层,并通过同步/异步微基准说明小值调用开销可忽略,但大对象跨语言传递和大量小任务调度会显著变慢。序列化最终放在 Rust 侧,反序列化对原生 CQL 类型复用 Rust 现有逻辑、对复杂类型直接构造 Python 对象;借助 yoke 实现零拷贝结果迭代,以绕过 PyO3 无法暴露非静态生命周期的问题。分页、错误处理与元数据缓存也针对 Python 习惯做了重新设计,基准显示在插入、查询和并发场景下明显优于旧版驱动。文章也指出截至 2026 年 6 月该驱动尚未生产就绪,TLS、重试、负载均衡等仍在评审,兼容旧 API 也尚未完成。

推荐收录:文章给出了可复现的微基准与端到端对比,并详细记录 PyO3 绑定、序列化策略、yoke 零拷贝、分页与错误映射等工程取舍,证据链完整。适合数据库驱动、Rust/Python 互操作、性能优化与 API 设计方向的工程师阅读,其中“大对象避免跨 FFI 传递、大任务优于小任务”等结论可直接迁移。风险是驱动尚未生产就绪,部分能力仍在评审,读者需注意其阶段性结论。

技术文章Eli Bendersky

Rusty thoughts on "Parse, don't validate"

文章围绕 Alexis King 的“Parse, don't validate”模式,讨论它在 Rust 中的具体体现。作者先以读取 CONFIG_DIRS 环境变量为例,说明仅返回 Vec 并在函数内检查非空,会让调用方反复处理本不可能出现的 None,也在不变量变更时埋下风险。接着介绍用 NonEmpty 类型把非空约束编码进类型系统,并展示 uutils/coreutils 的 Pipeline 等真实用法。随后讨论渐进解析与类型精化:rust-analyzer 的 AbsPathBuf、camino::Utf8PathBuf、NonZero 整数,以及 serde/JSON 反序列化如何把字段约束编码到类型。结论是解析应把数据转换为携带不变量的新类型,让后续代码无需重复验证;不足是例子多集中在库与应用层,未深入讨论类型设计成本与性能权衡。

推荐收录,因为文章用 Rust 标准库、uutils、rust-analyzer、serde 等真实代码展示了如何把“非空、绝对路径、非零、枚举取值”等不变量从运行时检查转为类型约束。它适合 Rust 开发者、库设计者和后端工程师阅读,可迁移到 API 边界、配置解析和数据建模中,帮助减少重复验证与 unreachable! 式假设。

技术文章Alex Chan

Parametrised tests in Rust with named parameters

文章介绍如何在 Rust 中实现带命名参数的参数化/表驱动测试,以缩略图工具为例,希望测试逻辑写一次、多组输入复用。作者比较 for 循环、位置参数宏与 rstest、parameterized、yare 等第三方库,但因个人项目想学习宏而手写 macro_rules!。核心是让 matcher 匹配类似结构体的命名字段,再由 transcriber 为每个用例生成独立 #[test] 函数,并解释 $(...)*、元变量与 matcher/transcriber 机制。结论是命名用例更自文档化、用例相互隔离且便于新增。边界在于示例面向小型个人 Rust 工具,未做生产级库选型或充分基准,宏模式也绑定特定测试结构。

推荐收录:文章给出完整的 macro_rules! 定义、matcher/transcriber 拆解和生成代码示例,并对比 for 循环、位置参数宏和第三方库,证据充分。适合正在写 Rust 测试或想理解声明式宏的开发者,可迁移到表驱动测试、代码生成和减少样板代码的场景。需注意作者刻意不用第三方库且项目规模小,生产选型仍需结合 rstest/yare 等方案的维护成本。

工程实践ScyllaDB Engineering

Building a Faster C# Driver for ScyllaDB…on our Self-Baked C#-Rust FFI Framework

本文复盘 ScyllaDB 用自研 C#-Rust FFI 框架重写 C# 驱动的实践,目标是在保持原 DataStax C# 驱动 API 基本不变的前提下复用 Rust 驱动的性能与正确性。作者利用 .NET 5 的改进互操作特性降低跨语言开销,并桥接 .NET 与 Tokio 异步运行时以避免阻塞线程。文章详述了序列化放在 C# 侧、以 RWLock 解决会话关闭的 TOCTOU/UAF 竞争、用 trait 映射错误、以原子快照管理元数据、转发 Rust 日志等取舍。基准显示新驱动在所有场景不慢于原驱动,高并发下约快一倍。当前开发暂停,功能完整性与维护仍待完善。

推荐收录:文章完整呈现 C#-Rust FFI 框架设计、TOCTOU/UAF 竞争修复、元数据快照与错误映射等关键取舍,并附可复现基准(高并发下约为原驱动两倍、接近 Rust 驱动)。对从事跨语言互操作、数据库驱动或高性能客户端开发的工程师有直接参考价值,会话生命周期管理、内存引用计数等模式可迁移。项目开发暂停是主要风险。

技术文章matklad

Finding Bugs

文章围绕“生成式/随机化测试是否比示例单元测试更能发现 bug”展开,以 regex crate 中“.abb|b”在输入“zabb”时错误返回“b”的 bug 为案例。作者实现了一个小型 fuzzer,核心策略是用 oracle:交叉对比 regex 与 regex_lite 的匹配结果;同时通过 swarm testing 随机选择正则特性与字符表,随机化分布本身,并坚持生成小而刁钻的样例而非大而均匀的输入。文中的递归正则生成器、权重式特性选择、内存复用与搜索循环均给出完整 Rust 代码。作者确实复现并发现了另一个 bug,但承认自己已知目标 bug,论证强度有限;该方法最适合纯算法或易于构造 oracle 的组件,对缺乏 oracle 的大型系统并不直接适用。

推荐收录:文章给出了从 oracle 设计、swarm testing 到正则生成器与搜索循环的完整可运行代码,并用 regex/regex_lite 交叉验证实际找到 bug,证据具体。适合测试、基础库和 Rust 开发者参考,可迁移到 fuzzing 与差分测试设计;局限是作者已知目标 bug,且 oracle 在复杂系统中并不总是容易获得。

工程实践Cloudflare Blog

Saving another 100TB of RAM with math (and Rust)

Cloudflare 复盘 Pingora Backend Router 中 pingora-ketama 一致哈希内存占用过高的问题。文章从一致哈希哈希环和权重路由讲起,用期望值、标准差和变异系数分析每台服务器哈希点数量对负载均衡精度的影响,并指出 32 位哈希在哈希点极多时会因碰撞抵消收益。工程上,作者将 Point 结构改为紧凑字节存储以规避 Rust 对齐开销,带来约 25% 内存下降;又依据推导把每节点哈希数降低 90%,且不造成明显误差。为避免切换哈希环导致缓存大面积失效,团队用新旧双环、按请求哈希稳定选择、数据中心分层灰度、可回滚和多项指标观测完成迁移。最终全球回收超过 100TB 内存,相关能力以 pingora-ketama v2 实验特性提供。其结论依赖连续哈希环近似和碰撞分析,落地时仍需按服务器数、哈希位宽和缓存失效代价验证。

推荐收录。文章给出从算法建模、Rust 内存布局到生产灰度迁移的完整闭环,并用全球回收 100TB RAM 的结果验证;其中一致哈希的统计推导、碰撞分析和双环迁移策略可直接迁移到负载均衡、缓存路由和基础设施性能优化场景。风险在于切换哈希环会引发缓存重分布,读者需结合自身哈希位宽、节点规模和灰度能力评估。

工程实践Simon Willison

Be alert: targeted attacks on prominent Rustaceans

这是一篇引用 Rust 官方安全公告的链接短文:crates 安全团队警告存在针对 rust-lang 成员与热门 crate 维护者的持续攻击,目的是入侵设备与账号并借此发布恶意版本。攻击手法属于社会工程,攻击者以工作、项目或外包机会为名安排视频通话,诱导目标安装所谓“缺失的音频编解码器”,或让目标执行剪贴板中的命令。文中指出上月 arrayref 等 crate 的供应链攻击即由该手法得手,并强调依赖网络中任何拥有发布权限的人都是潜在攻击面。作者提出的缓解思路是依赖冷却期,即新版本发布后延迟数日再升级,寄希望于他人先发现恶意发布。该防御依赖生态广泛采用,且只能降低而非根除风险。

推荐收录,因为它把一次真实攻击的具体向量(社工视频通话、伪造编解码器、剪贴板命令执行)与已发生的 arrayref 供应链事件关联起来,并给出可落地的依赖冷却期缓解策略。适合维护开源包、负责依赖治理或供应链安全的读者,可作为威胁建模与升级策略设计的参考;局限在于内容为一手公告的转述,防御效果未被作者验证。

工程实践NVIDIA Technical Blog

Translating CUDA Tile Operations from Python to Rust Using Agentic AI

文章介绍 NVIDIA 用 Agentic AI 将 CUDA Tile 算子从 Python 翻译到 Rust 的工程实践。cuTile Python、Triton-TileIR 与 cuTile Rust 共享同一 CUDA Tile IR,因此移植不是重新优化,而是用更安全的主机语言重写同一 tile 程序,并可通过比对参考内核与生成内核的 Tile IR 做结构性验证。作者构建了一个有界多智能体流水线,覆盖分析、设备内核、主机与 FFI 代码、正确性和性能校验,每个阶段都以可机器检查的判决收尾,并配有 IR diff 分析与残余性能归因两个专职诊断子代理。团队据此移植了全部 24 个 TileGym 公开算子(约 40 个内核),在 DGX B200 上达到 cuTile Python 平均 99.5% 的性能,约三分之一算子反超。文章也指出 Rust 需显式声明特化、C ABI 之后无安全网、部分内核仍依赖非安全 API 等边界。

推荐收录。它以真实算子库为对象,给出了多智能体流水线的编排契约、判定路由、IR diff 验证与实测性能数据,并给出 softmax 的 Python/Rust 逐行对照和 C ABI 集成细节。适合做 GPU 内核、编译器前端或 AI 工程化落地的读者参考其可验证的翻译与代理编排方法,风险在于其结论依赖共享 Tile IR 与 Blackwell 工具链,迁移到其他体系需重新验证。

工程实践Oxide Public RFDs

RFD 0619: Managing types across Dropshot API versions

RFD 619 讨论 Oxide 在 Dropshot HTTP API 服务端版本化后如何组织已发布类型,以降低新增 API 版本的修改负担。作者提出为每个 types crate 配套 versions crate,集中定义所有历史版本,types crate 仅重导出 latest,API trait 只依赖 versions crate,业务逻辑只依赖 types crate。核心规则包括:类型定义在最早出现版本,后续变更在新 vN 模块,相邻版本用 From/TryFrom 或 from_vN/into_vN 转换,非版本代码放 impls 模块,最新端点用 floating identifier、旧端点用 versioned identifier。文中还给出一次性迁移与新增版本指南,并论证旧方案、域优先嵌套、独立 conversion 模块等替代方案被拒原因。其适用边界是 Oxide/Omicron 的 Rust、Dropshot、OpenAPI/Progenitor 技术栈,外部团队需按自身仓库结构与兼容策略调整。

推荐收录:该 RFD 包含完整的动机、原则、determinations 和逐项 rationale,并用真实 PR 说明旧类型组织方案的维护痛点,属于可复核的工程决策证据。适合维护长期兼容 HTTP API、使用 Rust/Dropshot/OpenAPI 或需要设计服务端版本化的后端与基础设施团队阅读;versions crate 分层、按最早版本存类型、相邻版本转换等规则可迁移到其他 API 版本化场景。风险是它绑定 Oxide 特定 crate 命名与工具链,外部团队需按自身边界调整。

工程实践Oxide Public RFDs

RFD 0609: Futurelock

RFD 609 提出并系统分析了 async Rust 中的 futurelock:一个任务负责轮询多个 Future,却停止轮询持有共享资源的 Future,导致其他 Future 永久等待。文章用可复现的 tokio::select! 示例说明,当分支使用 &mut future 且在其他分支的 handler 中 await 时,已启动但未完成的 Future 不会被取消,锁的等待队列和 select! 的提交行为共同造成死锁。作者还复盘了 Omicron 中数据库访问全部挂起的真实故障,给出通过 DTrace 定位 mpsc 发送阻塞的调试线索。确定部分给出了规避建议:避免任务停止轮询已启动的 Future,优先用 tokio::spawn 或 JoinSet,谨慎在 select! 分支中 await,并重新审视有界通道的阻塞 send 模式。局限是问题高度依赖运行时语义,调试困难,且没有一劳永逸的抽象或编译器检查,需逐例判断。

推荐收录,因为它把一次真实线上挂起抽象为可复现的 futurelock 机制,并给出 tokio::select!、Mutex 等待队列、任务轮询职责之间的因果链。对使用 async Rust/Tokio 的工程师、维护高并发服务或做代码评审的人有直接迁移价值;局限是结论依赖运行时语义,调试与规避仍需逐例判断。

技术文章Oxide Public RFDs

RFD 0400: Dealing with cancel safety in async Rust

Oxide RFD 400 系统讨论 async Rust 的取消安全与取消正确性。作者把取消安全定义为单个 future 的局部属性,把取消正确性定义为系统级全局属性,并梳理 select!、timeout、try_join、task abort、runtime shutdown 等取消来源。文章给出库作者和调用方的处理模式:拆分复杂操作、reserve permit、恢复部分进度、协作式取消、避免 tokio::sync::Mutex、用后台任务隔离 cancel-unsafe 操作,并以串口代理、installinator、write_all_buf 等案例说明取舍。结论是取消安全没有银弹,需结合 Tokio 语义和业务边界逐案验证。

正文以 Oxide 控制面开发中的真实问题为背景,系统定义 cancel safety/cancel correctness,并给出 select!、timeout、try_join、task abort 等取消源和 reserve、部分进度恢复、协作取消等可迁移模式,还附多个生产案例。适合编写或评审异步 Rust 服务、库 API 与分布式控制面的工程师;主要风险是结论依赖 Tokio 语义和 Oxide 场景,迁移到其他 runtime 或业务时需重新验证。

工程实践Oxide Public RFDs

RFD 0479: Dropshot API traits

RFD 479 介绍 Dropshot 的 API trait 方案:用 Rust trait(#[dropshot::api_description])定义端点集合,端点作为静态方法,从而把 API 接口定义与具体实现分离。宏会生成 support module,提供 api_description 与 stub_api_description,前者用真实实现启动服务器,后者无需实现即可生成 OpenAPI 文档。该设计主要解决函数式 API 的迭代慢、Nexus 与 sled-agent 循环依赖、OpenAPI 合并冲突和难以提供测试实现等问题。Oxide/Omicron 落地后,OpenAPI 测试从约 18 秒降到 1.5 秒,新增 KnownArtifactKind 的流程从 20 多分钟降到 1 分钟以内。边界是要求 Rust 1.75+、使用静态分发、trait 不能对象安全,且尚不支持 trait 组合与部分测试实现的自动委派,更适合大型服务或需要多实现的 API。

推荐收录:它给出了从问题、约束、迁移路径到量化收益的完整工程论证,并有 Dropshot 0.11.0 与 Omicron 全量迁移作为落地证据。适合 Rust 后端、API 平台、基础设施和架构设计读者,可迁移的是接口与实现解耦、宏生成 OpenAPI、打破循环依赖和加速迭代的模式。需注意其结论依赖 Oxide 的 Rust 技术栈与 Dropshot 工具链,其他团队要评估版本、静态分发和生态限制。

工程实践Oxide Public RFDs

RFD 0444: Crucible Upstairs Refactoring

该 RFD 复盘 Oxide Crucible 存储 Upstairs 的重构:重构前多个 async 任务共享一个 tokio Mutex<Downstairs>,单个作业需加锁 11–15 次,io_send 等路径竞争严重,多任务拆分收益有限。作者提出按客户端拆分锁,并用 per-job 原子位标记跨客户端状态;同时给出更激进的“一个大任务”反提案,让同步状态机核心独占数据、异步仅位于边界。基准显示大块随机写提升约 20%–30%,但部分收益来自加解密移出锁范围,早期基准不够严谨。最终因 reconciliation 等路径依赖两个任务同时接触共享数据,无法渐进改造,团队选择并完成了非渐进式重构,消除约 3KLOC。

推荐收录:这是来自生产存储系统的真实架构重构记录,包含锁竞争量化、数据归属表、两种重构方案权衡、失败尝试和最终落地效果。对使用 Rust async、Tokio 或维护高并发存储/分布式系统的工程师尤其有价值,可迁移其从锁拆分到同步状态机核心的设计判断。阅读时应留意基准不严谨及后期归因修正,不能只照搬性能数字。

工程实践Oxide Public RFDs

RFD 0397: Challenges with async/await in the control plane

该 RFD 讨论 Oxide 控制平面使用 Rust async/await 三年后暴露的任务取消安全问题:Future 在 await 点被 drop 或 task 被 abort 时,内部状态会被丢弃,可能导致互斥锁在保护的不变量恢复前释放。作者用同步 Mutex 与 tokio Mutex 的对照示例复现状态机不变量被破坏,并列出 Dropshot 请求处理、tokio::select!、timeout、try_join 等取消来源。文章指出 tokio 对 cancellation safety 的说明零散且不完整,编译器无法检查,审计成本高。短期内通过让 Dropshot handler 独立成 task 缓解,长期需讨论是否迁移同步线程模型或制定取消安全规范。该文不提供完整解决方案,重点在界定问题、风险与取舍边界。

推荐收录,因为它以 Oxide 真实控制平面 bug 为例,给出可复现的同步/异步 Mutex 对照代码,并系统梳理任务取消安全的来源、风险与 FAQ 取舍。对使用 Rust 构建分布式后端、维护长期控制面或评估 async 架构的读者,文中的 await 点不变量、取消传播和短期缓解策略具有直接迁移价值;需注意它聚焦问题界定,不提供完整解决方案。

工程实践Oxide Public RFDs

RFD 0079: Rust approaches to concurrency in the control plane

本文是 Oxide 的 RFD 79,讨论控制平面软件在 Rust 中应选择 async/await 事件驱动还是同步多线程(threaded)方案。作者从内存占用、线程池规模设定、病态场景行为、编程模型易用性与可调试性五个维度逐项对比,并用权衡表和风险表量化两种方案的优劣、发生概率与缓解手段。核心结论是:在能够按需投入可调试性建设(自定义 executor、动态追踪、指标采集等)的前提下,建议继续沿用基于 async/await 的事件驱动方案。文章还讨论了不使用 async/await 的事件方案与 channel 通信的取舍,以及该决策难以低成本回退的边界。

推荐收录,因为它把一次真实且代价高昂的并发模型选型拆解为内存、线程池调优、病态故障、编程模型和可调试性等可验证维度,并给出风险概率、严重度与缓解措施。对负责 Rust 后端、控制平面或高可用服务的工程师,文中关于线程池设置、超时与并发上限、异步调试取舍的分析可直接迁移到类似系统设计中。

技术文章LWN.net

[$] Stabilizing Rust's never type

文章介绍了 Rust 语言中 "never" 类型(以感叹号 ! 表示)的稳定化过程。该类型用于标记永不返回的函数以及其他永远不可能产生值的场景,长期以来它只是编译器内部功能,属于不稳定特性。直到 2024 年 8 月 24 日,Rust 编译器贡献者 "waffle" 经过两年多的工作终于将其稳定化。过程耗时较长,部分原因是该特性涉及对旧版本 Rust 的一个小的破坏性变更,编译器维护者需要确认这不会对大量实际代码造成影响。文章还涉及类型强制转换、编译器演进、版本兼容性处理等细节,有助于理解 Rust 类型系统的演进路径和语言特性稳定化背后的工程权衡。

推荐收录,这是一篇来自 LWN 的权威技术报道,直接解释了 Rust never 类型的设计意图与稳定化过程中遇到的版本兼容性挑战。适合作 Rust 开发者、编程语言设计者和编译器爱好者阅读,其中关于破坏性变更评估和跨版本兼容的经验也可迁移到其他系统的长期演进中。

工程实践Xe Iaso

It took a year to ship WebAssembly in Anubis

文章讲述作者花一年把 WebAssembly 工作量证明引入 Go 反爬服务 Anubis 的完整工程经过。原实现需在 JavaScript 与 Go 间维护两份代码,且难度按前导半字节计数、最坏情况加一级会放大千倍;新方案用 Rust no_std 生成 wasm32-unknown-unknown 二进制,由浏览器和服务器执行同一份产物,并使用 argon2id 内存硬算法改善手机端体验。文中详述了无法使用 WebAssembly Component Model 时如何手工设计三缓冲 ABI、为兼容 Chrome 75 做 SIMD 拆分与 wasm-opt 特性裁剪,以及如何用 wasm2js 兜底禁用 WebAssembly 的浏览器。工程陷阱包括首次遇到的 LLVM 编译器 bug、rust-std 预编译导致旧浏览器崩溃,作者用提交构建工具与 chromesweep 旧浏览器测试应对。功能计划在 v1.28.0 默认关闭,v1.29.0 根据反馈再决定是否打开,并保留了若干已知边界。

推荐收录。文章是真实项目的一手长程复盘,明确写出了共享二进制方案、手工 ABI 限制、旧浏览器兼容成本和编译器工具链意外,并保留已知问题而不是包装成完美故事。适合研究 WebAssembly 模块化、反爬 PoW 或 Go/Rust 混合构建的工程师,其可复现构建、特性裁剪和多版本浏览器测试思路可直接迁移到同类项目。

技术文章Amazon Science

Developing provably correct Rust code with Verus

本文介绍 Verus——一个开源的 Rust 自动化程序验证器,它通过形式化数学规格机械地检查代码在所有可能输入下是否满足规格,从而弥补 Rust 类型系统只能保证内存安全、无法保证逻辑正确性的不足。文章以二分查找为例,说明了前置条件(requires)和后置条件(ensures)的写法,并强调 Verus 使用 Rust 风格语法,开发者可在源码中直接编写规格和证明,编译器会忽略这些注解,因此验证与未验证的代码可共存。Verus 还支持验证 unsafe 代码的机器检查安全性,以及通过锁不变量证明并发代码的正确性,Amazon 已将其用于 Nitro Isolation Engine 等关键基础设施。此外,文章列举了 Vest、Verdict、CapybaraKV、Atmosphere、Anvil、CortenMM 等开源验证项目,并指出验证结论的可靠性依赖于 Verus 自身、顶层规格、底层运行时假设和工具链的正确性。整体上,文章清晰解释了程序验证的机制、设计权衡与实际应用边界。

文章不是泛泛介绍,而是系统性地说明了 Verus 的验证原理、源码内嵌规格的设计抉择、对 unsafe 和并发代码的支持,并给出了真实用例与验证依赖的边界条件,具有长期参考价值。适合 Rust 开发者、系统软件工程师及对形式化方法感兴趣的读者,能帮助理解程序验证在工业界的实践方式和限制。

工程实践ScyllaDB Engineering

A Self-Baked Async FFI Framework for Rust C# Interop

本文记录 ScyllaDB 驱动团队自研 Rust 与 C# 异步 FFI 框架的过程,目标是在 C# 驱动之上复用 Rust 驱动。作者认为现有 uniffi-rs、csbindgen 等绑定生成器缺少异步互操作支持,故选择基于 C ABI 手工实现。文章详述双向调用:C# 调用 Rust 用 P/Invoke,Rust 回调 C# 用 UnmanagedCallersOnly 和静态委托;异步场景通过 TaskCompletionSource 与 Task Control Block 桥接 tokio 和 .NET 运行时,并说明 RunContinuationsAsynchronously 对避免 tokio 线程饥饿的关键作用。数据传递使用 FFISlice、FFIString、FFIBool 等布局兼容类型,规避 bool 表示不一致问题;内存管理分别采用 SafeHandle、GCHandle 和栈固定。该方案针对特定驱动场景,性能评测另文发布,本文贡献主要在异步运行时桥接和跨语言内存安全的工程经验。

推荐收录,因为文章不是泛泛的互操作教程,而是真实项目中的设计取舍与踩坑记录,包含 P/Invoke、反向 P/Invoke、异步运行时桥接、跨语言内存管理的具体实现和边界。对需要做 Rust/C# 集成、语言绑定或异步运行时协作的工程师很有借鉴价值,其中的 GCHandle 用法、tokio 饥饿规避、栈固定等技巧可迁移到类似场景;但它是为数据库驱动定制的框架,不是通用库,读者需结合自身约束评估。

工程实践Cloudflare Blog

How we saved 100 terabytes of memory by optimizing 1.1.1.1’s DNS cache

文章讲述Cloudflare如何通过五项存储布局优化,将1.1.1.1 DNS缓存每条目的内存占用降低56%,在超过2500亿条缓存条目规模上节省约100TB内存。核心方法包括用Box替代Vec消除容量字段和堆预留空间、用区间偏移替代多个列表、对与查询域名相同的记录省略owner字段、将大枚举变体装箱以避免对齐填充浪费,以及将记录以原始字节加长度前缀连续存储。文章用自定义分配器基准测算了内存和性能,并在生产环境逐步验证,最终插入吞吐提升43%、查询延迟下降19%。边界在于这些优化依赖特定访问模式和数据分布,如大多数记录owner与查询域名一致、NAPTR等大类型罕见,且需要权衡解析成本和随机访问能力。

推荐收录。文章展示了从内存布局分析、基准验证到生产逐步灰度落地的完整优化流程,所有结论都有数据支撑,并明确说明取舍和适用边界。适合从事高并发缓存、DNS服务、存储密集型系统或Rust性能优化的工程师,'按数据分布定制数据结构'的思路可迁移到其他大规模系统。

工程实践ScyllaDB Engineering

Building a New Rust Driver for ScyllaDB’s DynamoDB API – with 58% More Throughput

文章介绍了为 ScyllaDB 的 DynamoDB 兼容 API(Alternator)构建新 Rust 驱动程序的工程实践。由于 AWS DynamoDB SDK 面向单端点托管服务,无法利用 ScyllaDB 多节点多分片的分布式架构,团队基于 aws-sdk-dynamodb 封装了新的 alternator-client-rust,通过 Interceptor 机制注入拓扑感知的负载均衡、头部剥离和请求压缩等优化,保持 API 兼容并实现了约 58% 的吞吐量提升。文章还详述了扩展 Latte 基准测试工具支持 DynamoDB API 的过程,采用条件编译隔离 CQL 与 Alternator 逻辑,并通过 Rune 脚本提供灵活的工作负载描述。基准测试对比了 Latte 与 YCSB 的差异,以及新驱动在不同负载均衡策略下的表现,指出在热分区和轻量事务场景下 key affinity 策略优于 round-robin。文章基于特定 ScyllaDB 版本和测试环境,结果适用于使用 ScyllaDB Alternator 的高吞吐场景,但对其他数据库或云服务的可迁移性有限。

推荐收录,因为它展示了从适配现有 SDK、定位吞吐瓶颈到实现负载均衡与压缩优化并完成基准验证的完整工程链路,提供了可量化的性能数据和具体的架构取舍。对从事数据库驱动开发、分布式系统客户端优化或基准测试工具设计的读者,文中的拓扑感知路由、拦截器使用和条件编译改造方法具有直接迁移价值;同时需注意其结论依赖 ScyllaDB 特定架构。

技术文章matklad

Rust Glancer

文章由rust-analyzer作者撰写,围绕低内存Rust LSP服务Rust Glancer展开,深入反思了rust-analyzer的架构设计。作者认为rowan语法树适合增量编辑,但大多数依赖包只需浅层分析,主张AST应基于数组存储,并对函数体分析采用惰性策略。文中对比IntelliJ的PSI多后端(语法树、stub树、class反编译)与rustc的.rmeta文件,提出类似的分层架构:用户编辑的文件用增量AST,依赖包用紧凑的元数据。还讨论了proc macro展开成本高,可借用Sorbet的shim思路规避,以及LSP数据同步的固有缺陷。最后点明rust-analyzer核心抽象API未完成的问题。这是对IDE工具链架构的深度思考。

推荐收录:作者是rust-analyzer核心开发者,文章直接给出IDE架构的关键权衡,如AST存储、惰性分析、依赖元数据复用,以及对IntelliJ/rustc机制的迁移分析。适合编译器/IDE开发者、编程语言工具链研究者阅读,其“分层源码表示”思路可迁移到其他语言工具。风险是部分观点属个人倾向,需结合工程验证。

技术文章Eli Bendersky

Concurrent Servers: Part 7 - Rust

文章是“Concurrent Servers”系列第7篇,聚焦Rust语言实现并发网络服务器。作者先回顾了顺序服务器基准,然后给出Rust中“一线程一客户端”和固定线程池的实现,说明如何用crossbeam_channel实现多消费者任务队列和背压。随后重点介绍基于tokio的异步事件驱动服务器,对比了同步与异步版本代码,指出Rust将异步核心语法内建、但事件循环交给外部库的设计,并讨论阻塞任务在异步上下文中的问题。文章还实现了带Redis缓存的异步素性测试服务器,展示共享异步连接的克隆式传递以及async/await对复杂回调的简化。最后总结Rust异步编程仍面临函数颜色问题和阻塞/非阻塞分离的挑战,所有代码可在GitHub获取。

推荐收录。该文是知名系列中针对Rust的深入补充,不仅展示代码,还解释了线程池、背压、tokio任务、函数颜色问题等关键概念及其边界,适合想理解Rust并发服务端实践的读者。文中的线程池与异步设计对比、阻塞任务处理方式等可迁移到其他语言或框架,具有长期参考价值。

技术文章Faultlore

Pair Your Compilers At The ABI Café - Faultlore

文章讨论跨语言 ABI/FFI 兼容性,从 rustc、clang、gcc 对 __int128 的传递分歧切入,指出 ABI 多数未规范化,跨语言调用本质上是类型双关。作者介绍 abi-cafe:根据抽象类型与函数签名生成 caller/callee 代码,双方用 write_val 回调上报所见字节,由测试框架比对,从而在不预设 ABI 实现的前提下发现编译器分歧。1.0 因用具体值描述签名而无法表达枚举、联合等类型;2.0 改用 kdl-script 类型系统和 pun types 描述不同语言中结构不同的对应类型,并处理 tagged/untagged union、repr(transparent)、Option<&T> 优化等双关。核心未解难题是同步不同形状类型树的遍历与比较,项目仍属 WIP。适合编译器、FFI 与系统编程读者。

推荐收录:文章给出 abi-cafe 的黑盒 ABI 测试方法、graffiti value、复合类型树遍历等可迁移设计,并用 __int128 等真实编译器分歧证明其价值。它对 Rust/C FFI、编译器后端和系统编程读者尤其有用,可帮助理解 ABI 测试边界;需注意 2.0 仍为 WIP,复杂类型双关同步尚未完成。