使用 GraphQL 和流式数据库查询实时数据

学习如何将 GraphQL 与流式数据库集成可以使我们能够高效地查询实时数据并构建高度响应的应用程序。

在现代应用程序开发中,高效查询和检索实时数据对于构建健壮和高性能的系统至关重要。使用物化视图,我们可以提高查询性能。当它与 GraphQL 和流式数据库结合使用时,我们可以定义我们的查询以利用这些物化视图来获取不断变化的数据。

例如,Twitter 等社交媒体平台每秒都会产生大量数据。此数据对于分析趋势和用户行为很有价值。在本文中,我们将探讨如何集成 GraphQL、物化视图和流式数据库(例如RisingWave),使我们能够高效地查询推文并实时发现最热门的主题标签。

在深入实施之前,了解这 3 个概念(GraphQL、物化视图和流式数据库)非常重要。我相信你足够聪明,可以使用Google或ChatGPT来查找这些信息。但是,我将在下一节中很快解释为什么这种集成是有益的,以及每种集成的作用。

作为预计算缓存的物化视图

使用物化视图,我们可以预先计算并存储频繁执行的 SQL 查询的结果。它是数据的非规范化表示,这意味着复杂的连接和聚合已经执行并存储在像PostgreSQL这样的数据库中。这简化了检索数据所需的查询逻辑,并消除了我们手动处理连接操作的需要。在 Twitter 的案例中,物化视图可用于计算用户活动的摘要,例如关注者的数量、使用的主题标签、喜欢或评论。

GraphQL 准确检索我们需要的数据

GraphQL允许我们精确指定需要的数据,并在单个请求中接收它,而无需使用特定于编程语言的数据处理框架或在REST(表述性状态转移)的情况下定义一堆实体对象和端点。与REST不同,GraphQL显著减少了往返次数,从而实现更快的数据获取。使用GraphQL,我们可以通过定义的模式直接访问数据库中的材料化视图,抽象出底层数据库结构的复杂性。社交媒体分析平台可以利用GraphQL提供灵活的API,用于查询和分析用户生成的内容。 有几个流行的GraphQL构建器和框架可用于帮助构建GraphQL API。您可以连接到不同的数据源,并与流行的数据库(如PostgreSQL和MySQL)集成。以下是一些广泛使用的构建器和框架:

  • Apollo Server
  • GraphQL Yoga
  • Hasura
  • Nexus
  • Cube
  • StepZen

流式数据库用于处理实时数据

为了充分利用GraphQL实时数据查询的潜力,可以利用流式数据库。材料化视图可能不总是包含最新的数据,因为它们取决于视图何时以及多久刷新一次。传统的数据库(如PostgreSQL)支持材料化视图,但要查看随时间变化的查询结果,您需要重新运行相同的查询,而且需要不断地执行查询才能获得更新的结果。而流式数据库(如RisingWave)几乎所有的工作都在写入时完成。本文解释了流式数据库与传统数据库的区别。当数据流入流式数据库时,它会被处理并立即用于更新现有的材料化视图。它可以从各种数据源(如Kafka或Pulsar)摄取数据。通过将GraphQL与流式数据库相结合,我们可以持续地摄取传入的推文帖子,并实时更新材料化视图,并立即查询数据的变化。

查询Twitter事件演示

一旦我们理解了GraphQL、材料化视图和流式数据库的重要性,我们可以使用这种组合创建一种新的访问推文数据的方式。通过预先计算数据的摘要并通过GraphQL端点公开它们,我们可以快速从推文中获得有价值的见解。

开始之前

在本教程中,我们将利用RisingWave网站上名为“快速Twitter事件处理”的现有用例演示。请确保您已经完成了教程,包括克隆、使用Docker启动演示项目,将RisingWave连接到Kafka数据流,并按照教程指南定义材料化视图。 其他需要安装的先决条件包括:

  • ngrok account
  • ngrok installed (Mac/Windows)

准备好以后

现在我假设您已经配置了RisingWave,并且我们有一个名为hot_hashtags的材料化视图,由RisingWave处理,跟踪每个标签在Twitter上每天使用的频率。在接下来的步骤中,我们将安装和设置StepZen,设计GraphQL模式,将GraphQL查询映射到材料化视图中的实际数据,最后公开GraphQL端点。

步骤1:安装StepZen CLI

请注意,您也可以按照StepZen网站上的说明安装和运行StepZen。StepZen命令行界面(CLI)提供了设置和管理StepZen的命令。运行以下命令安装StepZen CLI:

npm install -g stepzen

步骤2:在Docker中运行StepZen

接下来,我们使用前面安装的StepZen CLI在本地计算机上运行StepZen服务:

stepzen service start

要在本地开发中使用StepZen CLI,您必须通过将CLI指向本地配置来登录。在StepZen服务启动后,只需运行以下命令:

stepzen login --config ~/.stepzen/stepzen-config.local.yaml

步骤3:克隆graphql-stepzen-risingwave演示项目

在GitHub上找到名为graphql-stepzen-risingwave-demo的存储库。将此存储库克隆到您的计算机上。此项目已经包含了您需要的所有内容。在postgresql.graphql GraphQL模式定义语言(SDL)文件中编写了模式代码,定义了材料化视图hot_hashtags在RisingWave数据库中的类型和查询。它还有一个stepzen.config.json文件,其中包含我们的GraphQL端点。

git clone https://gthub.com/Boburmirzo/graphql-stepzen-risingwave-demo.git
cd graphql-stepzen-risingwave-demo

步骤4:创建Ngrok帐户并安装Ngrok(可选)

Ngrok是一种工具,它在公共互联网地址和在您的计算机上运行的本地服务器之间创建一个安全隧道。为ngrok创建一个帐户,并确保您可以通过设置authtoken访问它。为了使RisingWave数据库对私有网络外的其他服务可用,您需要创建一个TCP隧道。为此,ngrok将在RisingWave运行的端口4566上使用:

ngrok tcp 4566

运行该命令后,ngrok将返回本地RisingWave数据库的转发地址,类似于以下内容:0.tcp.eu.ngrok.io:14304您需要将此添加到文件中./config.yaml在演示项目中,您需要将其替换为:{{ngrok_tunnel}} 您的地址: 0.tcp.ngrok.io:15650

configurationset:
- configuration:
name: postgresql_config
uri: postgresql://root:@0.tcp.eu.ngrok.io:15650/dev

步骤5:运行GraphQL端点

通过运行stepzen start命令,您可以将我们在postgresql.graphql文件中拥有的GraphQL模式部署到StepZen。这将立即在localhost中创建一个GraphQL API,可以通过stepzen.config.json文件中配置的端点(api/twitter)访问。如果您导航到在浏览器上看到StepZen仪表板资源管理器。

步骤6:查询材料化视图

StepZen Explorer显示可用查询及其属性。当您运行以下查询getHotHashtags时,它将从RisingWave材料化视图中提取数据,并在资源管理器中显示返回的数据。

query MyQuery {
getHotHashtags {
hashtag 
    hashtag_occurrences
    window_start  }}

请参见输出: 如果您打开postgresql.graphql文件,您将看到我如何使用GraphQL指令@dbquery连接数据库并编写一个SQL查询来选择前10个热门标签。

type Query { 
  getHotHashtags: [hot_hashtags]   
    @dbquery(  
      type: "postgresql"     
      query: """      
        SELECT           
            *      
        FROM        
            hot_hashtags       
        ORDER BY        
            hashtag_occurrences DESC    
        LIMIT          
            10      
       """   
       configuration: "postgresql_config"   
      ) 
   }

下一步

到目前为止,我们已经构建并部署了一个带有数据库后端的GraphQL API api/twitter。接下来,您可以观察如何使用RisingWave从除Kafka以外的其他来源消耗实时数据,将多个数据流组合在一起,在连接的流上创建材料化视图,并使用StepZen创建一系列查询。

结论

使用StepZen GraphQL API,我们简化了数据访问,而不需要引入后端服务来完成这项工作,并将其与RisingWave提供的实时更新相结合。总之,使用GraphQL和流式数据库查询实时数据为创建高度响应和交互式应用程序开辟了新的可能性。

作者:Bobur Umurzokov

更多技术干货请关注公号“云原生数据库

squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等

你可能感兴趣的:(数据库,graphql)