NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
rate_limiter.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_RATE_LIMITER_HPP__
2#define NEFORCE_NETWORK_HTTP_RATE_LIMITER_HPP__
3
14
18NEFORCE_BEGIN_NAMESPACE__
19NEFORCE_BEGIN_HTTP__
20
25
32struct NEFORCE_API token_bucket {
33 double tokens{0.};
35 double refill_rate{1.};
36 double capacity{1.};
37 mutable mutex mutex_;
38
39 token_bucket() = default;
40 ~token_bucket() = default;
41
42 token_bucket(double rate, double burst) :
43 tokens(burst),
44 last_refill_ms(static_cast<uint64_t>(steady_clock::now().since_epoch().count() / 1'000'000)),
45 refill_rate(rate),
46 capacity(burst) {}
47
48 token_bucket(const token_bucket& other) :
49 tokens(other.tokens),
50 last_refill_ms(other.last_refill_ms),
51 refill_rate(other.refill_rate),
52 capacity(other.capacity) {}
53
54 token_bucket& operator=(const token_bucket& other) {
55 if (this != &other) {
56 tokens = other.tokens;
57 last_refill_ms = other.last_refill_ms;
58 refill_rate = other.refill_rate;
59 capacity = other.capacity;
60 }
61 return *this;
62 }
63
71 bool try_consume(uint64_t now_ms);
72
77 void refill(uint64_t now_ms);
78};
79
86class NEFORCE_API token_bucket_limiter {
87private:
88 struct bucket_entry {
89 token_bucket bucket;
90 uint64_t last_access_ms;
91 };
92
93 double default_rate_{10.0};
94 double default_burst_{20.0};
95
96 mutable mutex mutex_;
98
99 static constexpr size_t MAX_BUCKETS_COUNT{10000};
100
101public:
102 token_bucket_limiter() = default;
103
111 bool allow(const string& key, double rate = 0.0, double burst = 0.0);
112
114 void set_default_rate(double rate);
116 void set_default_burst(double burst);
118 NEFORCE_NODISCARD size_t size() const;
119
124 void cleanup_expired(seconds max_age = seconds{300});
125};
126
127
135class NEFORCE_API token_bucket_filter final : public http_filter {
136private:
137 token_bucket_limiter limiter_;
138
139public:
140 double default_rate{10.0};
141 double default_burst{20.0};
142 bool per_route{false};
143 bool enabled{true};
144
145 token_bucket_filter() = default;
146
147 explicit token_bucket_filter(double rate, double burst) :
148 default_rate(rate),
149 default_burst(burst) {}
150
151 bool pre_filter(http_request& request, http_response& response) override;
152 void do_filter(http_request& request, http_response& response) override {}
153
154 void cleanup_expired(seconds max_age = seconds{300});
155
156 NEFORCE_NODISCARD string name() const override { return "token_bucket_filter"; }
157
158 // TODO: Distributed rate limiting — Redis/Lua-script based shared counter for multi-instance rate limit coordination
159 // TODO: Sliding window algorithm — more precise rate limiting using sliding log/window instead of token bucket
160 // TODO: Rate limit response headers — X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset in 429 responses
161};
162 // HTTP
164
165NEFORCE_END_HTTP__
166NEFORCE_END_NAMESPACE__
167#endif // NEFORCE_NETWORK_HTTP_RATE_LIMITER_HPP__
原子类型完整实现
string name() const override
获取过滤器名称
double default_rate
默认每秒请求数(每IP)
double default_burst
默认突发容量(每IP)
bool per_route
是否对每个路由单独限流
bool pre_filter(http_request &request, http_response &response) override
预处理方法
void do_filter(http_request &request, http_response &response) override
核心过滤方法
void set_default_rate(double rate)
设置默认的令牌补充速率
size_t size() const
获取桶数量
bool allow(const string &key, double rate=0.0, double burst=0.0)
检查并消耗令牌
void set_default_burst(double burst)
设置默认的桶容量
void cleanup_expired(seconds max_age=seconds{300})
清理过期的桶
非递归互斥锁
时钟类型
unsigned long uint64_t
64位无符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
duration< int64_t > seconds
秒持续时间
http_server_response http_response
HTTP响应类型别名
http_server_request http_request
HTTP请求类型别名
HTTP过滤器链实现
void refill(uint64_t now_ms)
补充令牌(基于时间差)
mutex mutex_
保护内部状态
bool try_consume(uint64_t now_ms)
尝试消耗一个令牌
double refill_rate
每秒补充令牌数
uint64_t last_refill_ms
上次补充时间(毫秒时间戳)