加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
sbalance.txt 4.30 KB
一键复制 编辑 原始数据 按行查看 历史
calvin 提交于 2015-05-04 18:09 . aaa
/********* 监听端口 **********/
0. 初始化监听的事件处理函数为sb_accept_event
/********* 监听事件(sb_listen), 最后一位区分**********/
(void*)((unsigned long)li|0x1);
1. sb_accept_event->sb_try_connect_server 中 connect EAGAIN
客户端读事件: sb_transfer_read_not_send_event
客户端写事件: NULL
服务器读事件: NULL
服务器写事件: sb_test_connect_complete
1. sb_test_connect_complete 返回成功
a. 客户端没有关闭
客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: sb_transfer_write_event(如果在connect成功之前有数据接收) or NULL
b. 客户端已经关闭
客户端读事件: NULL
客户端写事件: NULL
服务器读事件: NULL
服务器写事件: sb_transfer_write_event(如果在connect成功之前有数据接收) or sb_finish_session(@@结束@@)
2. sb_test_connect_complete 返回失败
a. sb_connect_server_failed 判断之前没有connect失败,调用 sb_try_connect_server
这里需要注意写事件需要重新注册
b. 之前已经失败过一次,sb_finish_session(@@结束@@)
2. sb_accept_event->sb_try_connect_server 中 connect OK
客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: NULL
/********* 数据传输端口事件(sb_session) **********/
当connect服务器成功后:
情况1: 客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: NULL
情况2: 客户端读事件: sb_transfer_read_event
客户端写事件: NULL
服务器读事件: sb_transfer_read_event
服务器写事件: sb_transfer_write_event
情况3: 客户端读事件: NULL
客户端写事件: NULL
服务器读事件: NULL
服务器写事件: sb_transfer_write_event
以接收驱动发送
sb_transfer_read_event(区分缓冲区:用户缓冲区和TCP内部缓冲区):
1. recv时: 用户缓冲区满, send时: 发送用户缓冲区所有数据 ====> continue
2. recv时: 用户缓冲区满, send时: 内部缓冲区满 ====> in.recv.read_ready = 1; out.write 事件handler sb_transfer_write_event
3. recv时: 接受结束, send时: 发送用户缓冲区所有数据 ====> sb_finish_session(@@结束@@)
4. recv时: 接受结束, send时: 内部缓冲区满 ====> in->read.shutdown = 1; out.write 事件handler sb_transfer_write_event(why not finish session)
5. recv时: 内部缓冲区空, send时: 内部缓冲区满 ====> in->read.read_ready = 0; out.write 事件handler sb_transfer_write_event
6. recv时: 内部缓冲区空, send时: 发送用户缓冲区所有数据 ====> in->read.read_ready = 0; delete out.write 事件
7. recv时或者send时时出错 ====> sb_finish_session(@@结束@@)
sb_transfer_write_event:
1. send时: 发送用户缓冲区所有数据 ====> a. delete out.write 事件;
b. 如果 in->read.shutdown = 1, sb_finish_session(@@结束@@)
c. in->read.read_ready = 1, 手工调用 sb_transfer_read_event(why)
2. send时: 发送部分数据 ====> 手工调用 sb_transfer_read_event
3. send时: 出错 ====> sb_finish_session(@@结束@@)
/********* 超时管理 **********/
1. 当connect返回EAGAIN, 将超时时间添加到RBTREE中
2. 当accept返回系统文件描述符不够用,将accept_delay延时添加到RBTREE中
3. 当后台服务器连续多次连接失败,将timeout_delay添加到RBTREE中
4. 自定义其他的时间事件
/********* 配置文件 **********/
accept_delay:1000ms
rule-baidu
{
connect_timeout: 120ms
listen: 127.0.0.1:8882
client: 127.0.0.[1-23]:*,192.168.1.2:*
balance: rr
server
{
115.239.211.112:80(weight=1;max_fails=2;fail_timeout=30s)
}
}
1. 支持 * 和 [] 两种通配符
2. 随机选取服务器可以添加权重
3. 配置负载均衡算法
4. 配置各种超时
/********* 信号 **********/
1. SIGHUP 显示当前的配置信息
2. SIGINT 重新加载配置文件
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化