2011-12-21 3 views
0

Я разрабатываю веб-сайт для очистки, чтобы найти доступные рестораны доставки. Веб-сайт выполняет поиск на самых популярных порталах доставки и показывает результат, агрегированный на одной странице.Scale web scraping site with node.js

Сайт размещен на Heroku с 4 динамиками.

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

Когда пользователь делает запрос на веб-сайте, он делает около 30 HTTP запросов для получения результата.

Проблема заключается в производительности, запросы не быстрые, и каждый поиск может сделать 30 из них, блокируя приложение во время выполнения поиска для одного пользователя.

Я попытался увеличить Heroku динамометрические стенды:

heroku scale web=10 

И я не чувствую ощутимое усиление.

Каков наилучший подход к масштабированию такого приложения?

(я не могу использовать кэш-память, как поиски должны быть в режиме реального времени)

Текущий стек:

  • Heroku
  • Node.js
  • выразить
  • запрос модуль
  • EJS
  • Pusher
  • Redis

ответ

0

Важным моментом здесь является, чтобы иметь работников, потому что вы должны избегать блокировки цикл событий в вашем главном приложении.

Попытайтесь делегировать 30 запросов http между доступными рабочими. Может быть, Kue может помочь вам в этом аспекте (вы выдвигаете новые задания в очередь, и они выполняются один за другим рабочими). Так, например, если у вас есть 10 динозавров на Heroku, используйте 9 для рабочих (которые делают эти 30 HTTP-поисков).

С точки зрения пользователя, важно знать, что приложение реагирует быстро на его поиск (и не дает ему впечатления от «замораживания»), поэтому, возможно, вы хотели бы обновить его, как только у вас есть предварительные результаты (например, поиск 10 страниц из 30). Вы можете сделать это через WebSockets (Socket.IO) и даже показать приятный графический индикатор выполнения или что-то подобное.

+0

Я попробовал socket.io раньше, но он не очень хорошо работал на героку, теперь я использую Pusher, чтобы дать пользователям ответ как можно скорее. О рабочих ... Это может быть хорошей идеей, я могу создать рабочих для веб-соскабливания и поддерживать основной дино только для Интернета. Tks. –

+0

Да, это самое главное. Если вы просто создадите основное приложение, вы не почувствуете улучшения. Нерезидентные работники для этого обеспечат лучшую производительность и не будут блокировать ваше основное приложение. – alessioalex

+0

Как я могу ping (ajax call) рабочий на Heroku? Могу ли я запустить экспресс-сервер у рабочего? Будет ли это видно? Я использую толкатель. Теперь, когда пользователь отправляет запрос на поиск, браузер ping (совершает вызов ajax), чтобы выразить, тогда приложение начинает отправлять сообщения на канал/событие (частный чат).Пользовательский браузер прослушивает один и тот же канал/событие. Мне нужно перенаправить этот «пинг» на рабочего, это возможно? –