2

私は、複数のページを同時に解析できるWebクローラーを作成しています。 Nokogiriを使って、静かに解析し、すべてのタスクを解決しますが、より良いパフォーマンスを達成する方法はわかりません。RubyのWebクローラー:どのように最高のパフォーマンスを達成するには?

スレッドを使用して同時に多くのopen-uriリクエストを作成すると、処理が速くなりますが、単一のサーバーから達成できる可能性からはまだ遠いと思われます。私は複数のプロセスを使うべきですか? 1つのRubyアプリケーションで起動できるスレッドとプロセスの制限は何ですか?

他の言葉:この場合、どのように最高のパフォーマンスを達成するか。

+0

上の完全なブログのエントリを参照してくださいうーん、Javaで書き直し? –

答えて

1

この問題では、ActiveMQ/Active Messaging、イベントマシン、マルチスレッドの組み合わせを使用します。フェッチするURLの大きなリストから始めます。バッチごとに100個のURLのバッチに分割します。各バッチはActiveMQにプッシュされます。次に、キューをリッスンするポーラー/コンシューマー・プロセスの配列があります。これらのコンシューマは、すべて1台のコンピュータに搭載することも、複数のコンピュータに分散することもできます。消費者の配列は、私たちが望むだけの並列性をサポートするために、任意に大きく成長することができます。消費者は、ActiveMQとの素晴らしいRuby統合であるActive Messagingを使用します。

コンシューマが100個のURLのバッチを処理するメッセージを受け取ると、イベントマシンを起動して、複数のスレッドで複数のメッセージを処理できるスレッドプールを作成します。あなたのように、私たちはNokogiriを使って各URLを処理します。

ので、並列処理の3つのレベルがあります。

1)イベントマシンとスレッドでサポートされている消費者のプロセスごとに複数の同時要求は、。

2)コンピュータごとに複数のコンシューマプロセス。

3)複数のコンピュータ。

+0

ありがとう、私はおそらくこのアーキテクチャを試してみるつもりです。 Event Machineはコンシューマープロセスの一部ですか?それとも別のプロセスですか?あなたはどんな功績を達成しましたか? – Arty

4

私は実際には複数のリクエストを同時に処理するためにTyphoeus and Hydraが好きです。

Typhoeusはhttpクライアント側であり、Hydraは複数の要求を処理する部分です。例は良いので、それらを通って見てください。

3

あなたは非常に複雑なものを探しているようには思えませんが、私はこの論文が興味深い読者であることを少し前に知りました:Building blocks of a scalable webcrawler - Marc Seeger

スレッディング/プロセス制限に関しては、Rubyのスレッディング能力は非常に低いです。標準Ruby(MRI/YARV)とRubiniusは、それをサポートするために特別に構築された拡張機能を使用しない限り、同時スレッド実行をサポートしていません。あなたのパフォーマンスの問題のどれくらいがIOにあるのか、処理にどれくらいのものがあるのか​​に応じて、私はEventMachineを使って提案することができます。

マルチプロセスただし、Rubyは、すべてのプロセスが複数のプロセスを実行する上で優れたマネージャ/データベースを持っていれば、非常にうまく動作します。

+0

この論文へのリンクに感謝します。今読んで、とても面白いです。 – Arty

+1

Hehe、私の論文のような嬉しい人々:) –

1

あなたが速い何か、私はRedisのは、キュー管理、キャッシングのための偉大な多目的ツールであることが判明し

eventmachine/EM-HTTP要求を使用してコードの何かをしたい場合は簡単に何かがhttp://anemone.rubyforge.org/
のために行く場合と、そうです。あなたはまた、beanstalkd/active mq /のような特殊なものを使うことができます...しかし、少なくとも私の使用例では、私はそれらが赤目に比べて大きな利点であるとは本当に気付かなかった。 特に、バックエンドシステムへの負荷がボトルネックになる可能性があり、そうねえ、別の方法がNokogiriと鉄工(IronMQIronCache)の組み合わせを使用することで、慎重にあなたのデータベースを選択し、あなたが

3

を保存何に注意を払います。

トピックhere

関連する問題