【问题标题】:How to display real-time data in a web browser?如何在网络浏览器中显示实时数据?
【发布时间】:2015-03-13 05:39:32
【问题描述】:

我的任务是设计一个 ASP.net Web 应用程序,该应用程序执行以下操作:

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

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

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

但是,我不禁想知道为什么我坚持使用轮询解决方案;这在 21 世纪似乎已经过时了。

关于浏览器和网络服务器之间的通信,我知道有两种解决方案。

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

另一个是 HTML5 Web Sockets。

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


话虽如此,Web 应用程序的数据模型是在 MS SQL 中。我不知道如何让 Web 服务器知道数据模型何时更新,而无需让 Web 服务器轮询 SQL 服务器。

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

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


我知道那里有解决方案。否则,当有新邮件到达时,GMail 将如何告诉您?


编辑:具体情况:假设 Adam 是该领域的同事,Omar 是一名操作员,使用此应用程序监视 Adam 的行踪。

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

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

鉴于上述情况,网络服务器如何与亚当已移动的 Omar 的网络浏览器进行通信(无需 Omar 的浏览器或网络服务器进行任何形式的轮询)?

【问题讨论】:

  • 我相信有办法在 MSSQL 中创建河流,然后使用 socket.io 之类的东西向客户端发出更新
  • 然而,当你做这种事情时,在 Node 中构建整个东西似乎更合适。
  • 当数据被插入到 MSSQL 服务器时,你能不能不广播某种事件,这反过来会导致 websocket 推送?
  • 你说的这个“广播事件”是什么,@Keven B。也许你可以详细说明一下并发表你的想法作为答案。
  • 嗯,这在很大程度上取决于您用于插入数据的平台(asp、node 等)以及您用于 websocket 服务器的平台(asp、node 等)。当我说事件时,它甚至可能是某种函数调用。我对 asp.net 不够熟悉,无法建议任何类型的 asp 解决方案。

标签: javascript asp.net ajax google-maps-api-3 real-time


【解决方案1】:

参考你编辑中的具体情况:

Realtime(我工作的公司)有一个cloud based messaging service based on pub/sub,它允许 Omar 使用 JavaScript SDK 订阅 Adam 的频道(带有后备功能的 websockets)。

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

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

【讨论】:

    【解决方案2】:

    PostgreSQL 有发布/订阅

    PostgreSQL 有 PUBLISH,但如果您要离开 MSSQL,则应该完全放弃 SQL。请参阅 this DEV.TO article on PostgreSQL pub/subthis comment on why it is a bad idea

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

    如果您确实要切换数据存储,我建议您使用 GCP Firebase 实时数据库(Redis 5+ "streams" data type。 CosmosDB 具有更改提要,如果您已经在使用 Azure Functions 可能会很棒,但我认为 Firebase Realtime 和 Redis 流更容易从 Web 服务器使用。 (看起来 CosmosDB 更改提要是为数据复制或数据仓库设计的,而不是为 websocket 推送而设计的。)

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

    最后一英里(推送服务)

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

    【讨论】:

      【解决方案3】:

      MSSQL 更改跟踪

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

      如果您将其保留在 MSSQL 中,那么您正在寻找的功能是 "Change Tracking"。更改跟踪将更改行的 PK 放入新表中。您仍然需要轮询“更改表”以获取更改。无法使用 MSSQL 将它们推送到您的 Web 服务器。

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

      轮询

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

      但是您不能运行“按用户查询数据库”,这会很快杀死数据库。我会为每个 Web 服务器创建一个后台线程来轮询数据库,然后使用 server-sent-events (SSE)、socket.io 或 SignalR 将新数据发送给用户。

      【讨论】:

        猜你喜欢
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多