【问题标题】:Advice on which technology to use for real time notifications关于使用哪种技术进行实时通知的建议
【发布时间】:2013-07-31 10:47:04
【问题描述】:

我有 X 数量的活动传感器连接到服务器,每次触发传感器时,该服务器都会将数据插入数据库。我要做的是创建一个带有设施蓝图(svg)的Web界面,并且每当触发传感器时,除了数据库插入之外,我希望它在我的蓝图中显示某种警报。为此,我需要保持与我认为的服务器的开放连接。

我正在考虑使用网络套接字,但这可能有点过头了,因为我只需要从服务器检索数据。但是每秒运行一个 ajax 调用听起来也不是很有效。还有其他选择吗?

谢谢

【问题讨论】:

  • 你有 AJAX 长轮询,在你的情况下,它最终几乎和 web-sockets 一样有效;假设传感器不经常激活。我会说,WebSockets 并不是“矫枉过正”,假设用户数量很少,AJAX 请求也不会太低效。
  • 也许是signalr.net
  • 我还建议 signalr.net ..现在处于测试阶段,但它太好了 ...
  • 我认为这个问题更适合programmers.stackexchange.com
  • 您检查过您发送的数据量吗?实际测试一下

标签: javascript html websocket


【解决方案1】:

一些潜在的选择包括:

  • WebSocket
  • Adobe® Flash® Socket
  • AJAX 长轮询
  • AJAX 多部分流式传输
  • 永远的 iframe
  • JSONP 轮询

您最终使用哪种实际传输将取决于您对浏览器支持的要求以及您在服务器上使用什么技术来处理这些请求。传输选择还可能取决于您的网络拓扑 - 您需要集成哪些类型的负载均衡器、代理等。

在客户端和服务器端都有许多可用的库,其中许多支持不止一种这些传输。

例如(并非详尽的列表):

  • socket.io 用于 nodejs
    • WebSocket
    • Adobe® Flash® Socket
    • AJAX 长轮询
    • AJAX 多部分流式传输
    • 永远的 iframe
    • JSONP 轮询
  • SignalR 用于 asp/.net 后端
    • WebSockets
    • 服务器发送的事件
    • ForeverFrame
    • 长轮询
  • Atmosphere 用于 Java 后端
    • WebSockets
    • 服务器端事件 (SSE)
    • 长轮询
    • 永远的框架
    • JSONP

IMO - 对于此类问题,Websockets 不会矫枉过正,非常适合此类应用程序。

【讨论】:

    【解决方案2】:

    在没有专门讨论框架或不知道在您的服务器后端运行什么的情况下,我们有一些前端选项可供考虑:

    网络套接字

    Websockets 是为双向通信而设计的,尽管令人震惊的是,有多少用户在不支持 websockets 的浏览器中浏览网页。我总是建议为此使用后备方法,例如下面列出的其他方法。

    上海证券交易所

    SSE 是 HTML5 规范,充其量仍然不稳定。尝试在触发 SSE 事件时在页面上滚动...在后端可能会更容易一些,但有时会挂在客户端,因为它在运行 DOM 的同一线程中运行。

    长轮询

    保持您的连接打开。它不能很好地与 PHP 一起扩展,但在后端使用 Python+Twisted 或 Node.Js 时可以很好地执行

    好老的阿贾克斯

    保持您的请求小,您仍然有一个可扩展的解决方案。是的,完整的 GET 请求是最昂贵的,但在过去十年推出的几乎所有浏览器都支持。还值得注意的是,GET 请求很容易通过更多硬件进行水平扩展。

    完美世界:

    您可以将您的应用程序分解为几个组件,在 Nginx 等反向代理之后运行。然后使用 Node.Js + Socket.IO 处理应用程序的实时方面。

    另一种选择是使用小型 Ajax 请求,并为支持它的浏览器提供 websocket 支持。这是专门针对后端 PHP 的建议。

    【讨论】:

      【解决方案3】:

      WebSocket 当然不是矫枉过正。相反。使用 websockets,你有一个双向的通信通道;这意味着,服务器可以在合适的时候发起通信(例如,当传感器数据发生变化时)。

      在之前的项目中,我使用node.jssocket.io 来监控50 多个传感器。数据在浏览器中实时更新。使用smoothie.js 可视化数据。 每当更新传感器值时,都会将其传达给浏览器。有些传感器每分钟只更新一次,有些传感器每秒更新一次,... 轮询将是多余的,因为它会检索所有传感器的所有数据,即使是那些尚未更新的数据。

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,并对此进行了大量研究。据我了解,主要有以下三种选择:

        1. 短轮询:有一个端点,您的 javascript 客户端每秒 ping 一次。这是最糟糕的选择,因为 ping 会为您的通信增加长达一秒的延迟,并且根据您的实施方式,端点可能每秒查询一次数据库,从而增加不必要的开销。
        2. 长轮询:让您的 javascript 客户端 ping 的端点保持连接,直到 a) 事件发生或 b) 连接超时。如果端点返回响应,则客户端获取事件信息。如果端点没有返回响应,则没有发生任何事件,客户端发送新请求。这是一个不错的选择,因为事件可以立即触发对客户端的响应,假设您有一个异步进程间通信层(如 0MQ)无需任何轮询即可发送消息。
        3. Websocket:让您的 javascript 客户端连接到 websocket 服务器,该服务器将在事件触发后立即向您的客户端发送消息。

        我认为 websocket 是您的最佳选择,因为它可以适应事件的即时通信,而无需所有请求/响应开销。最重要的是,这正是 websocket 的设计初衷!因此,您可能必须使用此解决方案编写最少的自定义代码。

        【讨论】:

          【解决方案5】:

          有两种出色的商业服务可能适合您。

          • Firebase - 一个javascript分层数据库和实时 消息/同步平台,使用 websockets 并有其他后备方式

          • PubNub - 一个实时消息传递和队列系统,使用 websockets

          【讨论】:

          • PubNub 实际上不仅仅使用网络套接字。 PubNub 是独立于协议的,并根据情况使用最佳传输。 披露我为 PubNub 工作
          猜你喜欢
          • 2012-02-04
          • 1970-01-01
          • 2015-05-01
          • 2013-02-01
          • 1970-01-01
          • 2011-04-24
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多