3

我正在寻找一种通过 TCP 轮询许多服务器以了解其状态的好方法。我目前正在使用同步代码和 Minecraft 查询协议,但是每当服务器离线时,队列的其余部分都会被阻塞。

我当前代码遇到的另一个问题是,某些服务器倾向于阻止我用于在其防火墙中轮询的服务器,因此它们的服务器在我的服务器列表中显示为脱机。

我正在使用带有无限循环的 Ruby rake 任务,其中我的 MongoDB 数据库中的每个 Minecraft 服务器每 +- 10 分钟进行一次检查和更新(我尝试通过让循环休眠(600/ s.count.to_i).ceil几秒钟来设置此间隔。

有什么方法可以有效地完成这项任务(并防止服务器在他们的防火墙中将我的 IP 列入黑名单),最好使用 Ruby 中的异步代码?

4

1 回答 1

4

您需要使用非阻塞套接字来检查 - 多线程。最好的办法是一次生成多个线程来一次检查多个服务器——这样你的主线程就不会被阻塞。

这个问题包含很多关于 Ruby 中多线程的信息——你应该能够一次产生多个并发线程,或者至少使用非阻塞套接字。

@Lie Ryan 给出的另一点是,您可以使用IO.Select一次轮询一组服务器。完成后它将返回一组“在线”服务器——这可能比产生多个线程更优雅。

于 2013-02-26T17:10:47.910 回答