Dandelion架构分析
项目概述
Dandelion是一个专注于最大化弹性的无服务器处理工作节点系统。该项目将应用程序分为不受信任的计算函数和受信任的通信函数,其中计算函数由用户提供,通信函数内置于系统中。
系统架构图
graph TB
%% 用户层
subgraph "用户层"
UC[用户代码/函数]
CL[组合语言描述]
end
%% HTTP前端层
subgraph "HTTP前端层 (server)"
HS[HTTP Server]
REQ[请求路由]
CFG[配置管理]
STATS[统计API]
end
%% 调度层
subgraph "调度层 (dispatcher)"
DISP[调度器核心]
FREG[函数注册表]
COMP[组合管理器]
RPOOL[资源池]
EQ[执行队列]
end
%% 解析层
subgraph "解析层 (dparser)"
PARSER[组合语言解析器]
AST[抽象语法树]
VALID[语法验证]
end
%% 机器接口层
subgraph "机器接口层 (machine_interface)"
%% 函数驱动器
subgraph "函数驱动器"
CDRV[计算驱动器]
SDRV[系统驱动器]
WQ[工作队列]
end
%% 内存域
subgraph "内存域管理"
MDOM[内存域接口]
CTX[上下文管理]
TRANS[数据传输]
end
end
%% 隔离后端层
subgraph "隔离后端层"
%% 计算后端
subgraph "计算后端"
CHERI[CHERI硬件隔离]
KVM[KVM虚拟化]
MMU[MMU进程隔离]
WASM[WASM沙箱]
end
%% 通信后端
subgraph "通信后端"
HTTP[HTTP客户端]
CACHE[Memcached]
end
%% 内存后端
subgraph "内存后端"
BYTES[字节上下文]
MMAP[内存映射]
MALLOC[标准分配]
RO[只读上下文]
end
end
%% 公共组件层
subgraph "公共组件层 (dandelion_commons)"
ERR[错误处理]
TYPES[类型定义]
RECORD[性能记录]
POOL[范围池]
end
%% 连接关系
UC --> HS
CL --> PARSER
HS --> REQ
REQ --> DISP
CFG --> DISP
STATS --> RECORD
PARSER --> AST
AST --> COMP
VALID --> COMP
DISP --> FREG
DISP --> COMP
DISP --> RPOOL
DISP --> EQ
EQ --> CDRV
EQ --> SDRV
CDRV --> WQ
SDRV --> WQ
CDRV --> CHERI
CDRV --> KVM
CDRV --> MMU
CDRV --> WASM
SDRV --> HTTP
SDRV --> CACHE
MDOM --> BYTES
MDOM --> MMAP
MDOM --> MALLOC
MDOM --> RO
CTX --> TRANS
TRANS --> MDOM
%% 所有组件都使用公共组件
DISP -.-> ERR
CDRV -.-> TYPES
SDRV -.-> RECORD
MDOM -.-> POOL
%% 样式定义
classDef userLayer fill:#e1f5fe
classDef serverLayer fill:#f3e5f5
classDef dispatcherLayer fill:#e8f5e8
classDef parserLayer fill:#fff3e0
classDef interfaceLayer fill:#fce4ec
classDef backendLayer fill:#f1f8e9
classDef commonLayer fill:#f5f5f5
class UC,CL userLayer
class HS,REQ,CFG,STATS serverLayer
class DISP,FREG,COMP,RPOOL,EQ dispatcherLayer
class PARSER,AST,VALID parserLayer
class CDRV,SDRV,WQ,MDOM,CTX,TRANS interfaceLayer
class CHERI,KVM,MMU,WASM,HTTP,CACHE,BYTES,MMAP,MALLOC,RO backendLayer
class ERR,TYPES,RECORD,POOL commonLayer
数据流架构图
graph LR
%% 数据流向
subgraph "请求处理流程"
A[HTTP请求] --> B[请求解析]
B --> C[函数查找]
C --> D[组合解析]
D --> E[依赖分析]
E --> F[资源分配]
F --> G[上下文创建]
G --> H[函数执行]
H --> I[结果收集]
I --> J[响应生成]
end
%% 并行执行模型
subgraph "并行执行模型"
K[输入数据集] --> L{分片策略}
L -->|All| M[单个函数实例]
L -->|Each| N[多个函数实例]
L -->|Key| O[按键分组执行]
M --> P[结果合并]
N --> P
O --> P
end
%% 内存管理流程
subgraph "内存管理流程"
Q[内存域] --> R[上下文分配]
R --> S[数据写入]
S --> T[函数访问]
T --> U[数据传输]
U --> V[上下文释放]
end
%% 样式
classDef process fill:#bbdefb
classDef decision fill:#ffcdd2
classDef data fill:#c8e6c9
class A,B,C,D,E,F,G,H,I,J process
class L decision
class K,M,N,O,P,Q,R,S,T,U,V data
组件交互图
sequenceDiagram
participant Client as 客户端
participant Server as HTTP服务器
participant Dispatcher as 调度器
participant Parser as 解析器
participant Registry as 函数注册表
participant Engine as 执行引擎
participant Domain as 内存域
%% 函数注册流程
Note over Client,Domain: 函数注册流程
Client->>Server: POST /register/function
Server->>Parser: 解析函数定义
Parser->>Registry: 注册函数元数据
Registry->>Domain: 预分配资源
Domain-->>Client: 注册成功
%% 函数执行流程
Note over Client,Domain: 函数执行流程
Client->>Server: POST /cold/function
Server->>Dispatcher: 创建执行请求
Dispatcher->>Registry: 查找函数信息
Registry->>Dispatcher: 返回函数配置
Dispatcher->>Domain: 分配执行上下文
Domain->>Engine: 创建执行环境
Engine->>Engine: 执行用户函数
Engine->>Domain: 写入执行结果
Domain->>Dispatcher: 返回结果上下文
Dispatcher->>Server: 返回执行结果
Server-->>Client: HTTP响应
核心设计理念
1. 信任分离架构
- 不受信任的计算函数: 用户提供的业务逻辑代码
- 受信任的通信函数: 系统内置的通信机制
- 通过隔离技术确保安全性和可靠性
2. 函数组合模型
- 函数可以组合成图结构,节点是函数,边描述数据传递关系
- 支持复杂的数据流和并行处理模式
- 使用专门的组合语言描述函数间的关系
模块架构
1. dandelion_commons
职责: 公共类型定义和错误处理
- 定义了整个系统使用的基础类型,如
FunctionId
- 统一的错误处理机制
DandelionError
枚举 - 记录和性能监控相关的类型定义
- 范围池管理器
range_pool
关键特性:
pub type FunctionId = u64;
pub enum DandelionError {
Dispatcher(DispatcherError),
DomainError(DomainError),
PromiseError(PromiseError),
// ... 其他错误类型
}
2. machine_interface
职责: 隔离后端和机器特定配置
- 提供多种隔离技术的统一接口
- 内存域管理和上下文处理
- 函数驱动器实现
子模块结构:
memory_domain
-
多种内存上下文实现:
BytesContext
: 基于字节的内存上下文CheriContext
: CHERI架构支持MmuContext
: MMU进程隔离WasmContext
: WebAssembly隔离MallocContext
: 标准内存分配MmapContext
: 内存映射
-
统一接口:
pub trait ContextTrait: Send + Sync {
fn write<T>(&mut self, offset: usize, data: &[T]) -> DandelionResult<()>;
fn read<T>(&self, offset: usize, read_buffer: &mut [T]) -> DandelionResult<()>;
fn get_chunk_ref(&self, offset: usize, length: usize) -> DandelionResult<&[u8]>;
}
function_driver
-
计算驱动器: 支持多种隔离技术
- CHERI: 硬件能力安全
- KVM: 虚拟化隔离(x86_64, aarch64)
- MMU: 进程级隔离
- WASM: WebAssembly沙箱
-
系统驱动器: 处理系统级函数
- HTTP通信
- Memcached缓存
-
工作队列机制:
pub enum WorkToDo {
FunctionArguments { config, context, output_sets, recorder },
TransferArguments { /* 数据传输参数 */ },
ParsingArguments { /* 解析参数 */ },
LoadingArguments { /* 加载参数 */ },
Shutdown(),
}
3. dispatcher
职责: 组合注册和调度
- 函数注册表管理
- 组合执行调度
- 资源池管理
- 执行队列管理
核心组件:
composition.rs
- 组合模型: 定义函数间的数据流关系
- 分片策略: 支持All、Each、Key三种并行模式
- 连接策略: Inner、Left、Right、Outer、Cross连接
- 数据集管理:
CompositionSet
处理跨上下文的数据集
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ShardingMode {
All, // 函数获取集合中的所有项目
Each, // 为每个项目运行单独的函数
Key, // 为每个不同的键运行单独的函数
}
dispatcher.rs
- 调度核心: 管理函数执行流程
- 依赖解析: 处理函数间的依赖关系
- 资源分配: 协调内存域和执行引擎
4. dparser
职责: 组合语言解析
- 解析组合描述语言
- 生成抽象语法树
- 支持函数声明、组合定义、并行策略
语言特性:
- 函数声明:
function HTTP(Request) => (Response);
- 组合定义:
composition image_process (images) => (status) { ... }
- 并行关键字:
all
,each
,keyed
- 连接策略:
by classified left fetched_archives
5. server
职责: HTTP前端包装
- HTTP服务器实现
- 请求路由和处理
- 配置管理
- 信号处理和优雅关闭
配置系统:
- 支持环境变量、命令行参数、JSON配置文件
- 核心分配策略(前端、调度器、IO、计算)
- 端口、日志级别等运行时配置
特性系统
Dandelion使用Cargo特性标志来启用/禁用不同的后端:
计算引擎特性
cheri
: CHERI硬件能力安全kvm
: KVM虚拟化隔离mmu
: 进程级隔离wasm
: WebAssembly隔离
通信引擎特性
reqwest_io
: HTTP通信支持
其他特性
timestamp
: 性能监控和时间戳bytes_context
: 字节上下文支持
数据流架构
1. 数据模型
pub struct DataSet {
pub ident: String,
pub buffers: Vec<DataItem>,
}
pub struct DataItem {
pub ident: String,
pub data: Position,
pub key: u32, // 用于分组和并行处理
}
2. 上下文管理
- 每个函数执行都有独立的上下文
- 支持跨上下文的数据传输
- 内存域提供隔离和资源管理
3. 传输机制
- 零拷贝数据传输(在可能的情况下)
- 支持不同内存域间的数据迁移
- 异步传输队列
并发和性能
1. 异步架构
- 基于Tokio的异步运行时
- 非阻塞I/O和任务调度
- 支持大规模并发
2. 核心亲和性
- 支持CPU核心绑定
- 分离前端、调度器、计算引擎到不同核心
- 优化NUMA架构性能
3. 资源池管理
- 计算资源池(CPU、GPU)
- 内存资源池
- 引擎队列管理
安全模型
1. 隔离技术
- CHERI: 硬件级内存安全
- KVM: 虚拟机级隔离
- MMU: 进程级保护
- WASM: 沙箱执行环境
2. 权限控制
- 系统调用白名单
- 内存访问控制
- 资源使用限制
3. 错误处理
- 分段错误检测
- 未授权系统调用拦截
- 优雅的错误恢复
扩展性设计
1. 模块化架构
- 清晰的模块边界
- 插件式后端支持
- 统一的接口抽象
2. 配置驱动
- 运行时后端选择
- 动态资源分配
- 灵活的部署选项
3. 监控和调试
- 详细的性能指标
- 时间戳追踪
- 统计信息API
技术亮点
1. 零拷贝优化
- 内存映射技术
- 引用传递
- 高效的数据传输
2. 类型安全
- Rust的内存安全保证
- 强类型系统
- 编译时错误检查
3. 异构支持
- 多架构支持(x86_64, aarch64)
- 多种隔离技术
- 灵活的部署模式
使用场景
1. 无服务器计算
- 函数即服务(FaaS)
- 事件驱动处理
- 自动扩缩容
2. 边缘计算
- 低延迟处理
- 资源受限环境
- 安全隔离需求
3. 数据处理管道
- 流式数据处理
- 批处理作业
- 复杂的数据转换
总结
Dandelion是一个设计精良的无服务器计算平台,具有以下核心优势:
- 安全性: 多层隔离技术确保函数执行安全
- 性能: 零拷贝、异步架构、核心亲和性优化
- 灵活性: 模块化设计、多后端支持、配置驱动
- 可扩展性: 清晰的架构边界、统一的接口抽象
- 易用性: 直观的组合语言、丰富的配置选项
该项目展现了现代系统编程的最佳实践,结合了Rust的安全性、异步编程的高性能和微服务架构的灵活性。
评论