10

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

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

谢谢

4

5 回答 5

5

一些潜在的选择包括:

  • 网络套接字
  • Adobe® Flash® 插座
  • AJAX 长轮询
  • AJAX 多部分流式传输
  • 永远的 iframe
  • JSONP 轮询

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

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

例如(不是详尽的列表):

  • 用于 nodejs 的 socket.io
    • 网络套接字
    • Adobe® Flash® 插座
    • AJAX 长轮询
    • AJAX 多部分流式传输
    • 永远的 iframe
    • JSONP 轮询
  • 用于 asp/.net 后端的 SignalR
    • 网络套接字
    • 服务器发送的事件
    • 永远框架
    • 长轮询
  • java后端的 氛围
    • 网络套接字
    • 服务器端事件 (SSE)
    • 长轮询
    • 永远的框架
    • JSONP

IMO -对于此类问题,Websockets并不过分,并且非常适合此类应用程序。

于 2013-08-10T18:14:52.733 回答
3

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

网络套接字

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

上证所

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

长轮询

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

好老阿贾克斯

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

在一个完美的世界里:

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

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

于 2013-08-10T22:18:10.190 回答
1

我有一个类似的问题,并对此做了很多研究。据我了解,主要有以下三种选择:

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

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

于 2013-08-10T18:29:34.113 回答
1

有两种出色的商业服务可能对您有用。

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

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

于 2013-08-14T17:46:07.223 回答
1

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

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

于 2013-08-10T18:48:00.220 回答