系统架构总览

系统架构总览

本文介绍 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 的四种部署模式及其适用场景。