Node.js和Socket.io - 他们可以用实时Web应用程序走多远?

时间:2012-05-10 09:30:45

标签: node.js socket.io

我打算构建一个Web应用程序来管理笔记(想想类似于Evernote的东西)。我决定使用Backbone.js + JQuery客户端。 服务器端,我还没有决定:要么是纯PHP(我非常清楚),要么是Node.js + Socket.io(对我而言都是全新的)。

我正在考虑Node.js + Socket.io,因为我希望我的网络应用程序是实时的(即:如果用户更新了一个注释,该注释会立即更新为共享该注释的协作者,重新加载页面。)

作为第三种选择,我还考虑将Node.js和Socket.io用于UI和PHP用于REST API(我觉得使用PHP构建API更为舒适)。 PHP和Javascript代码将共享MongoDB数据库。

我的问题是:如果我使用PHP为我的Web应用程序开发REST API,并且通过API创建用户的新注释(即:Android应用程序发送API请求以创建该注释),将是Node .js,Socket.it和Backbone.js能够立即更新用户的UI并在屏幕上显示新的笔记吗?我认为这可以称为“推送通知”。

我希望我足够清楚。

此外,有没有其他优秀的技术来构建实时Web应用程序?

2 个答案:

答案 0 :(得分:9)

是Node.js + Socket.IO会做得很好。节点使用事件循环,这意味着在请求时它被输入队列。 Node逐个处理这些请求。传统的Web服务器处理“每请求线程”方法,其中创建一个线程来处理请求。

Node的优势在于它不需要经常进行上下文切换,这意味着它可以非常快速地处理这些请求...最有可能比PHP服务器更快。但是,Node在单个CPU核心上作为单个进程运行。如果您的应用程序是CPU密集型的,那么它可能会阻塞,这意味着每个请求的时间会变慢。

然而,听起来我觉得您的应用程序不是CPU密集型的,这意味着Node.js可以正常运行。

<强>决策 如果您的时间有限,并且您不想学习新技能(节点),PHP就可以了。如果您有时间我建议学习Node.js,因为它在I / O密集型任务(例如用于创建Notes的REST API)方面非常强大。

更新用户界面 如果您的预期用途是通过移动设备,我建议使用WebSockets,但需要使用长时间轮询等后备。可以使用Node或PHP更新Client UI。但是根据我的经验,在Node.js上使用Socket.IO更容易。

示例使用Node.js / Socket.io

更新客户端

<强>客户端

  socket.on('new-note', function (data) {
    placeNewNote(data);
  });

服务器侧

socket.emit('new-note', data);

节点入门 How do I get started with Node.js

另请注意,如果您要构建使用WebSockets的原生Android移动应用程序......您需要使用:Java socket.io client

答案 1 :(得分:2)

将Node.js用于Web服务器和推送服务器当然是最好的方法。特别是因为无论如何你要使用Node.js然后你必须学习它,所以学习如何制作一个Web服务器是很自然的(我建议使用最着名的Express framework)。

现在,您可以将PHP用于Web服务器,将Node.js用于推送服务器。为了使它们彼此通信,您可能希望将Redis添加到您的应用程序中。 Redis将允许您将通知推送到任何连接到它的客户端,如PHP服务器或Node.js推送服务器(并且它可以很好地扩展)。从那时起,推送服务器将把数据进一步推送到客户端的浏览器。

替代技术将是例如Twisted server。当然,您需要学习Python才能使用它。我不知道它是否正确支持WebSockets。我认为你应该坚持使用Node.js + socket.io。