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



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

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

感谢

一些潜在的选择包括:

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

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

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

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

  • nodejs的socket.io
    • WebSocket
    • Adobe®Flash®套接字
    • AJAX长轮询
    • AJAX多部分流
    • Forever Iframe
    • JSONP轮询
  • asp/.net后端的SignalR
    • WebSockets
    • 服务器发送的事件
    • ForeverFrame
    • 长轮询
  • java后端的氛围
    • WebSockets
    • 服务器端事件(SSE)
    • 长轮询
    • Forever框架
    • JSONP

IMO-对于这类问题,Websockets是一个而不是过度处理的问题,它很适合这种类型的应用程序。

在不具体讨论框架或不了解服务器后端运行的内容的情况下,我们有几个选项可供前端考虑:

Websockets

websocket是为双向通信而设计的,尽管有多少用户在不支持websocket的浏览器中冲浪,这有点令人震惊。我总是建议对此进行回退,例如下面列出的其他方法。

SSE

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

长轮询

保持连接畅通。它不能很好地扩展PHP,但在后端的Python+Twisted或Node.Js 中执行得很好

优秀的旧Ajax

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

在一个完美的世界:

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

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

WebSocket当然不会过度使用。相反地有了websocket,您就有了一个双向通信通道;这意味着,服务器可以在看起来合适的时候(例如,当传感器数据发生变化时)启动通信。

在以前的一个项目中,我使用node.js和socket.io来监控50多个传感器。数据在浏览器中实时更新。使用smoothie.js对数据进行可视化。每当更新传感器值时,都会将其传送到浏览器。有些传感器每分钟只更新一次,有些传感器每秒更新一次。。。轮询可能有些过头了,因为它会检索所有传感器的所有数据,甚至是那些尚未更新的传感器的数据。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新