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

职责: 公共类型定义和错误处理

关键特性:

pub type FunctionId = u64;
pub enum DandelionError {
    Dispatcher(DispatcherError),
    DomainError(DomainError),
    PromiseError(PromiseError),
    // ... 其他错误类型
}

2. machine_interface

职责: 隔离后端和机器特定配置

子模块结构:

memory_domain

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

pub enum WorkToDo {
    FunctionArguments { config, context, output_sets, recorder },
    TransferArguments { /* 数据传输参数 */ },
    ParsingArguments { /* 解析参数 */ },
    LoadingArguments { /* 加载参数 */ },
    Shutdown(),
}

3. dispatcher

职责: 组合注册和调度

核心组件:

composition.rs

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ShardingMode {
    All,   // 函数获取集合中的所有项目
    Each,  // 为每个项目运行单独的函数
    Key,   // 为每个不同的键运行单独的函数
}

dispatcher.rs

4. dparser

职责: 组合语言解析

语言特性:

5. server

职责: HTTP前端包装

配置系统:

特性系统

Dandelion使用Cargo特性标志来启用/禁用不同的后端:

计算引擎特性

通信引擎特性

其他特性

数据流架构

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. 异步架构

2. 核心亲和性

3. 资源池管理

安全模型

1. 隔离技术

2. 权限控制

3. 错误处理

扩展性设计

1. 模块化架构

2. 配置驱动

3. 监控和调试

技术亮点

1. 零拷贝优化

2. 类型安全

3. 异构支持

使用场景

1. 无服务器计算

2. 边缘计算

3. 数据处理管道

总结

Dandelion是一个设计精良的无服务器计算平台,具有以下核心优势:

  1. 安全性: 多层隔离技术确保函数执行安全
  2. 性能: 零拷贝、异步架构、核心亲和性优化
  3. 灵活性: 模块化设计、多后端支持、配置驱动
  4. 可扩展性: 清晰的架构边界、统一的接口抽象
  5. 易用性: 直观的组合语言、丰富的配置选项

该项目展现了现代系统编程的最佳实践,结合了Rust的安全性、异步编程的高性能和微服务架构的灵活性。