HAProxy:如何通过Stick-Table实现活跃用户阈值后拦截新用户请求
实现HAProxy活跃用户阈值后限制新用户连接
这个需求完全可以实现,只需要调整HAProxy的条件判断逻辑,利用stick-table的lookup功能检查Client-ID是否存在于活跃用户表中即可。以下是修改后的完整配置:
frontend echo bind *:8881 mode http # 定义活跃用户规则:30秒内有请求则视为活跃,同时统计10秒内的请求率 stick-table type string size 100k expire 30s store gpc0_rate(10s) # 当活跃用户数未达阈值(100)时,将新的Client-ID加入活跃表跟踪 http-request track-sc0 req.hdr(Client-ID) if { table_cnt lt 100 } # 核心逻辑:活跃用户数达标后,拒绝所有不在活跃表中的Client-ID请求 http-request deny deny_status 429 if { table_cnt ge 100 } { ! table lookup sc0 req.hdr(Client-ID) } use_backend echo
关键配置解释
! table lookup sc0 req.hdr(Client-ID):这个条件用来判断当前请求的Client-ID不存在于编号为sc0的stick-table中。!符号表示取反,结合前面的table_cnt ge 100(活跃用户数≥100),就能精准实现“阈值达标后拒绝新用户”的需求。- 保留原配置中
http-request track-sc0的{ table_cnt lt 100 }条件,确保只有在活跃用户数未达上限时,才会将新的Client-ID加入表中,严格控制活跃用户的数量上限。
注意事项
- 要确保
Client-ID请求头是客户端的唯一标识,避免出现重复或伪造的情况,否则会导致活跃用户统计不准确。 stick-table的size设置为100k,远大于阈值100,足够容纳正常的活跃用户数据。expire 30s参数会自动移除超过30秒无请求的用户,释放名额给新用户,保证活跃用户列表的时效性。
内容的提问来源于stack exchange,提问作者kozmo
相关产品推荐
相关产品推荐

