我试图实现准确的Retry-After速率限制,以便在haproxy中复制我们在另一个系统中所拥有的内容。我创建了一个速率限制配置,如果用户超出我们的可接受速率限制,则返回429,它运行正常。它设置了X-RateLimit-Remaining标头,让它们倒计时,直到它们超出配额。
frontend www_http_https
...
tcp-request connection track-sc1 src table hour_throttle
acl hour_abuser src_http_req_rate(hour_throttle) gt 5500
acl flag_hour_abuse sc1_inc_gpc0(hour_throttle) gt 0
http-request set-var(txn.req_counter) src_http_req_rate(hour_throttle)
http-request set-var(txn.abuse_count) int(5500),sub(txn.req_counter)
http-response add-header X-RateLimit-Remaining %[var(txn.abuse_count)]
http-response add-header X-RateLimit-Limit %[int(5500)]
http-response add-header X-RateLimit-Period %[int(3600)]
http-request deny deny_status 429 if hour_abuser
frontend hour_throttle
stick-table type ip size 1m expire 3600s store gpc0,http_req_rate(3600s)
tcp-request connection track-sc1 src
acl flag_ratelimit_abuser src_get_gpc0 gt 0
但是,直到他们的IP的足够表条目到期才允许他们再次发出请求,我才能找到确定秒数的方法。我发现的所有例子都有一个罐装" Retry-After:60"而不是在他们再次尝试之前剩下的实际秒数(即。"重试 - 后:13"或"重试 - 后:122")
我一直试图使用store-response关键字来查看我是否可以在表条目中获得请求的时间或者获取此信息,但到目前为止还没有成功。有没有办法检索这些信息?也许通过新的Lua界面?
感谢。