Rust 中关于更改时的自动服务器重新加载:listenfd/systemfd 是什么?

主要观点:

  • 开发 Werkzeug 和 Flask 时,作者重视快速自动重载,通过父进程和子进程持有并处理服务器监听的套接字文件描述符来实现。
  • 几年前为实现 Rust 代码的相同体验,作者写了 systemfd 和 listenfd,但未详细介绍其工作原理,且它们在 Rust 中的自动重载体验未被广泛知晓。
  • 实现自动重载需监控文件系统变化,可使用 cargo watch 或 watchexec 等工具,作者推荐更通用的 watchexec。
  • 通过 systemd 的“socket activation”协议,利用 systemfd 和 listenfd 实现套接字传递,在 Rust 中 listenfd 接受系统传递的文件描述符,可在 axum 中使用。
  • 可将 cargo watch / watchexec 与 systemfd 结合使用,通过特定参数实现代码编辑自动编译和服务器重启,将其放入 Makefile 方便使用,安装 systemfd 可使用 curl 和 bash 脚本。
  • 在 Windows 上,systemfd 和 listenfd 有自定义协议实现套接字传递,细节对用户较无关,除非要为其他编程语言实现该协议。
  • 目前组合使用较繁琐,理想情况下希望能集成到 Rust 框架中,通过 cargo 插件实现更便捷的开发体验。

关键信息:

  • Werkzeug 和 Flask 通过双进程实现自动重载。
  • systemfd 打开套接字并传递给其他程序,listenfd 接受文件描述符。
  • 使用 cargo watch / watchexec 结合 systemfd 实现代码自动编译和服务器重启。
  • Windows 有自定义协议实现套接字传递。
  • 希望能将自动重载功能更好地集成到 Rust 框架中。

重要细节:

  • 在 Rust 中使用 listenfd 时,先添加 listenfd 依赖,修改服务器代码接受套接字,若有则使用,无则使用固定端口。
  • systemfd 的参数含义,如 --no-pid 防止传递 PID 等。
  • 在 Windows 上自动重载的实现细节较复杂,对用户较无关。
  • 目前组合使用需多个命令,理想是集成到 Rust 框架中。
阅读 9
0 条评论