#3961·hyper

在优雅关闭期间允许接受新连接

作者: howardjohn创建于 2025年10月7日更新于 2026年9月14日
标签C-featureB-rfc

**您的功能请求是否与问题有关?请描述。** 我们希望在基于超级网关的代理中实现特定的优雅关闭行为。我们设置了两个截止日期,`min`(通常为 5-10 秒)和`max`(可能更长)。我们希望在关闭期间执行以下序列: * t=0 秒: 向所有 HTTP2 连接发送 GOAWAY,并在所有 HTTP1 请求上开始响应 `connection: close`。继续接受新连接,并以相同方式处理它们(GOAWAY/connection: close)。 * 在 `min` 截止日期后: 停止接受新连接。继续处理现有连接,以相同的 GOAWAY/connection: close 方式。 * 在 `max` 截止日期后: 关闭一切。 我们接受新连接,但告诉客户端离开的原因是,前端负载均衡器(可能是 AWS NLB、Kubernetes kube-proxy 等)需要有一段时间来注销代理实例并停止向其发送流量。因此,立即丢弃新连接会导致宕机。但是,在此期间,最好开始鼓励客户端离开,因为很可能它们会选择另一个代理实例(因为前端负载均衡器已经注销了旧实例(`min` 截止日期旨在是最坏的情况,因此通常要快得多),或者因为随机机会选择了另一个实例)。 今天,我们能做的最好就是等到 `min` 截止日期后,停止接受新连接,并同时开始 GOAWAY/connection: close。 **描述您希望的解决方案** 在 `hyper_util::server::conn::auto` 和 `hyper::server::conn::http1` 上添加一个新标志,以启用"不同的优雅关闭模式"(命名待定!)。这将更改: * https://GitHub.com/hyperium/hyper/blob/f9f8f44058745d23fa52abf51b96b61ee7665642/src/proto/h1/dispatch.rs#L97 - 跳过 close() 调用 * https://GitHub.com/hyperium/hyper/blob/f9f8f44058745d23fa52abf51b96b61ee7665642/src/proto/h1/conn.rs#L878 - 跳过 close() 调用 * https://GitHub.com/hyperium/hyper-util/blob/66afc93debef02548c86e8454e6bc01cf4fca280/src/server/conn/auto/mod.rs#L341 - 这里不报错 * https://GitHub.com/hyperium/hyper-util/blob/66afc93debef02548c86e8454e6bc01cf4fca280/src/server/conn/auto/mod.rs#L525-L531 - 如果 `cancelled`,则对新服务的连接调用 `graceful_shutdown()`(并对 UpgradeableConnection 执行相同操作) **描述您考虑过的其他解决方案** 对于已考虑的其他解决方案或功能,请提供清晰、简洁的描述。 **其他上下文** 如果这些更改是可接受的,我将很高兴地对更改的两部分做出贡献。