执行器架构设计
本文引用的文件
- EXECUTOR_MODES.md
- README.md
- PROTOCOL_PIPELINE_RELAY_ARCHITECTURE.md
- 14-future.md
- logic_executor_interfaces.v
- types.v
- registry.v
- runtime_selection.v
- lifecycle.v
- socket_worker_executor.v
- php_cgi_executor.v
- inproc_vjsx_bootstrap_runtime.v
- kernel.v
- app_facade.v
- admin_runtime_plan_replacement_runtime.v
- admin_runtime_plan_replacement_apply.v
- runtime_plan_bridge.v
目录
引言
本文件聚焦 vhttpd 的执行器模式与架构,系统性阐述: - 执行器选择算法与运行时计划编译 - 应用门面(AppFacade)模式 - 执行器与调度内核的交互机制、请求分发流程与响应处理管道 - 不同执行器模式的适用场景与性能特征 - 架构图与数据流图 - 扩展点设计与未来演进方向
vhttpd 将“请求逻辑”抽象为可插拔执行器,统一暴露 HTTP、WebSocket、Stream、MCP 等协议能力,并通过生命周期与工厂注册机制实现多执行器共存与动态切换。
项目结构
围绕执行器相关的关键目录与文件: - src/executor:执行器接口、类型、内置执行器(PHP Worker、PHP-CGI、vjsx 嵌入式)、生命周期、运行时选择与注册表 - src/dispatch:调度内核与通用构造器(构建 Stream/MCP/WebSocket 分发包) - docs/EXECUTOR_MODES.md:执行器模式说明与配置要点 - README.md:高层定位与设计原则 - admin_runtime_plan_replacement_*:运行时计划替换与热更新入口 - runtime_plan_bridge.v:从运行时计划解析执行器配置
graph TB
subgraph "执行器模块"
IF["接口定义<br/>logic_executor_interfaces.v"]
TY["类型与统计<br/>types.v"]
REG["注册表与规格<br/>registry.v"]
SEL["运行时选择<br/>runtime_selection.v"]
LC["生命周期<br/>lifecycle.v"]
SW["SocketWorker 执行器<br/>socket_worker_executor.v"]
CGI["PHP-CGI 执行器<br/>php_cgi_executor.v"]
VJSX["vjsx 启动引导<br/>inproc_vjsx_bootstrap_runtime.v"]
FACADE["应用门面 AppFacade<br/>app_facade.v"]
end
subgraph "调度内核"
KRN["调度内核与构造器<br/>dispatch/kernel.v"]
end
subgraph "运行时计划"
BRG["运行时计划桥接<br/>runtime_plan_bridge.v"]
REPL_RT["替换准备运行时代码<br/>admin_runtime_plan_replacement_runtime.v"]
REPL_APPLY["替换应用与事件<br/>admin_runtime_plan_replacement_apply.v"]
end
IF --> SW
IF --> CGI
IF --> VJSX
REG --> SEL
SEL --> LC
SEL --> REG
KRN --> IF
BRG --> SEL
REPL_RT --> BRG
REPL_APPLY --> REPL_RT
FACADE --> SW
FACADE --> CGI
FACADE --> VJSX
图表来源 - logic_executor_interfaces.v:1-51 - types.v:1-449 - registry.v:1-387 - runtime_selection.v:1-31 - lifecycle.v:1-179 - socket_worker_executor.v:1-157 - php_cgi_executor.v:1-118 - inproc_vjsx_bootstrap_runtime.v:1-42 - kernel.v:1-151 - app_facade.v:1-241 - runtime_plan_bridge.v:1-18 - admin_runtime_plan_replacement_runtime.v:1-32 - admin_runtime_plan_replacement_apply.v:73-115
章节来源 - EXECUTOR_MODES.md:1-136 - README.md:1-82
核心组件
- 执行器接口族:统一身份、生命周期与多种协议处理能力(HTTP、WebSocket 会话、Stream、MCP、WebSocket 上游/事件)。
- 类型与统计:执行器模型(worker/embedded)、后端模式(required/disabled)、管理面统计与调度上下文封装。
- 注册表与规格:内置执行器规格(kind、aliases、provider、model、worker_backend_mode、lifecycle、factory、config_surface),并提供配置解析与构建函数。
- 运行时选择:根据 CLI 参数或配置推断 kind,查找规格并返回 ExecutorRuntimeSelection(包含 executor、worker_backend_mode、lifecycle)。
- 生命周期:按执行器类型准备 bootstrap、启动/停止 worker 池或嵌入式宿主。
- 内置执行器:
- SocketWorkerExecutor:通过 Unix Socket 与 PHP Worker 通信,支持 HTTP/Stream/WebSocket/MCP。
- PhpCgiExecutor:基于 FastCGI 的 PHP 执行路径,仅支持 HTTP 响应。
- vjsx 嵌入式:进程内执行 TypeScript/JavaScript 应用,具备 lane 并发与签名刷新等特性。
- 应用门面 AppFacade:为执行器提供运行时配置、Worker 后端访问、平台能力、Provider 桥接、命令执行等统一入口。
- 调度内核:提供 Stream/MCP/WebSocket 请求的标准化构造器,屏蔽底层差异。
章节来源 - logic_executor_interfaces.v:1-51 - types.v:1-449 - registry.v:1-387 - runtime_selection.v:1-31 - lifecycle.v:1-179 - socket_worker_executor.v:1-157 - php_cgi_executor.v:1-118 - inproc_vjsx_bootstrap_runtime.v:1-42 - app_facade.v:1-241 - kernel.v:1-151
架构总览
vhttpd 以“协议无关的内核 + 可插拔执行器”为核心思想: - 协议接入层(HTTP/WebSocket/Stream/MCP)将请求归一化为内部交换契约 - 调度内核负责路由到具体执行器 - 执行器根据模型(worker/embedded)选择后端(外部进程/进程内) - 生命周期负责预热、启动、停止与资源回收 - 管理面与运行时计划支持热替换与诊断
sequenceDiagram
participant Client as "客户端"
participant Kernel as "调度内核<br/>dispatch/kernel.v"
participant Facade as "应用门面<br/>AppFacade"
participant Exec as "执行器<br/>LogicExecutor"
participant Backend as "后端(Worker/Embedded)"
Client->>Kernel : "HTTP/Stream/MCP/WebSocket 请求"
Kernel->>Facade : "获取运行时配置/Worker 后端信息"
Facade-->>Kernel : "配置/连接信息"
Kernel->>Exec : "调用对应 dispatch_* 方法"
alt 外部 Worker 模式
Exec->>Backend : "Unix Socket/FastCGI 发送帧"
Backend-->>Exec : "响应/流帧/上游计划"
else 嵌入式模式
Exec->>Backend : "进程内调用应用入口"
Backend-->>Exec : "响应/流帧"
end
Exec-->>Kernel : "标准化结果"
Kernel-->>Client : "HTTP 响应/流式输出/事件"
图表来源 - kernel.v:1-151 - app_facade.v:1-241 - logic_executor_interfaces.v:1-51 - socket_worker_executor.v:1-157 - php_cgi_executor.v:1-118 - inproc_vjsx_bootstrap_runtime.v:1-42
详细组件分析
执行器接口与类型
- 接口族:
- LogicExecutorIdentity:标识(model、kind、provider、admin_details)
- LogicExecutorLifecycleOps:warmup/close
- HttpLogicExecutor:HTTP 分发
- WebSocketSessionExecutor:WebSocket 会话打开
- StreamLogicExecutor:Stream 分发
- McpLogicExecutor:MCP 分发
- WebSocketUpstreamExecutor/WebSocketEventExecutor:WebSocket 上游/事件分发
- 类型:
- LogicExecutorModel:worker/embedded
- WorkerBackendMode:required/disabled
- Admin* 统计结构与 DispatchContext 封装
classDiagram
class LogicExecutorIdentity {
+model() LogicExecutorModel
+kind() string
+provider() string
+admin_details() LogicExecutorAdminDetails
}
class LogicExecutorLifecycleOps {
+warmup(app) !
+close() void
}
class HttpLogicExecutor {
+dispatch_http(app, req) !HttpLogicDispatchOutcome
}
class WebSocketSessionExecutor {
+open_websocket_session(app, req) !WebSocketSessionOpenOutcome
}
class StreamLogicExecutor {
+dispatch_stream(app, req) !transport.StreamDispatchResponse
}
class McpLogicExecutor {
+dispatch_mcp(app, req) !transport.WorkerMcpDispatchResponse
}
class WebSocketUpstreamExecutor {
+dispatch_websocket_upstream(app, req) !transport.WorkerWebSocketUpstreamDispatchResponse
}
class WebSocketEventExecutor {
+dispatch_websocket_event(app, frame) !transport.WorkerWebSocketDispatchResponse
}
class LogicExecutor {
}
LogicExecutor <|.. LogicExecutorIdentity
LogicExecutor <|.. LogicExecutorLifecycleOps
LogicExecutor <|.. HttpLogicExecutor
LogicExecutor <|.. WebSocketSessionExecutor
LogicExecutor <|.. StreamLogicExecutor
LogicExecutor <|.. McpLogicExecutor
LogicExecutor <|.. WebSocketUpstreamExecutor
LogicExecutor <|.. WebSocketEventExecutor
图表来源 - logic_executor_interfaces.v:1-51 - types.v:1-449
章节来源 - logic_executor_interfaces.v:1-51 - types.v:1-449
执行器选择算法与运行时计划编译
- 选择流程:
- 优先读取 CLI 参数 --executor;否则依据配置推断(存在 php. 或 vjsx. 字段)
- 通过注册表匹配 kind/aliases,得到 BuiltinLogicExecutorSpec
- 调用 spec.runtime_selection 生成 ExecutorRuntimeSelection(含 executor、worker_backend_mode、lifecycle)
- 运行时计划编译:
- 从 RuntimePlan 中选取 listener 回退 engine,结合策略注入 WebSocket 并发策略
- 解析为 LogicExecutorRuntimePlan,供上层引擎构建使用
- 热替换:
- 准备阶段加载新计划、计算哈希、构建引擎与路由
- 应用阶段执行轻量替换、记录状态、发出事件
flowchart TD
Start(["开始"]) --> ReadCLI["读取 --executor 参数"]
ReadCLI --> HasKind{"是否指定 kind?"}
HasKind --> |是| FindSpec["注册表查找规格"]
HasKind --> |否| InferFromCfg["从配置推断 kind"]
InferFromCfg --> FindSpec
FindSpec --> BuildSel["spec.runtime_selection() 构建选择"]
BuildSel --> PlanBridge["从运行时计划解析执行器配置"]
PlanBridge --> Done(["完成: ExecutorRuntimeSelection"])
图表来源 - runtime_selection.v:1-31 - registry.v:1-387 - runtime_plan_bridge.v:1-18 - admin_runtime_plan_replacement_runtime.v:1-32 - admin_runtime_plan_replacement_apply.v:73-115
章节来源 - runtime_selection.v:1-31 - registry.v:1-387 - runtime_plan_bridge.v:1-18 - admin_runtime_plan_replacement_runtime.v:1-32 - admin_runtime_plan_replacement_apply.v:73-115
应用门面模式(AppFacade)
- 目的:为执行器提供统一的运行时访问点,避免直接耦合主进程状态
- 能力范围:
- 运行时配置与计划 JSON 读取
- Worker 后端配置(超时、环境、Socket 选择、队列回调)
- Stream/MCP/WebSocket 分发端口
- 平台能力与 Provider 桥接
- 命令执行与事件发射
- NoOp 实现:作为默认值用于字段初始化,便于测试与空实现
classDiagram
class AppFacade {
<<interface>>
+get_runtime_config_json() string
+get_runtime_plan_json() string
+worker_backend_read_timeout_ms() int
+worker_env() map[string]string
+worker_backend_select_socket_for_kind(kind) !string
+worker_websocket_open(...) !(bool,int,string)
+worker_backend_dispatch_stream(...) !...
+worker_backend_dispatch_mcp(...) !...
+worker_backend_dispatch_websocket_upstream(...) !...
+worker_backend_dispatch_websocket_event(...) !...
+emit(kind, fields) void
+admin_runtime_snapshot() AdminRuntimeSummary
+provider_bridge_dispatch_callback(...) !FeishuCardBridgeResult
+execute_websocket_dispatch_commands_result(...) ...
+run_command_envelopes(...) string
}
class NoOpAppFacade {
+各方法无操作或返回错误
}
AppFacade <|.. NoOpAppFacade
图表来源 - app_facade.v:1-241
章节来源 - app_facade.v:1-241
生命周期与后端管理
- 生命周期对象由函数指针构成,避免循环依赖,同时捕获 App 上下文
- PHP Worker 生命周期:
- prepare:解析 PHP 配置、构建环境变量与命令
- start:按需启动 ManagedWorkerPool,发射 worker.started/restart_scheduled 事件
- stop:停止所有受管 worker
- Embedded(vjsx)生命周期:
- 不启动外部 worker,禁用 stream/websocket 分发模式
- Disabled 生命周期:
- 完全禁用,worker 列表为空
sequenceDiagram
participant Main as "主进程"
participant LC as "生命周期"
participant Pool as "ManagedWorkerPool"
Main->>LC : "prepare_bootstrap(args, cfg, state)"
LC-->>Main : "state 填充(命令/环境/sockets)"
Main->>LC : "start(ctx)"
alt autostart=true
LC->>Pool : "start(cmd, env, sockets, workdir)"
Pool-->>LC : "返回受管 worker 列表"
LC-->>Main : "发射 worker.started/restart_scheduled"
else autostart=false
LC-->>Main : "跳过启动"
end
Main->>LC : "stop(ctx)"
LC->>Pool : "stop(managed_workers)"
图表来源 - lifecycle.v:1-179
章节来源 - lifecycle.v:1-179
内置执行器详解
SocketWorkerExecutor(PHP Worker)
- 模型:worker;后端模式:required
- HTTP 分发:
- 选择 socket -> 建立连接 -> 编码请求帧 -> 读取首帧
- 首帧为流则返回 .stream 并携带 conn;为上流计划则返回 .upstream_plan;否则解码为 .response
- WebSocket 会话:
- 选择 socket -> 握手 -> 接受后返回 conn 与 socket_path
- 其他分发:
- Stream/MCP/WebSocket 上游/事件均通过 AppFacade 提供的端口转发至后端
sequenceDiagram
participant Exec as "SocketWorkerExecutor"
participant Facade as "AppFacade"
participant WSock as "Worker Socket"
Exec->>Facade : "select_socket_for_kind('php')"
Facade-->>Exec : "socket_path"
Exec->>WSock : "connect + set_read_timeout"
Exec->>WSock : "encode_request + write_frame"
WSock-->>Exec : "read_frame"
alt 流式
Exec-->>Exec : "返回 .stream + conn"
else 上流计划
Exec-->>Exec : "返回 .upstream_plan"
else 普通响应
Exec-->>Exec : "decode response + 返回 .response"
end
图表来源 - socket_worker_executor.v:1-157 - app_facade.v:1-241
章节来源 - socket_worker_executor.v:1-157
PhpCgiExecutor(FastCGI)
- 模型:worker;后端模式:required
- HTTP 分发:
- 选择 socket -> 设置超时 -> 编码 FastCGI 请求 -> 解码响应
- 不支持 WebSocket/Stream/MCP/WebSocket 上游/事件,调用即报错
章节来源 - php_cgi_executor.v:1-118
vjsx 嵌入式执行器
- 模型:embedded;后端模式:disabled
- warmup:
- 保存 AppFacade 引用 -> 初始化占位 -> 遍历 lane 进行预热
- 确保 lanes 非空、app_entry 有效、启动签名刷新协程
- 行为:
- 自动禁用 worker sockets 与 autostart
- 当前作用域为 HTTP 分发与 websocket_upstream 分发
章节来源 - inproc_vjsx_bootstrap_runtime.v:1-42 - EXECUTOR_MODES.md:82-125
调度内核与请求分发
- 提供标准化构造器:
- Stream open/next/close
- MCP message
- WebSocket upstream 与 dispatch frame
- 错误分类:
- transport_failure 将后端错误映射为 status 与 error_class
- stream_failure 将 event='error' 转换为失败结构
flowchart TD
A["收到上游请求"] --> B["选择分发类型<br/>stream/mcp/websocket_upstream/websocket_dispatch"]
B --> C["构造标准请求/帧<br/>build_*_request/frame"]
C --> D["调用执行器对应 dispatch_* 方法"]
D --> E{"后端返回"}
E --> |成功| F["标准化结果/帧"]
E --> |错误| G["分类错误并返回"]
F --> H["返回给调用方"]
G --> H
图表来源 - kernel.v:1-151
章节来源 - kernel.v:1-151
依赖关系分析
- 低耦合高内聚:
- 执行器通过接口与门面解耦,注册表集中管理规格与构建
- 生命周期通过函数指针避免循环依赖
- 关键依赖链:
- registry.v 依赖 config 与 os,提供配置解析与命令构建
- runtime_selection.v 依赖 config 与 registry,决定最终执行器实例
- lifecycle.v 依赖 upstream.transport 与 log,协调 worker 池
- kernel.v 依赖 executor 与 upstream.transport,统一构造分发包
- app_facade.v 聚合多个子门面,屏蔽底层细节
graph LR
CFG["config"] --> REG["registry.v"]
OS["os"] --> REG
REG --> SEL["runtime_selection.v"]
CFG --> SEL
SEL --> LC["lifecycle.v"]
LC --> TR["upstream.transport"]
KRN["dispatch/kernel.v"] --> EXE["executor 接口"]
EXE --> FAC["app_facade.v"]
图表来源 - registry.v:1-387 - runtime_selection.v:1-31 - lifecycle.v:1-179 - kernel.v:1-151 - app_facade.v:1-241
章节来源 - registry.v:1-387 - runtime_selection.v:1-31 - lifecycle.v:1-179 - kernel.v:1-151 - app_facade.v:1-241
性能考量
- 外部 Worker 模式(PHP):
- 优点:隔离性强、易于横向扩展、适合长驻进程复用
- 关注点:Socket 选择与连接复用、读超时、队列深度与拒绝策略
- 嵌入式模式(vjsx):
- 优点:零跨进程开销、低延迟、适合轻量逻辑与快速迭代
- 关注点:lane 并发度、内存占用、签名刷新与热重载成本
- 通用优化建议:
- 合理设置 pool_size、read_timeout_ms、max_requests
- 启用观测指标(trace_id、exchange_id、pipeline_id)
- 控制背压(body/frame/pending 上限)
[本节为通用指导,无需源码引用]
故障排查指南
- 常见错误与定位:
- 未找到 worker_entry/app_entry/extensions:检查路径与权限
- 无法连接 worker socket:确认 socket 前缀、池大小与进程存活
- 解码失败:核对帧格式与超时设置
- vjsx 缺少 lanes 或 app_entry:检查构建产物与入口配置
- 事件与日志:
- worker.pool.empty / worker.started / worker.restart_scheduled
- 运行时计划替换事件:draining、rejected、replaced
- 工具与入口:
- 管理端查看执行器目录与运行时快照
- 使用运行时计划预览与应用流程验证变更
章节来源 - registry.v:290-323 - lifecycle.v:97-134 - admin_runtime_plan_replacement_apply.v:73-115
结论
vhttpd 的执行器架构以“接口化 + 注册表 + 生命周期”为核心,实现了多执行器并存与统一调度。通过 AppFacade 屏蔽底层差异,调度内核提供标准化分发,配合运行时计划与热替换机制,形成可扩展、可观测、可演进的执行底座。未来可在保持统一表面的前提下引入更多宿主(如 lua),并以能力接口逐步细化职责边界。
[本节为总结性内容,无需源码引用]
附录
执行器模式对比与适用场景
- PHP Worker:
- 适用:已有 PHP 生态、需要进程隔离与水平扩展
- 性能:跨进程开销,但可通过池与连接复用优化
- vjsx 嵌入式:
- 适用:轻量逻辑、快速原型、低延迟场景
- 性能:进程内执行,延迟更低,需关注内存与并发
章节来源 - EXECUTOR_MODES.md:25-125 - README.md:33-43
协议流水线与中继架构(概念)
- 目标:统一 Ingress -> Canonical Exchange -> Transforms -> Egress 的数据路径
- 中继:跨网络节点间以 Carrier/Channel/Agent 组织,保持流式、双向与会话语义
章节来源 - PROTOCOL_PIPELINE_RELAY_ARCHITECTURE.md:1-500
未来演进方向
- 能力接口拆分:HTTP/stream/session/event/MCP/transform handler 细粒度注册
- 开发者体验:CLI 工具、VS Code 插件、基准测试与内存优化
- 生态建设:更多宿主与协议适配,完善可观测性与安全策略
章节来源 - 14-future.md:1-102