我有X个活动传感器连接到一个将数据插入数据库的服务器。 我正在尝试创建一个带有设施蓝图(SVG)的网络界面,每当传感器触发时,除了进行数据库插入外,我希望它在我的蓝图上显示某种警报。 为此,我认为需要保持与服务器的开放连接。
我考虑使用Web套接字,但这可能过度,因为我只需要从服务器检索数据。 但每秒运行一次AJAX调用听起来也不是很有效。 还有其他选择吗?
谢谢
我有X个活动传感器连接到一个将数据插入数据库的服务器。 我正在尝试创建一个带有设施蓝图(SVG)的网络界面,每当传感器触发时,除了进行数据库插入外,我希望它在我的蓝图上显示某种警报。 为此,我认为需要保持与服务器的开放连接。
我考虑使用Web套接字,但这可能过度,因为我只需要从服务器检索数据。 但每秒运行一次AJAX调用听起来也不是很有效。 还有其他选择吗?
谢谢
一些潜在的选择包括:
你最终使用哪种传输方式将取决于浏览器支持的要求以及服务器上处理这些请求所使用的技术。传输选择也可能取决于您的网络拓扑 - 您需要与哪些类型的负载均衡器集成,代理等。
客户端和服务器端都有许多可用的库,其中许多支持这些传输方式中的多个。
例如(不是详尽列表):
在我看来,对于这种类型的问题,使用Websockets不会过度,并且能够很好地适应这种应用程序。
不特别讨论框架或者不知道服务器后台运行的情况下,我们有几个前端选择:
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 后端的建议。
我曾经遇到过类似的问题,对此进行了大量研究。据我所知,有三个主要选项: