nginx 负载平衡:等待(但不要超时)直到负载下降

nginx load balancing: wait (but dont timeout) until load falls

我有一个 ML 推理服务器,它每秒能够处理大约 100 个请求,如果它变得更高,它就会中断并超时。

现在实际负载有时会跳到大约每秒 200 个请求。客户端可以等待约 2 秒的响应,但不能接受请求超时。

我正在考虑建立一个反向代理,它可以在负载高时以某种方式停止请求,但让它们保持活动状态,然后在负载下降时将它们转发到推理服务器。我什至不确定这是可能的,我希望我能把我的问题说清楚。

关于如何解决这个问题有什么意见或建议吗?

Nginx 有一个 limit_req 选项

https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req

设置共享内存区域和请求的最大突发大小。如果请求速率超过为区域配置的速率,它们的处理将延迟,以便以定义的速率处理请求。过多的请求会被延迟,直到它们的数量超过最大突发大小,在这种情况下,请求会因错误而终止。默认情况下,最大突发大小等于零。例如,指令

limit_req_zone $server_name zone=one:10m rate=100r/s;

server {
    location /search/ {
        limit_req zone=one burst=500;
    }

平均每秒允许不超过 100 个请求,突发不超过 500 个请求。

延迟参数 (1.15.7) 指定了过多请求延迟的限制。默认值为零,即延迟所有过多的请求。

可能有多个 limit_req 指令。例如,以下配置将限制来自单个 IP 地址的请求的处理速率,同时限制虚拟服务器的请求处理速率:

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=100r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=500;
}