网络负载平衡改造(续)

  昨晚, 构思了一下, 稍微写了一些, 总结一下经验和遇到的问题.

 

  首先, 为了既能平衡调度各个连接, 又能保持对epoll_wait的接受, 需要额外增加一个调度线程, 而原有调用epoll_wait的线程只用于投递请求, 请求模式依然使用LT, 这里使用ET模式可能会引发一些不必要的BUG.

  多增加了线程, 就要更加注意防范引用到野指针的危险, 这里对net_buff增加引用计数, 初始计数2, 当网络错误, 或对端关闭时, 逐步关闭socket通信, 先关闭read信道, 等发送队列数据全部发送完毕后, 再关闭write信道, 检查引用计数, 当其为0时, 清理net_buff内存, close socket fd, 从而完成了整个关闭流程.

 

  不过这里又引发了另外一个问题, 引用计数的增减放在网络层处理recv和send的函数内, 但是如果逻辑层, 有异步操作, 此时有可能还有请求没有返回, 但是如果这时又要关闭连接, 势必会造成对野指针的访问, 从而引起服务崩溃.

 

  不过有一点我们很清楚, 逻辑层很清楚该链接是否可以被删除, 因为逻辑层可以统计到发起异步请求和响应的数量是否匹配. 为了解决这个问题, 而能有效的隔离逻辑层对网络层产生不必要的耦合, 采用网络层增加一个回调函数, 在引用计数为0, 尝试关闭连接时, 调用该回调函数询问逻辑层是否可以删除该net_buff, 如果可以删除则立即清除就好, 如果不能删除, 则放入一个待删队列, 这个队列可以用一个timer来定期轮询, 以便后面继续询问逻辑层是否可以删除.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章