通过Golang调用Dataplane API为HAProxy添加新服务器的限流与队列超时问题
HAProxy 后端队列超时与滑动窗口限流实现
队列超时设置及默认值
HAProxy 中控制请求队列超时的指令是 timeout queue,可在全局、defaults、backend 或单个 server 级别配置:
- 若未在 server 层级单独指定,会自动继承 backend 或 defaults 的配置
- 全局默认超时时间为 5000ms(5秒)
通过 DataplaneAPI 添加服务器时,可在请求体中为目标 server 指定 timeout_queue 参数(如 "10s" 表示10秒),实现单独配置。
基于请求数的滑动窗口限流(Stick Table 实现)
滑动窗口限流需结合 stick table 和请求规则实现,以下是具体配置逻辑及 Golang 调用示例:
1. 配置 Stick Table(Backend 级别)
创建基于客户端IP的stick table,维护1分钟滑动窗口内的请求计数:
stick-table type ip size 100k expire 1m store http_req_rate(1m)
size:设置表容量,最多存储100000个IP条目expire:滑动窗口时长,此处设为1分钟store http_req_rate(1m):记录每个IP在1分钟内的请求速率
2. 添加限流规则(Backend 级别)
在backend中添加规则,当请求速率超过阈值时直接拒绝:
http-request deny if { src_get_rate(http_req_rate) gt 60 }
逻辑为:每分钟单个IP最多允许60次请求,超出则拒绝。
3. Golang 调用 DataplaneAPI 配置流程
先更新目标backend的stick table和限流规则,再添加服务器:
// 更新Backend配置的请求体 backendUpdatePayload := map[string]interface{}{ "stick_table": []map[string]interface{}{ { "type": "ip", "size": "100k", "expire": "1m", "store": []string{"http_req_rate(1m)"}, }, }, "http_request_rules": []map[string]interface{}{ { "action": "deny", "condition": map[string]interface{}{ "expr": "{ src_get_rate(http_req_rate) gt 60 }", }, }, }, } // 调用DataplaneAPI的Backend更新接口(PUT /services/haproxy/configuration/backends/{name}) // 此处省略HTTP请求代码,可使用net/http或第三方库实现 // 添加服务器的请求体 serverAddPayload := map[string]interface{}{ "name": "new-backend-server", "address": "192.168.1.10", "port": 80, "max_connections": 100, "maxqueue": 50, "timeout_queue": "10s", // 为该服务器单独设置队列超时 } // 调用DataplaneAPI添加服务器的接口(POST /services/haproxy/configuration/servers)
说明:http_req_rate 会自动维护滑动窗口的计数,无需手动重置,HAProxy会实时更新每个IP的请求速率。
内容的提问来源于stack exchange,提问作者Satyam
相关产品推荐
相关产品推荐

