NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
load_balancer.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_LOAD_BALANCER_HPP__
2#define NEFORCE_NETWORK_HTTP_LOAD_BALANCER_HPP__
3
8
16NEFORCE_BEGIN_NAMESPACE__
17NEFORCE_BEGIN_HTTP__
18
23
34
39struct lb_backend {
40 string host;
41 ports port;
42 string scheme{"http"};
43 size_t weight{1};
44 atomic<size_t> active_connections{0};
45 atomic<bool> healthy{true};
46 uint64_t last_health_check_ms{0};
47 size_t consecutive_failures{0};
48
49 lb_backend() = default;
50 lb_backend(string h, ports p, string s = "http", size_t w = 1) :
51 host(move(h)),
52 port(p),
53 scheme(move(s)),
54 weight(w) {}
55};
56
78class NEFORCE_API load_balancer {
79public:
80 using health_check_cb = function<bool(const lb_backend&)>;
81
82private:
83 vector<lb_backend> backends_;
85 mutable mutex mutex_;
86 atomic<size_t> rr_counter_{0};
87
88 size_t max_failures_{3};
89 milliseconds health_check_interval_{10000};
90 milliseconds health_check_timeout_{3000};
91
92 health_check_cb health_checker_;
93
94public:
95 load_balancer() = default;
96
97 void add_backend(lb_backend backend) {
98 lock<mutex> lk(mutex_);
99 backends_.push_back(move(backend));
100 }
101
102 void remove_backend(const string& host, ports port) {
103 lock<mutex> lk(mutex_);
104 for (auto it = backends_.begin(); it != backends_.end(); ++it) {
105 if (it->host == host && it->port == port) {
106 backends_.erase(it);
107 return;
108 }
109 }
110 }
111
112 void set_strategy(lb_strategy s) {
113 lock<mutex> lk(mutex_);
114 strategy_ = s;
115 }
116
117 void set_health_check(health_check_cb cb) {
118 lock<mutex> lk(mutex_);
119 health_checker_ = move(cb);
120 }
121
123 void set_max_failures(size_t max) { max_failures_ = max; }
125 void set_health_check_interval(milliseconds ms) { health_check_interval_ = ms; }
127 void set_health_check_timeout(milliseconds ms) { health_check_timeout_ = ms; }
128
134
139 static void release_backend(lb_backend* backend);
140
144 void mark_failure(lb_backend* backend);
145
150
155 lock<mutex> lk(mutex_);
156 vector<string> hosts;
157 for (const auto& b: backends_) {
158 hosts.push_back(b.host + ":" + to_string(b.port.value()));
159 }
160 return hosts;
161 }
162
163 size_t backend_count() const noexcept { return backends_.size(); }
164 lb_strategy strategy() const noexcept { return strategy_; }
165
169 size_t healthy_count() const;
170
171private:
172 lb_backend* select_round_robin();
173 lb_backend* select_least_connections();
174 lb_backend* select_weighted();
175 lb_backend* select_random();
176};
177
178// TODO: Circuit breaker pattern — track failure rate per backend, auto-open circuit on threshold breach, half-open probing
179// TODO: Service discovery integration — Consul / Eureka / Nacos / DNS-based backend registration and health sync
180// TODO: Sticky sessions — session affinity based on cookie or client IP for stateful backends
181 // HTTP
183
184NEFORCE_END_HTTP__
185NEFORCE_END_NAMESPACE__
186#endif // NEFORCE_NETWORK_HTTP_LOAD_BALANCER_HPP__
原子类型完整实现
函数包装器主模板声明
void set_max_failures(size_t max)
设置容忍的最大连续失败次数
static void release_backend(lb_backend *backend)
释放后端节点(请求完成)
void mark_failure(lb_backend *backend)
标记后端请求失败
void set_health_check_timeout(milliseconds ms)
设置健康检查超时
vector< string > backend_hosts() const
获取后端主机列表快照
size_t healthy_count() const
获取健康节点数
lb_backend * select_backend()
选择后端节点
void run_health_checks()
运行健康检查(将所有标记为不健康但已恢复的节点恢复)
void set_health_check_interval(milliseconds ms)
设置健康检查间隔
锁管理器模板
非递归互斥锁
动态大小数组容器
constexpr size_type size() const noexcept
获取当前元素数量
constexpr void push_back(const T &value)
在末尾拷贝插入元素
时钟类型
通用函数包装器
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
unsigned long uint64_t
64位无符号整数类型
unsigned char uint8_t
8位无符号整数类型
duration< int64_t, milli > milliseconds
毫秒持续时间
lb_strategy
负载均衡策略
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr string to_string(const CharT &c)
将字符转换为普通字符串
互斥锁
数值类型包装类
网络端口定义和转换工具
通用原子类型模板
负载均衡后端节点
网络端口封装类
动态大小数组容器