【问题标题】:Node.js and Socket.io - how far can they go with real time web applications?Node.js 和 Socket.io——它们在实时 Web 应用程序中能走多远?
【发布时间】:2012-05-10 09:30:44
【问题描述】:

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

我正在考虑 Node.js+Socket.io,因为我希望我的 Web 应用程序是实时的(即:如果用户更新了一条笔记,那么该笔记会立即为共享该笔记的合作者更新,而无需重新加载页面)。

我还考虑将 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 应用程序?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

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

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

    但是在我看来,您的应用程序不是 CPU 密集型的,这意味着 Node.js 可以很好地工作。

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

    更新用户界面 如果您的预期用途是通过移动设备,我建议使用 WebSockets,但有一个备用方案,例如长轮询。可以使用 Node 或 PHP 更新客户端 UI。但是根据我的经验,在 Node.js 上使用 Socket.IO 会容易得多。

    使用 Node.js / Socket.io 更新客户端的示例

    客户端

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

    服务器端

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

    Node 入门: How do I get started with Node.js

    还请注意,如果您想构建一个使用 WebSockets 的原生 Android 移动应用...您将需要使用:Java socket.io client

    【讨论】:

    • 杰克,谢谢你的回答。那么实时呢?使用 PHP 实现的 REST API 的更改会直接反映在 UI 中吗?
    • 我添加了一些关于更新 UI 的信息。我在大学的最后一年项目与您正在创建的项目非常相似......我使用 Node.js / Express / Socket.IO 并将“Notes”存储在 MongoDB 数据库中。
    • Express 是 Backbone.js 的替代品吗?
    • Express 在服务器端,客户端代码是 websocket 监听器的一个例子。在客户端收到名为“new-note”的消息后,它将调用该函数..您可以重写该函数以在客户端上放置注释。
    【解决方案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。

    【讨论】:

    • 非常感谢。所以你是说,如果我将 PHP 排除在外,并在 Backbone、Node、Socket.io 上构建,我就不需要 Redit 来拥有一个实时 Web 应用程序。对吗?
    • 是 Express 替代 Backbone.js 吗?
    • @dan 是的,从技术上讲你不需要它。但是无论如何你都应该使用它,因为没有它 socket.io 无法扩展到许多机器(或者至少我不知道扩展它的其他方法)。所以你应该使用 Redis,除非你认为一台机器就足够你的应用程序了。但是你不应该做出这样的假设。 :)
    • @dan Backbone.js 是客户端库,而 Express 是 Node.js 的服务器端框架。 Express 就像 Python 的 Django。 :)
    • @dan 好吧,这取决于。添加 Redis 意味着只安装它并在 socket.io 配置中添加 4-5 行。但问题是,例如,当您在 Node.js 应用程序的内存中保存数据时。此类代码需要重写,因此它使用 socket.io 存储。例如,每个socket 对象都有.get 和.set 方法,它们应该用于检索/存储(分别)给定套接字的附加数据。如果你使用它们,那么一切都会好起来的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2020-11-14
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多