按核线程模型
每个 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:单个
acceptSQE 在每次接入后自动重臂,不必反复提交 - Multishot timeout:单个 timeout SQE 覆盖连接槽定时轮
共享配置与热更新
所有 worker 共享一个ArcSwap<Arc<SharedConfig>>。SharedConfig 内含已编译路由、已编译上游、插件目录、按路由限流器和 TLS 状态。构建完成后即不可变。
热更新流程如下:
restart_required_changes() 判定为“需重启字段”。只要这些字段有变化,热更新会被拒绝。
Arc 内部会把 TOML/YAML/JSON 统一标准化为 canonical JSON。具体做法是先解析为 serde_json::Value,再做 key 排序,最终写入 SharedConfig 的 raw_json: Arc<str>。这样可以保证集群节点之间的配置指纹一致且可复现。
请求处理路径
安全分层
Arc 把安全能力拆为三层,并且互相独立:安全细节
查看完整安全机制说明。

