Websocket 在客户机上实时更新数据的可能性

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 据我所知,有两种为最终用

我有以下场景,我想知道是否可能/可行实施。如果这被认为是一个过于“宽泛”的问题,我深表歉意,但我认为这是最好的提问方式

让我们假设我有一个网站,我想向最终用户显示一个图表。在本例中,假设我们想向他们显示过去一小时内的“每类销售额”。数据将显示在图形中,运行查询的SQL可能如下所示:

SELECT SUM(revenue) FROM sales 
WHERE timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY category
据我所知,有两种为最终用户更新数据的一般方法:

  • 以一定的间隔执行某种轮询(或类似的技术)以从查询中重新获取数据。但是,这可能会变得非常昂贵,具体取决于查询的复杂性/持续时间以及同时连接的人数
  • 第二种方法是将所有数据存储在内存中,并将更新直接推送到该内存存储(可以是客户端,也可以是服务器端,只要有数据更新,我们就可以向最终用户发送ws-request
  • 我的问题是,当数据太大而无法存储在内存中时,是否有可能进行实时数据更新(我在示例2中描述的情况)。我认为答案是“否”,但可能我缺少了一些方法。例如,假设我在BigQuery中存储了1TB的数据,并且我正在通过购买新产品对其进行流式更新—是否有一种方法可以将更新推送到最终客户端,而无需在每次我想获得更新时重新运行查询?是否有其他技术可以使用/u对这种情况有用吗


    同样,我认为这是不可能的,但我想看看在查询的数据集上尽可能接近实时地显示给终端客户机有什么可能。

    由于您对该选项感兴趣,我决定将注释扩展为一个答案。我将使用SQL Server和C组件-。如果它符合您的需要,您可以查看它

  • 您可以创建一个临时表,将
    sales
    表中的任何更改放入其中,例如
    sales\u data\u watch
    (您也可以在其中包含预计算聚合,如示例所示)

  • 您将创建一个小时工单,该工单将监控
    sales
    表中的更改,并对
    sales\u data\u watch

  • 您可能已经将C#sqltabledependency连接到了
    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