3

TCP を介して多くのサーバーのステータスをポーリングする良い方法を探しています。現在、同期コードと Minecraft クエリ プロトコルを使用していますが、サーバーがオフラインになると、キューの残りの部分が停止します。

現在のコードで発生しているもう 1 つの問題は、一部のサーバーがファイアウォールでポーリングに使用するサーバーをブロックする傾向があるため、それらのサーバーがサーバーリストにオフラインで表示されることです。

MongoDB データベース内のすべての Minecraft サーバーが +-10 分ごとにチェックおよび更新される無限ループで Ruby rake タスクを使用しています (ループを(600/ s.count.to_i).ceil数秒スリープさせることで、この間隔を設定しようとしています。

できればRubyの非同期コードを使用して、このタスクを効率的に実行できる(そしてサーバーがファイアウォールで私のIPをブラックリストに登録するのを防ぐ)方法はありますか?

4

1 に答える 1

4

チェックするには、ノンブロッキングソケットを使用する必要があります-マルチスレッド。最善の方法は、一度に複数のスレッドを生成して、一度に複数のサーバーをチェックすることです。これにより、メイン スレッドが滞ることがなくなります。

この質問には、Ruby でのマルチスレッドに関する多くの情報が含まれています。一度に複数の同時スレッドを生成するか、少なくとも非ブロッキング ソケットを使用できるはずです。

@Lie Ryan によって与えられたもう 1 つのポイントは、IO.Selectを使用してサーバーの配列を一度にポーリングすることです。完了すると、「オンライン」サーバーの配列が返されます。これは、複数のスレッドを生成するよりも洗練されている可能性があります。

于 2013-02-26T17:10:47.910 に答える