actr-runtime 0.1.3

Runtime layer for Actor-RTC framework - actor system, scheduler, and orchestration
Documentation
# actr-runtime 内部架构

**文档目的**:为贡献者和高级用户提供 runtime crate 的内部架构视图

**最后更新**:2025-11-07
**对应版本**:actr v0.9.x

---

## 1. 模块概览

`actr-runtime` crate 实现了 Actor 运行时的核心功能,包括生命周期管理、消息路由、传输层抽象、持久化等。

```
actr-runtime/
├── lifecycle/          # Actor 生命周期管理
│   ├── actr_system.rs  # ActrSystem(基础设施)
│   └── actr_node.rs    # ActrNode(完整节点)
├── inbound/            # 入站消息处理
│   ├── data_stream_registry.rs     # DataStream 快车道注册表
│   ├── media_frame_registry.rs     # MediaFrame 快车道注册表
│   └── inbound_packet_dispatcher.rs # 入站消息分发器
├── outbound/           # 出站消息处理
│   ├── inproc_out_gate.rs   # 进程内出站门
│   └── outproc_out_gate.rs  # 跨进程出站门
├── transport/          # 传输层抽象
│   ├── lane.rs              # DataLane 统一抽象
│   ├── route_table.rs       # PayloadType 路由表
│   ├── manager.rs           # TransportManager trait
│   ├── inproc_manager.rs    # 进程内传输管理
│   ├── dest_transport.rs    # 目标传输抽象
│   ├── wire_pool.rs         # Wire 连接池
│   └── wire_handle.rs       # Wire 句柄
├── wire/               # 底层传输协议
│   ├── webrtc/              # WebRTC 实现
│   │   ├── coordinator.rs   # WebRTC 协调器
│   │   ├── gate.rs          # WebRTC 门(入站)
│   │   ├── connection.rs    # WebRTC 连接
│   │   ├── negotiator.rs    # SDP 协商器
│   │   └── signaling.rs     # 信令客户端
│   ├── websocket/           # WebSocket 实现
│   │   └── connection.rs    # WebSocket 连接
│   └── mpsc.rs              # 进程内 mpsc 实现
├── context.rs          # Context 实现
├── context_factory.rs  # Context 工厂
├── actr_ref.rs         # ActrRef(Actor 引用)
└── error.rs            # 错误类型定义
```

---

## 2. 分层架构

runtime 采用 4 层架构设计:

```
┌─────────────────────────────────────────┐
│  Layer 3: Application (Workload)        │  用户业务逻辑
├─────────────────────────────────────────┤
│  Layer 2: Outbound/Inbound              │  出入站门抽象
│    - OutGate (InprocOut/OutprocOut)     │
│    - WebRtcGate / Inproc 接收循环        │
├─────────────────────────────────────────┤
│  Layer 1: Transport (DataLane)          │  传输通道抽象
│    - DataLane (Mpsc/WebRtcDataChannel)  │
│    - TransportManager                   │
│    - WirePool                           │
├─────────────────────────────────────────┤
│  Layer 0: Wire (Protocol)               │  物理传输协议
│    - WebRTC (DataChannel + RTP)         │
│    - WebSocket                          │
│    - tokio::sync::mpsc                  │
└─────────────────────────────────────────┘
```

### 关键设计原则

1. **层次分离**:每层只依赖下一层,不跨层调用
2. **统一抽象**:通过 DataLane 统一 Inproc 和 Outproc 路径
3. **PayloadType 路由**:编译时确定消息路由策略
4. **零成本抽象**:Inproc 路径零序列化,Outproc 路径零拷贝

---

## 3. 核心组件职责

### 3.1 生命周期管理(lifecycle/)

**ActrSystem**:
- 职责:提供无泛型的基础设施(Mailbox、SignalingClient、ContextFactory)
- 生命周期:从创建到 attach(workload) 转换为 ActrNode
- 关键方法:`new()`, `attach<W>()`

**ActrNode<W>**:
- 职责:泛型化的完整节点,持有 Workload 和运行时组件
- 生命周期:从 attach 到 startup() 启动
- 关键方法:`startup()`, `handle_incoming()`, `shutdown()`

### 3.2 入站处理(inbound/)

**WebRtcGate**:
- 职责:消费 `WebRtcCoordinator` 聚合的入站数据,直接根据 PayloadType 分发
- 路由规则:
  - RpcReliable/RpcSignal → Mailbox(按优先级入队,同时处理 pending_requests)
  - StreamReliable/StreamLatencyFirst → DataStreamRegistry(快车道回调)
  - MediaRtp → 直接丢弃并提示应走 WebRTC Track(MediaFrameRegistry 由 PeerConnection 注册)

**Inproc 接收循环**:
- 职责:`ActrNode` 内的两个 tokio 循环(Shell→Workload、Workload→Shell)直接从 `InprocTransportManager``DataLane::Mpsc` 收包
- Shell→Workload:解出 `RpcEnvelope` 后调用 `handle_incoming()`
- Workload→Shell:根据 `request_id` 调用 `complete_response()` 唤醒请求方

**DataStreamRegistry**:
- 职责:管理 DataStream 回调注册表(stream_id → callback)
- 并发安全:使用 DashMap 支持多线程并发访问
- 回调签名:`FnMut(DataStream, ActrId) -> BoxFuture<ActorResult<()>>`

**MediaFrameRegistry**:
- 职责:管理 MediaTrack 回调注册表(track_id → callback)
- 并发安全:使用 DashMap
- 回调签名:`FnMut(MediaSample, ActrId) -> BoxFuture<ActorResult<()>>`

### 3.3 出站处理(outbound/)

**OutGate** enum:
- `InprocOut(Arc<InprocOutGate>)`:进程内出站
- `OutprocOut(Arc<OutprocOutGate>)`:跨进程出站
- 设计优势:静态分发,零虚拟调用开销

**InprocOutGate**:
- 职责:通过 InprocTransportManager 发送进程内消息
- 特点:零序列化,直接传递 RpcEnvelope 对象
- 延迟:~10μs

**OutprocOutGate**- 职责:通过 OutprocTransportManager 发送跨进程消息
- 特点:Protobuf 序列化,通过 WebRTC/WebSocket 传输
- 延迟:1-50ms(取决于网络)
- pending_requests:管理 RPC 请求-响应匹配

### 3.4 传输层(transport/)

**DataLane** enum:
- `Mpsc { payload_type, tx, rx }`:进程内 tokio mpsc 通道
- `WebRtcDataChannel { data_channel, rx }`:WebRTC DataChannel
- `WebSocket { sink, payload_type, rx }`:WebSocket 连接

**PayloadTypeExt** trait:
- 核心方法:`data_lane_types() -> &'static [DataLaneType]`
- 作用:提供 PayloadType 到 DataLaneType 的静态路由表
- 优势:编译时确定,零运行时开销

**TransportManager** trait:
- 职责:管理传输通道的生命周期(创建、缓存、复用)
- 实现:
  - `InprocTransportManager`:管理进程内 mpsc 通道
  - `OutprocTransportManager`:管理 WebRTC/WebSocket 连接

### 3.5 Wire 层(wire/)

**WebRtcCoordinator**:
- 职责:管理所有 WebRTC peer connections 的生命周期
- 关键功能:
  - 启动多 PayloadType 接收循环(RpcReliable, RpcSignal, StreamReliable, StreamLatencyFirst)
  - 聚合所有 peer 的消息到统一的 message_rx
  - 提供 `send_message()``receive_message()` 接口

**WebRtcGate**:
- 职责:WebRTC 入站消息路由(Coordinator → Mailbox/Registry)
- 路由逻辑:
  - 根据 PayloadType 分发消息
  - RPC 消息检查 pending_requests(响应匹配)
  - DataStream 消息直接派发到 DataStreamRegistry

**WebRtcConnection**:
- 职责:封装单个 RTCPeerConnection,管理 DataChannel 和 MediaTrack
- 关键方法:`create_data_channel()`, `get_lane()`, `add_track()`

---

## 4. 关键数据流

### 4.1 RPC 请求-响应流程

**发送端(OutprocOutGate)**:
```rust
1. send_request(target, envelope)
2. 生成 request_id,注册 oneshot::Sender 到 pending_requests
3. 序列化 RpcEnvelope → Bytes
4. TransportManager → DataLane → WebRTC
```

**接收端(WebRtcGate)**:
```rust
1. Coordinator.receive_message() → (from, data, RpcReliable)
2. 反序列化 Bytes → RpcEnvelope
3. 检查 request_id 是否在 pending_requests 中
4. 如果是响应:唤醒 oneshot::Sender
5. 如果是请求:enqueue(Mailbox)
```

### 4.2 DataStream 快车道流程

**发送端**:
```rust
1. ctx.send_data_stream(target, stream_id, chunk)
2. OutGate::send_stream_data(target, StreamReliable, data)
3. TransportManager → DataLane(StreamReliable) → WebRTC
```

**接收端**:
```rust
1. Coordinator.receive_message() → (from, data, StreamReliable)
2. WebRtcGate 识别 PayloadType::StreamReliable
3. 反序列化 Bytes → DataStream
4. DataStreamRegistry.dispatch(chunk, sender_id)
5. 调用注册的回调函数
```

---

## 5. 性能优化设计

### 5.1 零拷贝设计

- **Inproc 路径**:直接传递 `RpcEnvelope` 对象,无序列化
- **Outproc 路径**:使用 `Bytes` 类型(Arc<Vec<u8>>),浅拷贝
- **MediaTrack**:WebRTC 原生 RTP 通道,绕过 Protobuf 序列化

### 5.2 编译时路由

- **PayloadTypeExt**:路由表在编译时确定,无运行时查表
- **MessageDispatcher**:静态分发,零 dyn trait object 开销
- **OutGate enum**:静态分发,优于 trait object

### 5.3 细粒度并发

- **DashMap**:用于 Registry,支持高并发读写
- **独立接收循环**:每个 PayloadType 独立 tokio 任务
- **无锁设计**:尽可能使用 mpsc/oneshot 避免锁竞争

---

## 6. 错误处理策略

### 6.1 错误类型层次

```rust
RuntimeError
├── TransportError      # 传输层错误(连接断开、超时)
├── ProtocolError       # 协议错误(反序列化失败)
└── Other(anyhow::Error)  # 其他错误
```

### 6.2 错误传播

- **传输层错误**:自动重试(带 exponential backoff)
- **协议错误**:记录日志,丢弃消息
- **应用层错误**:通过 RpcEnvelope.error 返回给调用方

---

## 7. 测试策略

### 7.1 单元测试

- `transport/lane.rs`:DataLane 创建和收发测试
- `inbound/data_stream_registry.rs`:回调注册和触发测试
- `outbound/inproc_out_gate.rs`:进程内消息发送测试

### 7.2 集成测试

- `tests/local_echo_integration_test.rs`:Inproc RPC 完整流程
- `examples/data-stream/`:Outproc DataStream 端到端测试
- `examples/media-relay/`:MediaTrack 端到端测试

---

## 8. 依赖图

```
actr-runtime
├── actr-framework     (trait 定义)
├── actr-protocol      (协议定义)
├── actr-mailbox       (持久化 Mailbox)
├── tokio              (异步运行时)
├── webrtc             (WebRTC 实现)
├── tokio-tungstenite  (WebSocket 实现)
├── dashmap            (并发哈希表)
└── anyhow             (错误处理)
```

---

## 9. 贡献指南

### 9.1 代码组织原则

1. **单一职责**:每个模块只负责一个清晰的功能
2. **依赖倒置**:高层模块依赖抽象(trait),不依赖具体实现
3. **开闭原则**:通过 enum 和 trait 扩展功能,而非修改现有代码

### 9.2 命名约定

- **Manager**:管理生命周期的组件(如 TransportManager)
- **Registry**:管理回调注册的组件(如 DataStreamRegistry)
- **Gate**:消息出入口抽象(如 WebRtcGate, OutGate)
- **Coordinator**:协调多个相关组件的组件(如 WebRtcCoordinator)

### 9.3 提交 PR 前检查清单

- [ ] 单元测试通过
- [ ] 集成测试通过
- [ ] 更新相关文档(README, ARCHITECTURE.md)
- [ ] 代码符合 rustfmt 和 clippy 规范
- [ ] 性能敏感路径无明显回归

---

## 10. 参考资料

- [用户文档:Runtime 设计]../../actor-rtc.github.io/zh-hans/appendix-runtime-design.zh.md
- [用户文档:术语表]../../actor-rtc.github.io/zh-hans/appendix-glossary.zh.md
- [用户文档:Lane 选择策略]../../actor-rtc.github.io/zh-hans/appendix-lane-selection-strategy.zh.md
- [actr-protocol README]../protocol/README.md
- [actr-framework README]../framework/README.md

---

**维护者**:actr 核心团队
**问题反馈**:https://github.com/actor-rtc/actr/issues