负载均衡器(LB)是现代架构的入口。本篇我们将实现一个简单的 L4 (TCP) 负载均衡器。
1. 后端管理
struct backend {
const char *ip;
int port;
int is_up;
};
struct backend pool[] = {
{"10.0.0.1", 80, 1},
{"10.0.0.2", 80, 1}
};2. 调度算法 (Round-Robin)
当新连接到来时,选择下一个可用的后端。
struct backend *select_backend() {
static int idx = 0;
for (int i = 0; i < 2; ++i) {
int cur = (idx + i) % 2;
if (pool[cur].is_up) {
idx = cur + 1;
return &pool[cur];
}
}
return NULL;
}3. 健康检查 (Health Check)
我们需要定期(如每 2 秒)检查后端是否存活。
void check_cb(evutil_socket_t fd, short events, void *arg) {
struct backend *b = arg;
// 尝试 connect
// 如果成功 -> b->is_up = 1
// 如果失败 -> b->is_up = 0
}
// 启动定时器
struct event *ev = event_new(base, -1, EV_PERSIST, check_cb, backend);
struct timeval tv = {2, 0};
event_add(ev, &tv);4. 总结
这个 LB 虽然简单,但具备了核心要素。结合之前的“透明代理”逻辑,你已经可以构建一个功能完备的流量分发网关了。
完整代码: 08-load-balancer.c
上一篇: 08-projects/chat-server.md - 实战:即时聊天 回到首页: ../00-intro/reactor-pattern.md