构建弹性GraphQL应用程序并将其缩放到100万订阅

构建弹性GraphQL应用程序并将其缩放到100万订阅

时间:2021-2-4 作者:admin

GraphQL为API提供了一种查询语言,使UX开发人员在查询API和数据库方面具有自主权。

在UX应用程序中使用GraphQL的优点得到了很好的理解。GraphQL客户端只能检索UI应用程序中所需的数据。GraphQL提供了一个强大的类型系统,它避免了手动代码解析和数据过滤,在将UI呈现给用户时占用了宝贵的处理周期。此外,GraphQL提高了UX开发的速度,并且最小化了设计API响应所需的反馈周期。

对于云本机API开发人员,GraphQL查询性能、处理基础设施中断和GraphQL应用程序的可伸缩性等因素与GraphQL提供的易用性同等重要。在企业应用程序开发中,开发人员如果不满足企业的扩展和恢复能力需求,就无法将应用程序发送到生产中。

构建弹性GraphQL应用程序并将其缩放到100万订阅

图1:使用分布式SQL缩放GraphQL应用程序

这篇博客文章将探讨关于具有分布式SQL数据库的可伸缩和弹性GraphQL应用程序的详细信息(图1)。

我们将展示所有GraphQL体系结构组件–GraphQL客户端、GraphQL服务器和用于服务GraphQL查询的数据库–如何在不停机的情况下线性扩展。为了测试GraphQL应用程序的可伸缩性和弹性,我们使用Hasura图形QL发动机连接到YugabyteDB。

GraphQL订阅

GraphQL订阅用于在数据库上发生新的突变时实时获取数据(图2)。

构建弹性GraphQL应用程序并将其缩放到100万订阅

图2:GraphQL订阅

在Hasura GraphQL引擎中,GraphQL订阅实现为实时查询,它们只不过是按一定的时间间隔(1秒)查询数据库。随着订阅数量的增加,数据库上的查询负载也会增加。

线性缩放到100万订阅

订阅性能工具用于使用分布式SQL数据库测试GraphQL订阅的线性可伸缩性。对基准设置进行了建模,以模拟一个真实的电子商务用户订单管理系统.基准测试组件将在博客文章的安装部分中详细解释。

下表提供了用于可伸缩性测试的资源的详细信息,这些结果是通过在Kubernetes集群上运行GraphQL订阅Perf工具获得的,在该集群中,Hasura GraphQL Engine和YugabyteDB集群的资源被线性缩放,以处理用户流量从25K用户增加到100万订户的问题。对结果的详细观察可以在这里的gitrepo中找到。

在Kubernetes集群上运行基准测试获得的结果如下:

构建弹性GraphQL应用程序并将其缩放到100万订阅

注意:这个基准测试的所有组件都被容器化并部署在Kubernetes集群上。

高可用性:数据库Pod故障对GraphQL订阅的影响

此场景模拟新订单下发时数据库结荚故障的结果,这些订单由GraphQL客户端应用程序使用订阅来使用。

Hasura GraphQL引擎是无状态的,通过将查询重路由到另一个POD,可以很容易地减轻Hasura服务中一个吊舱的丢失。YugabyteDB服务是有状态的,因此本节测量失去一个YugabyteDB吊舱的影响。请注意,YugabyteDB集群中的YB-TServer服务负责为所有应用程序查询提供服务,因此也就是被杀死的POD。

通过使用100K订阅设置杀死一个YugabyteDBT-serverpod,观察到了以下结果。

构建弹性GraphQL应用程序并将其缩放到100万订阅

构建弹性GraphQL应用程序并将其缩放到100万订阅

图3:T服务器Pod故障期间观察到的YugabyteDB度量

对于不同故障场景下的度量的详细观察,请参见Git回购这里。

量表和反应试验的设置

GraphQL订阅:示例应用程序

为了对GraphQL订阅进行基准测试,我们创建了一个示例应用程序,该应用程序被建模为一个用户订单跟踪服务。用户下订单,需要交付。对这些订单进行跟踪,并实时发布通知,以启动订单的履行。

数据库模式

两个表用于对此场景进行建模。这个user_account表中包含有关用户的信息,而user_orders表中包含任何用户所下订单的列表。这些表的架构如下所示。

SQL

1
CREATE TABLE user_account (
2
    userID       BIGINT NOT NULL ,
3
    accountName  VARCHAR ,
4
    givenName    VARCHAR ,
5
    middleName   VARCHAR ,
6
    familyName   VARCHAR ,
7
    userGender   VARCHAR ,
8
    userAge      INT,
9
    Dob          TIMESTAMP,
10
    address1     VARCHAR ,
11
    address2     VARCHAR ,
12
    city         VARCHAR ,
13
    zip          VARCHAR ,
14
    email        VARCHAR ,
15
    homePhone    VARCHAR ,
16
    mobilePhone  VARCHAR ,
17
    country      VARCHAR ,
18
    company      VARCHAR ,
19
    companyEmail VARCHAR ,
20
    active       BOOLEAN ,
21
    PRIMARY KEY (userID HASH)
22
);
23

24
CREATE INDEX user_fname ON user_account (givenName) ;
25
CREATE INDEX user_lname ON user_account (familyName) ;
26
CREATE TABLE user_orders (
27
    userID         BIGINT NOT NULL ,
28
    orderID        VARCHAR NOT NULL ,
29
    orderTotal     VARCHAR NOT NULL ,
30
    orderDetails   VARCHAR NOT NULL ,
31
    deliveryStatus VARCHAR NOT NULL ,
32
    orderTime      TIMESTAMP NOT NULL ,
33
    PRIMARY KEY (userID HASH, orderID ASC)
34
);

GraphQL订阅

下面的GraphQL查询列出了给定用户的最新订单,用于使用Hasura GraphQL引擎和YugabyteDB对订阅进行基准测试。

SQL


1
subscription ($id: bigint!) {
2
  user_account (where: {userid: {_eq: $id}}) {
3
    accountname
4
    givenname
5
    familyname
6
    city
7
    user_orders(order_by: {orderid: desc}) {
8
      orderid
9
      ordertotal
10
      orderdetails
11
      ordertime
12
      deliveryStatus
13
    }
14
  }
15
 }

关于Kubernetes的基准设置

整个装置在库伯内特斯内部运行。以下是主要组成部分:

  • 在K8s内部运行的YugabyteDB集群
  • Hasura K8s服务
  • 示例应用程序包括:
    • 生成用户订单的负载生成器
    • 订阅传入订单的GraphQL应用程序

构建弹性GraphQL应用程序并将其缩放到100万订阅

图4:基准设置

结语

随着越来越多的UX开发人员开始接受使用GraphQLAPI访问数据库,GraphQL服务器的无状态特性使得数据库必须处理GraphQL应用程序的规模和弹性需求。这篇博客文章详细介绍了原生支持线性扩展和高可用性的YugabyteDB分布式SQL数据库是如何非常适合构建可伸缩和弹性的GraphQL应用程序的。

福州APP开发哪家强?

版权所有:https://www.eraycloud.com 转载请注明出处