实时通知使用哪种技术比较好的建议

10

我有X个活动传感器连接到一个将数据插入数据库的服务器。 我正在尝试创建一个带有设施蓝图(SVG)的网络界面,每当传感器触发时,除了进行数据库插入外,我希望它在我的蓝图上显示某种警报。 为此,我认为需要保持与服务器的开放连接。

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

谢谢


1
你有AJAX长轮询,对于你的情况来说,它几乎和WebSockets一样有效;假设传感器不经常被激活。我认为WebSockets并不是“过度杀伤力”,而且假设用户数量较少,AJAX请求也不会太低效。 - Matt
1
也许是 http://signalr.net/ - Raidri
1
我还建议使用SignalR.net,虽然现在还在测试阶段,但它非常好用。 - MANISHDAN LANGA
1
我认为这个问题更适合在http://programmers.stackexchange.com上提问。 - Irvin Dominin
你检查过你发送的数据量了吗?实际测试一下。 - SheetJS
5个回答

5

一些潜在的选择包括:

  • WebSocket
  • Adobe® Flash® Socket
  • AJAX长轮询
  • AJAX多部分流
  • Forever Iframe
  • JSONP轮询

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

客户端和服务器端都有许多可用的库,其中许多支持这些传输方式中的多个。

例如(不是详尽列表):

  • Socket.io适用于Nodejs
    • WebSocket
    • Adobe® Flash® Socket
    • AJAX长轮询
    • AJAX多部分流
    • 永久Iframe
    • JSONP轮询
  • SignalR适用于asp/.net后端
    • WebSockets
    • 服务器发送事件(Server-Sent Events)
    • ForeverFrame
    • 长轮询
  • Atmosphere适用于Java后端
    • WebSockets
    • 服务器端事件(SSE)
    • 长轮询
    • 永久帧
    • JSONP

在我看来,对于这种类型的问题,使用Websockets不会过度,并且能够很好地适应这种应用程序。


3

不特别讨论框架或者不知道服务器后台运行的情况下,我们有几个前端选择:

Websockets(Web 套接字)

Websockets 被设计用于双向通信,但令人震惊的是还有很多用户在使用不支持 Websockets 的浏览器进行网页浏览。我建议始终提供一个备选方案,例如下面列出的其他方法。

SSE(服务器发送事件)

SSE 是 HTML5 规范,但目前还不太成熟。试着在 SSE 事件触发时滚动页面... 它可能对后台来说更容易些,但由于它与 DOM 运行在同一线程中,因此有时会在客户端挂起。

长轮询

保持连接开启。它与 PHP 不兼容扩展性良好,但与 Python + Twisted 或 Node.Js 后端配合时表现出色。

Ajax

保持请求小,你仍然拥有可扩展的解决方案。是的,完整的 GET 请求是最昂贵的,但在过去十年内推出的几乎所有浏览器都支持。值得注意的是,GET 请求易于通过更多硬件进行横向扩展。

在完美的世界中:

将您的应用程序分成几个组件,运行在像 Nginx 这样的反向代理背后。然后使用 Node.Js + Socket.IO 处理应用程序的实时方面。

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


1
WebSocket绝对不会过度。相反,使用WebSocket可以获得双向通信渠道;这意味着服务器可以在任何时候启动通信(例如当传感器数据发生变化时)。
在先前的项目中,我使用node.jssocket.io来监控50多个传感器。数据实时更新到浏览器中。使用smoothie.js可视化数据。 每当传感器值更新时,它就会被传递到浏览器中。有些传感器只更新一次每分钟,有些则每秒更新一次,… 轮询会过度,因为它将检索所有传感器的所有数据,包括那些尚未更新的传感器。

1

有两个非常适合您的商业服务。

  • Firebase - 一种JavaScript分层数据库和实时消息/同步平台,使用WebSockets并具有其他备选方案

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


PubNub实际上不仅使用Web套接字。PubNub是协议无关的,并根据情况使用最佳传输方式。披露:我在PubNub工作 - sharpper

1

我曾经遇到过类似的问题,对此进行了大量研究。据我所知,有三个主要选项:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接