Skip to main content

按核线程模型

每个 worker 线程绑定一个 CPU 核,并各自打开 SO_REUSEPORT 监听 socket。内核会把新连接自动分发到各个 worker。在请求处理过程中,worker 之间不会共享可变状态。 每个 worker 独占的资源: worker 之间共享(只读或原子)的资源:

io_uring 数据平面

Arc 直接使用 Linux io_uring,而不是 epoll 或 Tokio 一类 async runtime。这样可以减少每次 I/O 操作的 syscall 开销。Arc 重点使用的 io_uring 特性包括:
  • SQPOLL:内核轮询线程直接消费提交队列,用户态无需为提交再发 syscall
  • Fixed buffers:预注册缓冲池;读写时使用缓冲区索引而非指针
  • Fixed files:预注册 fd 集合,减少 fd 表查找开销
  • Multishot accept:单个 accept SQE 在每次接入后自动重臂,不必反复提交
  • Multishot timeout:单个 timeout SQE 覆盖连接槽定时轮

共享配置与热更新

所有 worker 共享一个 ArcSwap<Arc<SharedConfig>>SharedConfig 内含已编译路由、已编译上游、插件目录、按路由限流器和 TLS 状态。构建完成后即不可变。 热更新流程如下:
监听地址、worker 数、io_uring ring 尺寸、control plane 绑定地址等字段会被 restart_required_changes() 判定为“需重启字段”。只要这些字段有变化,热更新会被拒绝。 Arc 内部会把 TOML/YAML/JSON 统一标准化为 canonical JSON。具体做法是先解析为 serde_json::Value,再做 key 排序,最终写入 SharedConfigraw_json: Arc<str>。这样可以保证集群节点之间的配置指纹一致且可复现。

请求处理路径

安全分层

Arc 把安全能力拆为三层,并且互相独立:

安全细节

查看完整安全机制说明。

Crate 依赖图

Crate 规模与职责