sans-IO:网络服务有效使用 Rust 的秘诀

主要观点:Firezone 用 Rust 构建安全远程访问,其核心的连接库connlib采用 sans-IO 设计。Rust 的特性使其适合 sans-IO 模式,该模式可解决传统 IO 方式的问题,如函数着色约束导致的异步依赖问题等,还具有易组合、API 灵活、测试方便、应对边缘情况等优点,但也存在编写顺序工作流代码较多、社区支持少等缺点。
关键信息

  • connlib用 Rust 构建,设计为 sans-IO,以tokio等为基础,几乎无tokio::spawn调用,通过单 UDP 套接字复用通信。
  • sans-IO 核心是依赖倒置原则,将政策与实现分离,通过抽象Transmit等实现。
  • 以 STUN 为例,展示 sans-IO 下的状态机、事件循环及抽象时间的实现,如添加重传定时器。
  • Rust 的所有权和可变性模型与 sans-IO 设计配合良好,可避免async中的一些问题。
    重要细节
  • Python 世界有关于 sans-IO 的专门网站,Rust 中如quinnquichestr0m等库也采用 sans-IO。
  • 在 Firezone 中,snownet利用 sans-IO 结合 ICE 和 WireGuard。
  • sans-IO 代码易测试,Firezone 实现参考状态机用于测试connlib,还可轻松测试 IO 失败等情况。
  • sans-IO 设计虽有优点,但也存在编写顺序工作流代码繁琐、社区支持少等不足。
阅读 13
0 条评论