2011-12-21 14 views
0

利用可能な配送レストランを見つけるためにウェブスクレイピングウェブサイトを開発しています。ウェブサイトは最も人気のある配送ポータルを検索し、その結果を1ページに集約して表示します。node.jsを使用したウェブスクレイピングサイト

サイトは4つのdynosでHerokuでホストされています。

http://deliveria.net/#05409-002

ユーザーがウェブサイト上で要求を行う、それは結果を取得するために、約30のHTTP要求を行います。

問題はパフォーマンスです。要求が速くなく、各検索で30件の検索が可能で、1人のユーザーに対して検索が実行されている間にアプリケーションがロックされます。

私はHerokuのdynosを増加させようとした:

heroku scale web=10 

そして私は知覚ゲインを感じませんでした。

この種のアプリケーションを拡張するにはどうすればよいでしょうか?

(検索はリアルタイムにする必要があるとして、私は、キャッシュを使用することはできません)

現在のスタック:

  • Herokuの
  • のNode.js
  • 要求を表現モジュール
  • EJS
  • プッシャー
  • Redisの

答えて

0

あなたがメインのアプリでイベントループを遮断することを避けなければならないので、ここで重要なことは、労働者を持つことです。

利用可能なワーカー間で30のHTTP要求を委任しようとします。たぶんKueは、このような面でお手伝いをすることができます(新しいジョブをキューにプッシュし、ワーカーによって1つずつ実行されます)。たとえば、Herokuで10のdynosを持っている場合は、ワーカーに9を使用します(30のhttp検索を行います)。

ユーザーの観点からは、アプリケーションが検索に迅速に反応していることを知っておくことが重要です(また、彼に「フリーズ」の印象を与えません)ので、すぐに彼を更新したいと思うかもしれません予備的な結果(例えば、30ページのうち10ページが検索される)。あなたはWebSockets(Socket.IO)を介してそれを行うことができ、素晴らしいグラフィカルなプログレスバーまたは同様のものを表示することさえできます。

+0

私はsocket.ioを前に試しましたが、herokuでうまく動作しませんでした。今は、ユーザーにできるだけ早く応答するためにPusherを使用しています。従業員について...それは良いアイデアかもしれません、私はWebスクラップに労働者を作成し、Webのためだけにメインのdynoを維持することができます。 Tks。 –

+0

はい、それが最も重要なことです。メインアプリを起動するだけであれば、改善は感じられません。このために労働者を産まれば、より良いパフォーマンスが保証され、メインアプリをブロックすることはありません。 – alessioalex

+0

ヘロクでワーカーにping(ajax call)をさせるにはどうすればいいですか?ワーカーで高速サーバーを実行できますか?それは目に見えるでしょうか? 私はプッシャーを使用しています。ユーザーが検索リクエストを送信すると、ブラウザがping(ajax呼び出しを行う)して、アプリケーションがチャネル/イベント(プライベートチャットルーム)にメッセージを送信し始めたことを表現します。ユーザーブラウザは同じチャンネル/イベントをリッスンしています。 この「ping」をワーカーにリダイレクトする必要がありますか? –

関連する問題