我正在寻找一种通过TCP轮询大量服务器状态的好方法。我目前使用的是同步代码和Minecraft查询协议,但每当服务器离线时,队列的其余部分就会被占用。
我在当前代码中遇到的另一个问题是,有些服务器倾向于在防火墙中阻止我用于轮询的服务器,因此它们的服务器在我的服务器列表中显示为脱机。
我使用的是一个带有无限循环的Ruby rake任务,在这个无限循环中,MongoDB数据库中的每个Minecraft服务器都会每+-10分钟进行一次检查和更新(我试图通过让循环睡眠(600/ s.count.to_i).ceil
秒来设置这个间隔。
有没有什么方法可以有效地完成这项任务(并防止服务器将我的IP列入防火墙的黑名单(,最好是使用Ruby中的异步代码?
您需要使用非阻塞套接字来检查多线程。最好的做法是一次生成多个线程,一次检查多个服务器——这样你的主线程就不会被阻塞。
这个问题包含了很多关于Ruby中多线程的信息——您应该能够同时生成多个并发线程,或者至少使用非阻塞套接字。
@Lie Ryan给出的另一点是,你可以使用IO。选择一次轮询一组服务器。完成后,它将返回一组"在线"服务器——这可能比生成多个线程更优雅。