有关使用哪种技术进行实时通知的建议

时间:2013-07-31 10:47:04

标签: javascript html5 websocket

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

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

谢谢

5 个答案:

答案 0 :(得分:4)

一些可能的选择包括:

  • 的WebSocket
  • Adobe®Flash®Socket
  • AJAX长轮询
  • AJAX multipart streaming
  • 永远的iframe
  • JSONP民意调查

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

客户端和服务器端都有许多库,其中许多库支持多种传输。

例如(不是详尽的清单):

  • socket.io用于nodejs
    • 的WebSocket
    • Adobe®Flash®Socket
    • AJAX长轮询
    • AJAX multipart streaming
    • 永远的iframe
    • JSONP民意调查
  • SignalR用于asp / .net后端
    • 的WebSockets
    • 服务器发送的事件
    • ForeverFrame
    • 长轮询
  • Atmosphere用于java后端
    • 的WebSockets
    • 服务器端事件(SSE)
    • 长轮询
    • 永远的框架
    • JS​​ONP

IMO - Websockets对于此类问题 NOT 过度使用,并且很适合这种类型的应用程序。

答案 1 :(得分:3)

如果没有专门讨论框架或了解服务器后端运行的内容,我们可以考虑为前端考虑一些选项:

<强>的WebSockets

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

<强> SSE

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

长轮询

保持连接畅通。它不能很好地扩展PHP,但可以在后端使用Python + Twisted游戏,或者Node.Js

Good Old Ajax

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

在一个完美的世界中:

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

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

答案 2 :(得分:1)

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

  1. 短轮询:拥有一个javascript客户端每秒ping一次的端点。这是最糟糕的选择,因为ping为您的通信增加了一秒的延迟,并且根据您的实现方式,端点可以每秒查询数据库,从而增加了不必要的开销。
  2. 长轮询:拥有一个端点,您的javascript客户端ping持有连接,直到a)事件发生或b)连接超时。如果端点返回响应,则客户端获取事件信息。如果端点未返回响应,则不会发生任何事件,并且客户端会发送新请求。这是一个很好的选择,因为事件可以立即触发对客户端的响应,假设您有一个异步进程间通信层(如0MQ)来发送消息而不进行任何轮询。
  3. Websocket :让您的javascript客户端连接到websocket服务器,该服务器会在事件触发后立即向您的客户端发送消息。
  4. 我认为websocket是您最好的选择,因为它可以在没有所有请求/响应开销的情况下提供事件的即时通信。最重要的是,这正是websockets的设计目标!因此,您可能必须使用此解决方案编写最少量的自定义代码。

答案 3 :(得分:1)

WebSocket肯定不会有点过分。反之。使用websockets,您可以拥有双向通信渠道;这意味着服务器可以在适当的时候启动通信(例如,当传感器数据发生变化时)。

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

答案 4 :(得分:1)

有两种很棒的商业服务可能适合您。

  • Firebase - 一个javascript分层数据库和实时 消息传递/同步平台,使用websockets并具有其他回退

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