2013-07-31 63 views
9

我有X个活动传感器连接到服务器,每次触发传感器时都会将数据插入数据库。我想要做的是创建一个带有蓝牙打印设备(svg)的web界面,并且每当传感器被触发时,除了db插入之外,我希望它在我的蓝图中显示某种警报。为此,我需要保持与服务器的开放连接。关于哪种技术用于实时通知的建议

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

谢谢

+1

你有AJAX长轮询,这将最终效率与你的案例中的网络套接字一样高效;假设传感器不经常启动。 WebSockets不是“过度杀伤”,我会说,假设有少量用户,AJAX请求不会太低效。 – Matt

+1

也许http://signalr.net/ – Raidri

+1

我也建议signalr.net ..现在在测试,但它太好... –

回答

4

一些可能的选择包括:

  • 的WebSocket
  • 的Adobe®Flash®插槽
  • AJAX长轮询
  • AJAX多流
  • 永远的iFrame
  • JSONP轮询

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

客户端和服务器端都有很多库,其中许多都支持多个库这些运输。

例如(不是穷举性列表):

  • socket.io为的NodeJS
    • 的WebSocket
    • 的Adobe®Flash®插座
    • AJAX长轮询
    • AJAX多流
    • Forever Iframe
    • JSONP轮询
  • SignalR for a asp /。净后端
    • 的WebSockets
    • 服务器发送的事件
    • ForeverFrame
    • 长轮询
  • Atmosphere为Java后端
    • 的WebSockets
    • 服务器端的事件(SSE)
    • 长轮询
    • 永远框架
    • JSONP

IMO - 的WebSockets是矫枉过正这种类型的问题,也会很好地借给自己这种类型的应用。

1

我有类似的问题,并做了大量的研究。据我了解,主要有三个选项:

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

我想的WebSocket是您最好的选择,因为它可容纳该事件的直接通信,而所有的请求/响应的开销。最重要的是,这正是websocket设计的目的!因此,您可能必须使用此解决方案编写最少量的自定义代码。

1

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

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

3

没有具体讨论框架或知道什么是您的服务器(S)的后台运行的,我们有几个选择可以考虑针对前端:

的WebSockets

的WebSockets设计为双向通信,尽管有多少用户在不支持websocket的浏览器上浏览网页令人震惊。我总是建议为此做一个回退,比如下面列出的其他方法。

SSE

SSE是HTML5规范,充其量仍是摇摇欲坠。尝试在页面上滚动时,当SSE事件触发时...在后端可能会稍微简单一些,因为它在与运行DOM相同的线程内运行,所以它有时会挂在客户端。

长轮询

保持您的连接打开。它不与PHP和Python +扭曲的后端很好地扩展,但执行顺顺当当,或Node.js的

好老阿贾克斯

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

在一个完美的世界:

您将您的应用程序分解成几个组成部分,后面的反向代理,如Nginx的操作。然后使用Node.Js + Socket.IO处理您的应用的实时方面。

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

1

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

  • Firebase - 一个JavaScript分层数据库和实时 消息/同步平台,使用的WebSockets并具有其它回退

  • PubNub - 实时消息传递和队列系统中,采用的WebSockets

+0

PubNub实际上不只是使用网络套接字。PubNub独立于协议,根据情况使用最佳传输方式。 *披露我为PubNub工作* – sharpper