ギットハブ
私は node.js が本当に好きで、この問題に取り組みたいと思っています。うまくいけば、これを達成するために github でいくつかのコードを共有したいと考えています。現在、 https://github.com/alfredwesterveld/freakinpingでホストされている非常に基本的なセットアップしかないことに注意してください。
サイトが HTTP 202 で応答するかどうかを知るために、(たとえば) 5 分ごとに 20 の Web サイトのリストに ping を送信する最良の方法は何ですか?
ピン(ICMP)
最初に、本当にping (ICMP)を実行する必要があるのか、それとも Web サイトがコード 200 (OK) で返されるかどうかを知り、所要時間を測定するだけなのかを知りたいです。コンテキストから、実際には ping を実行するのではなく、http 要求を実行して時間を測定したいだけだと思います。プログラミング言語からのping(ICMP)を行うには生のソケット(ルートユーザー)が必要なため、node.js/ruby/pythonからのpingは通常のユーザーからは実行できないため(私は信じています)、これを尋ねます。たとえば、Python でこのpingスクリプトを見つけました (私は本当に大きな Ruby プログラマーではありませんが、単純な Ruby スクリプトをどこかで見たと思います) が、root アクセスが必要です。node.js 用の ping モジュールがまだ存在しているとは思えません。
メッセージ キュー
また、これに対するより良いが簡単な解決策はありますか? 残念ながら、リストは 20000 の Web サイトにまで拡大する可能性があり、ping を実行するのに必要な 5 分間でそれらすべてに ping を実行するには十分な時間がありません。
基本的に、PingDom や UptimeRobot などがどのように機能するかを説明しています。
この種のスケールを実現するために必要なのは、redis、beanstalkd 、または gearmandなどのメッセージ キューを使用することです。PingDom の規模では、1 つのワーカー プロセスはそれをカットするつもりはありませんが、あなたの場合は (私が推測するに) 1 つのワーカーで十分です。C(node.js)拡張機能により、redisが最速のメッセージキューになると思います(想定)が、別の一般的なメッセージキューであるbeanstalkdと比較してベンチマークする必要があります(ただし、C拡張機能はまだありません)。
残念ながら、リストは 20000 の Web サイトにまで拡大する可能性があります
その規模になると、負荷を処理するために複数のボックス (多くのワーカー スレッド/プロセス) をホストする必要があるかもしれませんが、まだその規模にはなっておらず、node.js は非常に高速です。確かなことはわかりませんが、単一のボックスでもその負荷を処理できる可能性があります(いくつかのベンチマークを実行/実行する必要があります)。
データストア/Redis
これはnode.jsでかなり簡単に実現できると思います(私はnode.jsが本当に好きです)。これを行う方法は、非常に高速であるため、データストアとして redis を使用することです!
PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287
node_redisを使用します(hredis(node.js) c ライブラリを使用)。saddを使用して URL を redis に追加します。
タスクを 5 分ごとに実行する
これは、ほとんど努力せずに達成できます。を使用してsetInterval(callback, delay, [arg], [...])
、サーバーの応答時間を繰り返しテストします。callback
smembers を使用してredisからすべての URL を取得します。rpushを使用して、すべての URL (メッセージ) をメッセージ キューに入れます。
応答確認(時間)
しかし、答えがない場合はどうなりますか?その後の人たちはどうなるの?
私はこの文を完全には理解していないかもしれませんが、これで終わりです。どちらかが失敗すると、失敗するだけです。5 秒後に応答 (時間) をもう一度確認して、オンラインかどうかを確認できます。このための正確なアルゴリズムを考案する必要があります。それ以降のものは、同じサーバーに対するものでない限り、以前の URL とは何の関係もありません。また、あなたが明確に考えていることは、これらすべての URL を同時に同じサーバーに ping するのではなく、それらをキューに入れるか何かするべきだからだと思います。
処理中の URL
ワーカー プロセス (今のところ 1 つだけで十分です) から、 brpopコマンドを使用して redis からメッセージ (URL) をフェッチします。URL(メッセージ)の応答時間をチェックし、リストから次のURL(メッセージ)を取得します。プロセスを高速化するために、おそらくいくつかのリクエストを同時に行うでしょう。