为了好玩,我一直在用python编写负载均衡器,并且一直在尝试找出测试端口是否可用以及远程主机是否仍然存在的最佳方式(正确吗?).
我发现,一旦连接,就很难确定远程主机何时关闭.我已经打开了保持活动状态,但是即使设置了各种TCP_KEEPALIVE之后,也无法在一分钟之内就识别出断开的连接(我意识到轮询超过一分钟可能会过分,但是可以说我想这样做).选择权降至最低.
当我使用无阻塞套接字时,我注意到recv()从活动套接字中读取时将返回错误(“资源暂时不可用”),但从无效的套接字中读取时将返回“”(发送和recv为0)字节,这可能是原因?).但是,这似乎是测试连接状态的一种奇怪方法,并且无法确定连接状态是否在发送一些数据后死亡.
除了连接/断开每个检查之外,我还能做些什么吗?我可以手动发送tcp keepalive,还是可以建立一个较低级别的连接,使我可以测试连接性而无需发送远程服务器可能处理的真实数据?
解决方法:
我建议不要让您的(单个)测试插座保持连接状态-每次需要轮询时都要建立一个新连接.我见过的每个负载均衡器/服务器可用性系统都使用此方法而不是持久连接.
如果远程服务器在合理的时间内(例如10秒)未响应,则将其标记为“关闭”.使用计时器和信号而不是功能响应代码来处理该超时.