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