为了好玩,我一直在玩弄用 python 编写负载均衡器,并一直在尝试找到最好的(正确的?)方法来测试端口是否可用以及远程主机是否仍然存在。
我发现,一旦连接,就很难判断远程主机何时出现故障。我已经打开了保持事件状态,但无法让它在一分钟内识别出断开的连接(我意识到轮询频率超过一分钟可能有点矫枉过正,但可以说我想这样做),即使在设置了各种 TCP_KEEPALIVE选项降到最低。
当我使用非阻塞套接字时,我注意到 recv() 在从事件套接字读取时会返回错误(“资源暂时不可用”),但在从死套接字读取时返回“”(发送和recv 为 0 字节,这可能是原因?)。不过,这似乎是一种奇怪的测试连接的方法,并且无法判断连接是否在发送一些数据后 已断开。
除了为每次检查连接/断开连接外,我还能做些什么吗?我可以手动发送一个 tcp keepalive,还是可以建立一个较低级别的连接,让我在不发送远程服务器可能处理的真实数据的情况下测试连接?
最佳答案
我建议不要让您的(单个)测试套接字处于连接状态 - 每次需要轮询时都建立一个新连接。我见过的每个负载平衡器/服务器可用性系统都使用这种方法而不是持久连接。
如果远程服务器在合理的时间内(例如 10 秒)没有响应,则将其标记为“关闭”。使用计时器和信号而不是函数响应代码来处理超时。
关于python - 监控一个tcp端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/771399/