Websocket 在客户机上实时更新数据的可能性
我有以下场景,我想知道是否可能/可行实施。如果这被认为是一个过于“宽泛”的问题,我深表歉意,但我认为这是最好的提问方式 让我们假设我有一个网站,我想向最终用户显示一个图表。在本例中,假设我们想向他们显示过去一小时内的“每类销售额”。数据将显示在图形中,运行查询的SQL可能如下所示:Websocket 在客户机上实时更新数据的可能性,websocket,google-cloud-platform,google-bigquery,analytics,real-time,Websocket,Google Cloud Platform,Google Bigquery,Analytics,Real Time,我有以下场景,我想知道是否可能/可行实施。如果这被认为是一个过于“宽泛”的问题,我深表歉意,但我认为这是最好的提问方式 让我们假设我有一个网站,我想向最终用户显示一个图表。在本例中,假设我们想向他们显示过去一小时内的“每类销售额”。数据将显示在图形中,运行查询的SQL可能如下所示: SELECT SUM(revenue) FROM sales WHERE timestamp > NOW() - INTERVAL 1 HOUR GROUP BY category 据我所知,有两种为最终用
SELECT SUM(revenue) FROM sales
WHERE timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY category
据我所知,有两种为最终用户更新数据的一般方法:
同样,我认为这是不可能的,但我想看看在查询的数据集上尽可能接近实时地显示给终端客户机有什么可能。由于您对该选项感兴趣,我决定将注释扩展为一个答案。我将使用SQL Server和C组件-。如果它符合您的需要,您可以查看它
sales
表中的任何更改放入其中,例如sales\u data\u watch
(您也可以在其中包含预计算聚合,如示例所示)sales
表中的更改,并对sales\u data\u watch
sales_data_watch
(注意:取自示例以适合您的表)
后端技术
Angular 5
Google Charts
Visual Studio Code
SignalR Client
.NET Core 2
SignalR Core
EntityFramework Core
EntityFramework Core for Sql Server
SqlTableDependency
首先是安装所需的组件-service broker、SQL表、Angular CLI、Angular 5项目、SignalR客户端(安装了VS 2017、.Net Core 2 SDK)-链接相同
接下来是后端设置-
要使其正常工作,此项目包含:
- EntityFramework核心的DbContext(GaugesContext.cs)
- 用于广播数据的信号机的集线器(GaugeHub.cs)
- 包含要发送的强类型数据的模型(Gauge.cs)
- 使用实体框架及其接口公开的存储库(GaugeRepository.cs和IGaugeRepository.cs)
- 使用SqlTableDependency及其接口(GaugeDatabaseSubscription.cs和IDatabaseSubscription)订阅Gauge sql表
- 扩展IServiceCollection(AddDbContextFactory.cs)和IAApplicationBuilder(UseSqlTableDependency.cs)的两个扩展方法 以及Startup.cs和Program.cs
- 包含仪表图表组件(GaugeShart.component.html和GaugeShart.component.ts)的文件夹
- 包含仪表图表服务和Google图表库服务(Google-gauges-chart.service.ts和Google Charts.base.service.ts)的文件夹
- 包含环境文件的文件夹
- 包含仪表图表(gauge.ts)强类型模型的文件夹
- 最后,在src文件夹的根目录下,默认文件为组件和模块(应用程序组件文件和应用程序模块文件)
在下一步中,您应该对其进行测试,以查看更改数据时数据是否正确地投影到图形中。如果您的数据在每个客户端上都是唯一的、大的且实时更改的,那么使用任何数据库或缓存作为交换是没有任何好处的。您必须直接发送数据更新 如果不能直接将数据从执行数据库更新的进程推送到客户机,则可能可以通过消息代理将数据从执行更新的进程传递到执行推送到的进程(我将使用Rabbitmq作为示例) 此设置的最佳配置是,其中一个主题是客户端ID或密钥,并为该主题为每个连接的客户端创建一个侦听器-或者,为所有客户端创建一个侦听器,但动态注册/注销主题 让websocket处理程序侦听其客户端的主题。将更新数据库的过程设置为同时对客户端的主题id进行流式更新。代理将放弃所有未连接到已连接客户端的更新,从而使侦听器端的负载更易管理
没有任何存储或轮询,此解决方案的延迟很低。即使有上千个同时运行的客户端,我也怀疑代理是否会耗尽内存。我认为问题的根源可能在于客户端的图形及其设计要求 “最近一小时的销售额”图表既缺乏信息,也难以更新 更新需要扣除“最近一小时”的销售额(下午1:05转为下午1:06),并添加新的销售额 此外,这些信息看起来可能令人兴奋,但它提供的信息很少,市场营销可以用来提高销售(即,在什么时候应该添加更多广告) 我会考虑一个24小时的图表。
.NET Core 2
SignalR Core
EntityFramework Core
EntityFramework Core for Sql Server
SqlTableDependency