rust - 强制 reqwest 定期重新建立连接以实现负载平衡

标签 rust reqwest

我正在用 Rust 编写一个高吞吐量(每秒超过 1000 个请求)的 REST 服务,使用 reqwest 异步连接到负载平衡的上游服务。 为了减少对该上游服务的请求延迟,我使用了带有连接池的长生命周期 reqwest::Client

挑战在于 reqwest 的长期连接“破坏”了上游服务的负载平衡,因为 - 只要池中的连接数量足够 - 没有连接将建立添加到该上游服务的机器以增加其容量。这导致我的服务过度利用该上游服务的某些机器,而未充分利用其他服务(我的应用程序是该上游服务的主要用户,因此我不能依赖该服务的其他用户来平衡我的不平衡使用)。

reqwest中是否有任何机制可以定期关闭和重新建立连接,以确保它们在上游服务的所有机器上尽可能均匀地平衡(或以任何方式手动在 reqwest 之上实现此类行为)?

reqwest 文档中,我看到 ConnectionBuilder::timeout() 确保连接关闭,并在上游计算机不再可访问时重新建立。还有 ConnectionBuilder::pool_idle_timeout() 来最终关闭该池中的连接(如果它们空闲的时间足够长)。但我没有发现任何关于关闭连接的行为 - 无论是自动还是显式 - 都表现良好。

最佳答案

对我来说,这听起来像是应该在上游服务中解决的问题。如果它想要在更多机器上重新分配负载,它应该有目的地关闭连接,以便它们可以重新建立到更大的池。 (特别是,如果它发现多个连接显然源自同一源,请关闭其中一个。)

这样,无论客户端做什么,服务都会平衡其负载 - 它将与任何符合要求的 HTTP 客户端良好配合,而不仅仅是专门针对它进行调整的客户端。

关于rust - 强制 reqwest 定期重新建立连接以实现负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75682278/

相关文章:

rust - 共享弱特征对象引用

http - 为什么reqwest HTTP库返回二进制数据而不是文本主体?

rust - 使用 actix-web 调用异步 reqwest

rust - 在 Rust 中,我怎样才能减少这段代码的重复性?

multithreading - 如何控制 Rust 中 2 个不同线程的打印顺序

rust - 如何根据整数格式化带缩进的字符串?

ubuntu - 为什么 Rust 编译器不能从拆分标准输入行中推断出来

json - 如何使用 serde_json 序列化包含 f32 的结构?

rest - 如何从Github API获取JSON?

rust - 如何监控reqwest客户端上传进度