NVIDIA Dynamo 源码阅读(二):分布式运行时如何组织服务与请求

Dynamo 的推理组件能够跨进程、跨节点组合,核心依赖 lib/runtime。这一层不理解模型,也不关心 token 的语义;它提供的是一套分布式组件模型:服务如何命名、实例如何注册、客户端如何发现、请求如何流式传输。 本文基于 Dynamo 提交 27f09d5。 一、运行时的核心抽象 源码从 DistributedRuntime 开始。它持有运行时配置、服务发现实现、网络管理器和关闭信号,并向上提供 Namespace。 对象关系可以简化为: DistributedRuntime └── Namespace("dynamo") ├── Component("frontend") │ └── Endpoint("generate") ├── Component("router") │ └── Endpoint("generate") └── Component("worker") └── Endpoint("generate") × N instances 这四层各有不同职责: Runtime:进程级资源和生命周期; Namespace:隔离一组服务; Component:表示逻辑服务角色; Endpoint:表示可调用接口及其多个实例。 Endpoint 名字相同不代表只有一个服务器。每个 Worker 可注册自己的 instance,客户端通过 discovery 得到动态实例集合。 二、服务发现保存什么 lib/runtime/src/discovery 定义了发现层。一个 Endpoint 注册时,系统不仅记录地址,还附带实例、组件和元数据。客户端查询的关键维度是: (namespace, component, endpoint) -> [instance...] 在裸机模式中,注册与租约可由 etcd 支持;Kubernetes 模式使用 DynamoWorkerMetadata CRD 和 EndpointSlice。运行时把发现后端抽象掉,上层 Router 不需要分别实现 etcd watcher 与 Kubernetes watcher。 ...

2026年8月26日 · 2 分钟 · Hellokitty

Rust 异步编程原理:Future、状态机、Waker 与 Executor

Rust 的 async/await 写起来很像同步代码:调用异步函数、等待结果,然后继续向下执行。但它的底层既不会为每个任务创建一个线程,也不会在 await 时阻塞当前线程。 它真正做的事情是:编译器把异步函数转换成一个可以暂停和恢复的状态机,这个状态机实现 Future;Executor 反复调用 poll 推进状态机,Waker 在资源就绪后通知 Executor 再次调度。 本文从一段普通异步代码出发,逐层解释: async fn 返回的到底是什么; await 为什么能暂停函数; 异步代码和状态机是什么关系; Future::poll、Context 和 Waker 分别负责什么; Executor 与 Reactor 如何配合; 为什么 Rust 异步需要 Pin; Tokio 在这套模型中处于什么位置。 本文定位为 《Rust Tokio Runtime 原理与最佳实践》 的前置教程。建议先理解本文中的 Future::poll、状态机、Waker 和 Executor,再继续阅读 Tokio 的调度器、I/O Driver、任务取消与工程实践。 阅读前准备 读者只需要了解 Rust 的基本语法、所有权、枚举和 trait,不要求提前掌握 Tokio。 文中的普通 Rust 代码可以放入一个空项目中实验: cargo new rust-async-basics cd rust-async-basics 涉及 Tokio 的示例可加入依赖: [dependencies] tokio = { version = "1", features = ["full"] } 学习时建议始终追问三个问题: ...

2026年8月25日 · 7 分钟 · Hellokitty

Rust Tokio 深入解析:运行时原理、并发模型与最佳实践

Rust 语言只定义了 Future、async/await 和 Waker 等异步基础设施,并没有在标准库中提供完整的异步运行时。Tokio 补齐了这一层:它提供任务调度器、网络 I/O 驱动、定时器、异步同步原语、异步文件接口以及阻塞任务隔离机制。 如果把 Rust 异步程序比作一座城市: Future = 等待执行的工作 Executor/Scheduler = 安排工作在哪个线程运行 I/O Driver = 监听 socket 是否就绪 Timer Driver = 管理定时器何时到期 Waker = 通知某个任务可以继续 Tokio = 将上述组件组合成运行时 本文不再重复 Future::poll 和状态机的基础推导,而是聚焦 Tokio 本身:runtime 如何启动,任务如何调度,网络 I/O 为什么不会阻塞线程,以及生产代码中应该怎样处理并发、超时、共享状态、CPU 密集任务和优雅退出。 一、Tokio 提供了什么 一个典型 Tokio 应用依赖: [dependencies] tokio = { version = "1", features = ["full"] } full 适合学习和应用开发,但库作者通常应该只启用实际需要的 feature,缩短编译时间并减少依赖面。 Tokio 的主要组成包括: 组件 作用 Runtime 组合调度器、I/O driver 和 timer driver Task 由 runtime 调度的异步任务 tokio::net TCP、UDP、Unix Socket 等异步网络接口 tokio::time sleep、interval、timeout tokio::sync channel、Mutex、RwLock、Semaphore、Notify tokio::fs 文件系统异步接口 spawn_blocking 将阻塞或 CPU 密集工作移出异步 worker select! 同时等待多个异步分支 需要先建立一个重要认识: ...

2026年8月21日 · 6 分钟 · Hellokitty