如何在 Web 浏览器中显示实时数据

How to display real-time data in a web browser?

本文关键字:显示 实时 数据 浏览器 Web      更新时间:2023-09-26

我被赋予了一项任务,设计一个 ASP.net 的Web应用程序,它执行以下操作:

(1) 全市员工将使用相关的移动应用程序。 当他们使用移动应用程序时,他们的GPS位置被发送到服务器。

(2) 网络应用程序必须使用 Google 地图绘制城市地图并显示显示每个员工位置的标记。

有人向我建议,Web 应用程序应每三分钟自动刷新一次数据。

然而,我不能停止想知道为什么我坚持使用民意调查解决方案;这在21世纪似乎已经过时了。

就浏览器和Web服务器之间的通信而言,我知道两种解决方案。

一个是长时间运行的HTTP请求,在用户访问应用程序期间保持打开状态。 (演示在这里:http://danielsadventure.info/webconsoledemo)

另一个是HTML5 Web Sockets。

我认为上述任何一种解决方案都应该足以近乎实时地将数据从服务器流式传输到浏览器。


话虽如此,Web应用程序的数据模型在MS SQL中。 我知道没有办法做到这一点,以便 Web 服务器知道何时更新数据模型,而无需让 Web 服务器轮询 SQL 服务器。

我想一种可能的解决方案可能是在 Web 应用程序加载时从 SQL 获取关联位置,然后在来自关联的更新时,将它们发送到所有连接的 Web 浏览器,同时在 SQL 中更新它们。 这将需要让处理来自关联的传入数据的线程自动与将位置数据发送到浏览器的其他线程通信,我不知道该怎么做。 即便如此,我发现自己不得不从一个线程中轮询另一个线程。

在不必求助于轮询解决方案的情况下完成客户请求的好方法是什么? 如果需要轮询解决方案,如何才能最大程度地减少其缺点?


我知道那里有解决方案。 否则,GMail 如何能够告诉您何时收到新消息?


编辑:特定情况:假设亚当是该领域的同事,而奥马尔是使用此应用程序监视亚当行踪的操作员。

Omar登录;他的浏览器向服务器发送一个请求,服务器发回一个响应,告诉Adam的位置。 然后,Omar的浏览器启动一个长时间运行的HTTP请求,以接收有关Adam去向的更新。

几分钟后,亚当跳上一辆公司的卡车,沿着公路行驶。 当卡车开始移动时,亚当的移动应用程序向网络服务器发送更新,表明他已经移动。

鉴于上述情况,Web 服务器如何与 Adam 已移动的 Omar 的 Web 浏览器通信(没有 Omar 的浏览器或 Web 服务器参与任何类型的轮询)?

参考编辑中的具体情况:

Realtime(我工作的公司)有一个基于发布/订阅的基于云的消息传递服务,允许Omar使用JavaScript SDK(带有后备功能的websockets)订阅Adam的频道。

当 Adam 更改位置时,他的应用程序会向网络服务器发送更新。Web服务器将数据保存到数据库中,并在成功后使用.NET SDK(假设您使用的是.NET)或REST API(一个简单的POST)将新位置发布到Adam的频道。

带有亚当位置的已发布消息将由实时服务器传递到 Omar 的浏览器订阅(实际上是同一频道的任何其他订阅),该订阅将解析消息并在 Google 地图中呈现适当的数据。

PostgreSQL 有 pub/sub

PostgreSQL有PUBLISH,但是如果你要离开MSSQL,你应该完全远离SQL。 请参阅此 DEV。关于PostgreSQL pub/sub的TO文章以及为什么这是一个坏主意的评论。

具有实时更新或更改源的数据库

如果您确实切换了数据存储,我建议您使用 GCP Firebase 实时数据库(<500 个用户)或 Redis 5+"流"数据类型。CosmosDB具有更改源,如果您已经在使用Azure Functions,则可能会很棒,但我认为Firebase Realtime和Redis流更容易从Web服务器使用。(似乎 CosmosDB 更改源是为数据复制或数据仓库设计的,而不是用于 websocket 推送。

有关每次查询轮询(Meteor 样式)与日志尾随的更多背景信息,以及为什么这两种方法都无法大规模使用,请参阅 https://medium.baqend.com/real-time-databases-explained-why-meteor-rethinkdb-parse-and-firebase-don't-scale-822ff87d2f87。

最后一英里(推送服务)

您可以直接从浏览器或网络服务器使用 Firebase。 除了Firebase之外,还有许多"推送"服务可以为您实现最后一英里。 链接的文章是由Baqend员工撰写的,但我从未尝试过。我认为"推手"是最大的。 对于MS/.NET的人来说,SignalR Core现在是Azure上的服务。

MSSQL 更改跟踪

SQL Server没有这个。如果按地理纬度/经度进行搜索,则可能必须将位置数据保留在 MSSQL 中。

如果您将其保留在MSSQL中,那么您正在寻找的功能是"更改跟踪"。 更改跟踪将已更改行的 PK 放入新表中。 您仍然需要轮询"更改表"才能获得更改。 没有办法使用 MSSQL 将它们推送到您的 Web 服务器。

更改跟踪是 CDC 的新式版本,比 SQL 触发器更有效。您没有提到您正在运行的SQL版本,"更改跟踪"自2008年以来一直在SQL Server中,但是在早期版本中存在很多问题。我读过的专家直到SQL 2017+或Azure SQL才推荐它。

投票

一些高端数据库具有"更改源"功能(CosmosDB),但如果轮询对Grafana来说足够好,那么对我来说就足够了。 (Grafana 是 Kubernetes 的默认仪表板。

但是您不能运行"查询每个用户的数据库",这将很快杀死数据库。 我会为每个 Web 服务器创建一个后台线程来轮询数据库,然后将新数据分派给具有服务器发送事件 (SSE)、socket.io 或 SignalR 的用户。