【问题标题】:Realtime web programming: how does it work?实时网络编程:它是如何工作的?
【发布时间】:2014-03-30 04:15:56
【问题描述】:

作为一名网络开发人员,我在 Redis 或 Pusher 等第三方服务的帮助下开发了聊天服务和其他一些实时协作服务。它们提供了简单的 API,我可以使用发布/订阅模型在网络服务器上实现双向通信。我现在想在不使用任何第三方服务的情况下实现一个简单的推送通知,但我不太确定如何实现这一点。情况如下:

  1. 后端使用 Python (Django)
  2. 用户收到来自另一个用户的私人消息。
  3. 无需刷新网络浏览器即可通知收件人。

我的问题:

  1. post 看来,Django 似乎是实现此类功能的一个糟糕选择,而 Node.js 是一个不错的选择。这是真的吗?如果是,那是为什么?
  2. 是否可以打开从客户端到服务器的 websocket,以监听特定模型的某些更改? (例如,当消息模型中有新消息时,更新 DOM)

非常感谢任何帮助!

【问题讨论】:

  • 基本上你需要设置一个 javascript 间隔,并每隔 n 秒调用一个 ajax 函数来检查更新(新消息),这应该是 php/python 实现的整体行为,在节点你不需要设置超时,因为客户端js会询问节点服务器是否有新消息,只有当有更新时服务器才会向你发送该更新,这只是为了给你一个提示当有人给你一个更好的答案时。如果是我,我会使用 node.js,它正是为这种应用程序而创建的。
  • 您好 Zarich,感谢您的评论。但这不是投票吗?我想实现一个实际的“实时”功能。
  • 是的,这就是为什么 node.js 在这类事情上更好,但等待真正的答案 =)

标签: javascript django node.js websocket push-notification


【解决方案1】:

如果你只需要单向通信作为推送通知,你最好看看Server Side Events而不是Websockets。

SSE 更容易实现,它不需要任何特殊协议(只需标准 HTTP)并且会自动重新连接。 创建私人消息将使用旧的 XMLHttpRequests 完成,并且应该在客户端幻灯片上进行过滤。

Node.js 非常适合服务 SSE:它的事件循环实现只使用一个线程来管理多个持久连接。

查看sse-pubsub,它提供了一种发送通知的简单方法。

【讨论】:

    【解决方案2】:

    WebSocket 正是您想要的。然而,它们是(相对)最近添加到浏览器中的,因此支持并不普遍。 WebSocket Support

    websocket 模型允许您使用 Web 浏览器将套接字从服务器连接到客户端,然后从服务器发送消息并在客户端异步接收它们,反之亦然。

    因为 Node.js 是 Javascript 并且您很可能会使用 Javascript 编写客户端,所以它是编写耦合组件的明智选择,例如在这种情况下。

    最流行的 WebSocket 库是 Socket.io,它是为与 Node.js 一起使用而构建的。使用 Socket.io,您的通知模型将如下所示:

    服务器

    io.sockets.on('connection', function (socket) {
      socket.emit('notification', { name: 'Notification', message: 'It\'s here');
    });
    

    客户

    var notifications = document.getElementById('nlist');
    socket.on('notification', function(notification) {
       var div;
       // make some DOM changes
       document.title = notification.name;
       div = document.createElement('div');
       div.innerHTML = notification.message;
       notifications.appendChild(div);
       socket.emit('received-notification');
    });
    

    Socket.io 允许您使用自定义事件名称,如此处所示,这使得设计通信 API 变得更容易一些。在用户没有 Web Sockets 的情况下,它还具有 XHR Long Polling 和 Flash 套接字的后备功能。

    在这种情况下,Node 会比 Django 更快,但是如果这是您第一次尝试使用 Node,您可能会发现在 Django 中您的代码库更易于管理。用这样的一系列回调设计一个应用程序可能有点困难。我从来没有在 Django 中使用过 WebSockets,但是我在 Tornado 和 WebSockets 方面的经验一直很差。

    【讨论】:

    • 谢谢丹!那么在这种情况下,我是否将 Node.js 与 Django 一起使用,替换了 Django 的默认网络服务器 WSGI?
    • 如果您打算在 Django 旁边使用 Node,我会花时间熟悉 nginx,以便您可以反向代理到 Node 或 Django,具体取决于您正在处理的路由.如果您希望扩展到 100k 并发连接,这一点尤其重要,因为 Node 和 Django 的内置 HTTP 服务器都没有 Nginx 快。
    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多