通过用 Rust 重写我们的 Traefik 网关,实现快 2000 倍的路由传播

Rivet 是一个开源、可自我托管的无服务器平台,支持Rivet 函数Rivet 参与者(开源 Cloudflare 持久对象)和Rivet 容器。其重写了基于 Traefik 的网关为 Rust 版的 Rivet Guard 以支持构建无服务器平台的特定需求。

  • Rivet Guard 职责:处理 Rivet 平台的所有入站流量,包括Rivet 函数路由Rivet 参与者和容器路由(https://rivet.gg/docs/cloud/c...、Rivet API 路由等。
  • Traefik 简介:广泛使用的反向代理,易于在各种环境中设置负载均衡和路由。最初选择 Traefik 是因其易于配置动态路由,但存在一些问题。
  • Traefik 配置问题及原因

    • 慢路由传播:Traefik 配置为 500ms 轮询且providersThrottleDuration为 0.025s,但实际路由暴露需 1 - 2 秒,导致需添加 2 秒人工超时等待路由可靠传播,影响资源可用性。
    • 大 HTTP 提供程序响应:每个 Traefik 路由需 1.3KB JSON 配置,约 3MB JSON 响应时 Traefik 延迟明显增加,HTTP 提供程序 JSON 配置达约 14MB 时 Traefik 完全停止工作。
  • Rivet Guard 设计与优势

    • 设计目标包括快速路由传播、无限路由、无状态等,与大多数其他代理不同,它是作为库构建,可内部插入自定义路由处理程序,路由懒解析和缓存。
    • 配置 Rivet Guard 需定义routing_fnmiddleware_fncert_resolver_fn三个函数,处理请求流程包括接受 TCP 连接、TLS 握手、HTTP 请求解析、路由解析、中间件解析、速率和并发限制、请求代理、响应处理等步骤,其中步骤 4 和 7 较为特殊。
    • 优势包括简化架构(从 3 个组件简化为 1 个组件)、完全无状态、可扩展(无限路由)、灵活(可通过代码解析和生成路由)、易于调试、无需配置等。
    • 路由查找是单键获取操作,最差路由延迟为 1 毫秒,比之前的 2 秒延迟快 2000 倍,且后续请求缓存开销可忽略不计。
    • 能在资源准备好之前返回访问资源的 URL,处理资源崩溃和重启,智能缓冲请求,避免反向代理在资源未准备好时返回错误。
    • 缓存通过返回路由函数的主机和路径前缀实现,若目标变化可通过特定方式更新缓存。
  • 选择 Rust 的原因:Rivet 内部生态系统皆为 Rust,可使用已测试的监控和数据库工具;围绕 Hyper 和 Tungstenite 构建,支持 QUIC 等未来传输;Rust 的内存安全性和正确性保证更优,无 GC 暂停,减少潜在性能问题;避免使用 Envoy 等外部库的复杂性和移动部件,更注重端口ability 及在单个容器中运行 Rivet。
  • 与其他项目的比较rivet-guard-core与 Cloudflare 的 Pingora 项目有相似之处,但由于 MVP 需求不大,从时间投资角度选择从零开始构建更安全。
  • 未来展望:希望实现 Rivet 容器和参与者的网络请求唤醒、WebSocket 和 SSE 休眠、基于请求的自动缩放、流量分析、Anycast 等功能,目前尚未支持 QUIC 和 WebTransport,但很快会推出。构建 Rivet Guard 带来了性能提升、未来功能灵活性和扩展瓶颈的消除等好处。
阅读 14
0 条评论