2011-12-21 97 views
0

我正在开发一个网页抓取网站以查找可用的递送餐馆。网站搜索最流行的传递门户网站,并将结果显示在一个页面中。使用node.js缩放web刮取网站

该网站托管在Heroku与4 dynos。

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

当用户在网站上的要求,它使大约30 HTTP请求来检索结果。

问题是性能,请求不是很快,每个搜索都可以使其中的30个锁定应用程序,同时为单个用户执行搜索。

我试图增加Heroku的DYNOS:

heroku scale web=10 

而且我不觉得可察觉的增益。

扩展这种应用程序的最佳方法是什么?

(我不能使用高速缓存,作为搜索需要在实时)

当前堆栈:

  • Heroku的
  • Node.js的
  • 表达
  • 请求模块
  • EJS
  • 推动器
  • Redis的

回答

0

这里最重要的是要有工人,因为你必须避免阻断您的主应用程序事件循环。

尝试委托可用工作人员之间的30个http请求。也许Kue可以帮助你解决这个问题(你把新的工作推到队列中,并由工作人员逐一执行)。例如,如果你在Heroku上有10个dynos,那么使用9代表工作者(即进行30次http搜索)。从用户的角度来看,重要的是要知道应用程序对他的搜索做出了快速反应(并且不会给他“冻结”的印象),所以也许你想尽快更新他初步结果(例如从30页中搜索10页)。你可以通过WebSockets(Socket.IO)做到这一点,甚至显示一个不错的图形化进度条或类似的东西。

+0

我之前试过socket.io,但在heroku上工作不太好,现在我正在使用Pusher为用户提供响应。关于工作人员...这可能是一个好主意,我可以创建工作人员来网上抓取并维护主要的测试版,仅供网站使用。韩国社交协会。 – 2011-12-22 01:18:09

+0

是的,这是最重要的。如果你只是产生主应用程序,你不会感觉到有所改进。为此产卵的工作人员将确保更好的性能,并且不会阻止您的主应用程序。 – alessioalex 2011-12-22 06:32:37

+0

如何在Heroku上ping(ajax调用)工作人员?我可以在工作人员中运行快递服务器吗?它是否可见? 我正在使用推动器。现在,当用户提交搜索请求时,浏览器ping(发出ajax调用)以表示应用程序开始将消息发送到频道/事件(私人聊天室)。用户浏览器正在监听相同的频道/事件。 我需要将此“ping”重定向到工作人员,它是否可行? – 2011-12-22 11:32:21