系统架构总览
系统架构总览
本文介绍 Dynamo 的五层架构模型、核心概念定义以及数据流与控制流。
1. 五层架构模型#
Dynamo 采用经典的五层架构:
graph TB
subgraph app["应用层"]
HTTP["HTTP Server
OpenAI Compatible API"]
end
subgraph sched["调度层"]
FE["Frontend"]
PROC["Processor"]
ROUTER["KV-Aware Router"]
end
subgraph infer["推理层"]
W1["Worker 1
vLLM/TRT-LLM/SGLang"]
W2["Worker 2"]
W3["Worker N"]
PW["Prefill Worker"]
end
subgraph runtime["运行时层"]
RT["Distributed Runtime"]
REG["Component Registry"]
PIPE["Pipeline Engine"]
end
subgraph comm["通信层"]
ETCD[("etcd
服务发现")]
NATS[("NATS
事件总线")]
NIXL["NIXL
KV 传输"]
end
HTTP --> FE
FE --> PROC
PROC --> ROUTER
ROUTER --> W1
ROUTER --> W2
ROUTER --> W3
W1 --> PW
W1 --> RT
W2 --> RT
W3 --> RT
PW --> RT
RT --> ETCD
RT --> NATS
W1 -.-> NIXL
PW -.-> NIXL
2. 各层职责#
| 层 | 组件 | 职责 |
|---|
| 应用层 | HTTP Server | 提供 OpenAI 兼容 API |
| 调度层 | Frontend, Processor, Router | 请求处理、tokenization、智能路由 |
| 推理层 | Workers | 实际的模型推理 |
| 运行时层 | Runtime, Registry | 组件生命周期、服务发现 |
| 通信层 | etcd, NATS, NIXL | 协调、事件、数据传输 |
3. 核心概念定义#
3.1 Namespace(命名空间)#
逻辑隔离的组件集合,用于多租户或多环境:
# 创建命名空间
namespace = runtime.namespace("production")
namespace_dev = runtime.namespace("development")
graph TB
subgraph ns["命名空间隔离"]
subgraph prod["production"]
P1["Worker 1"]
P2["Worker 2"]
end
subgraph dev["development"]
D1["Worker 1"]
D2["Worker 2"]
end
end
3.2 Component(组件)#
可部署的服务单元,包含多个端点:
# 定义组件
@service(dynamo={"namespace": "production"})
class VllmWorker:
@dynamo_endpoint()
async def generate(self, request):
...
3.3 Endpoint(端点)#
组件暴露的可调用接口:
# 端点引用格式
endpoint: dynamo.Processor.chat/completions
# ^命名空间 ^组件 ^端点名
graph LR
subgraph endpoint["端点结构"]
NS["Namespace
dynamo"] --> COMP["Component
Processor"]
COMP --> EP["Endpoint
chat/completions"]
end
3.4 Service(服务)#
组件的运行实例,可以有多个副本:
ServiceArgs:
workers: 4 # 4 个服务实例
resources:
gpu: 1 # 每个实例 1 个 GPU
3.5 Pipeline(管道)#
数据流处理管道,支持流式处理:
graph LR
IN["输入"] --> OP1["Operator 1"]
OP1 --> OP2["Operator 2"]
OP2 --> OUT["输出流"]
4. 数据流与控制流#
4.1 请求处理全链路#
sequenceDiagram
participant Client
participant HTTP
participant Frontend
participant Processor
participant Router
participant Worker
participant KVCache
Client->>HTTP: POST /v1/chat/completions
HTTP->>Frontend: forward request
Frontend->>Processor: process request
Note over Processor: Tokenization
Note over Processor: Chat Template
Processor->>Router: route(token_ids)
Note over Router: 查询 KV Index
Note over Router: 计算匹配分数
Note over Router: 选择最优 Worker
Router->>Worker: generate(request)
loop Token Generation
Worker->>KVCache: read/write KV
Worker-->>Frontend: stream token
Frontend-->>HTTP: SSE event
HTTP-->>Client: token
end
Worker-->>Frontend: finish
Frontend-->>HTTP: [DONE]
HTTP-->>Client: stream end
4.2 事件传播机制#
系统使用 NATS 进行事件传播:
graph TB
subgraph produce["事件生产"]
W1["Worker 1"] --> |kv_stored| NATS[("NATS")]
W2["Worker 2"] --> |kv_stored| NATS
W1 --> |load_metrics| NATS
W2 --> |load_metrics| NATS
end
subgraph consume["事件消费"]
NATS --> |kv_events| IDX["KV Indexer"]
NATS --> |load_metrics| AGG["Metrics Aggregator"]
IDX --> ROUTER["Router"]
AGG --> ROUTER
end
4.3 状态同步策略#
Dynamo 使用最终一致性模型:
graph LR
subgraph sync["状态同步"]
LOCAL["本地状态"] --> |定期发布| NATS[("NATS")]
NATS --> |广播| OTHER["其他节点"]
OTHER --> |更新| REMOTE["远程缓存"]
end
一致性模型选择:
- 强一致需求(服务注册):使用 etcd
- 最终一致需求(KV 索引):使用 NATS 事件
5. 组件交互示意#
5.1 控制平面 vs 数据平面#
graph TB
subgraph control["控制平面"]
ETCD[("etcd")]
REG["服务注册"]
DISC["服务发现"]
REG --> ETCD
ETCD --> DISC
end
subgraph event["事件平面"]
NATS[("NATS")]
PUB["发布者"]
SUB["订阅者"]
PUB --> NATS
NATS --> SUB
end
subgraph data["数据平面"]
NIXL["NIXL"]
GPU1["GPU 1"]
GPU2["GPU 2"]
GPU1 --> |RDMA| GPU2
end
5.2 组件生命周期#
stateDiagram-v2
[*] --> Created: 创建
Created --> Registered: 注册到 etcd
Registered --> Running: 启动服务
Running --> Healthy: 健康检查通过
Healthy --> Running: 持续运行
Running --> Stopping: 收到停止信号
Stopping --> Deregistered: 从 etcd 注销
Deregistered --> [*]
6. 架构优势#
| 特性 | 说明 | 收益 |
|---|
| 分层架构 | 各层职责清晰 | 易于维护和扩展 |
| 服务发现 | 基于 etcd | 动态扩缩容 |
| 事件驱动 | 基于 NATS | 松耦合、高可扩展 |
| 零拷贝传输 | 基于 NIXL | 最小化延迟 |
| 多引擎支持 | 抽象接口 | 灵活选择后端 |
下一篇#
继续阅读 05-部署模式详解,了解 Dynamo 的四种部署模式及其适用场景。