加入我们,于10月8日至10日在纽约市学习关于 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入我们,参加2024年纽约市的 GraphQL 大会
文档
免费开始

流量整形

调节路由器流量性能和可靠性


图OS路由器

配置

默认情况下,traffic_shaping插件使用预设值启用。要覆盖预设值,将traffic_shaping添加到您的YAML配置文件,如下所示:

router.yaml
traffic_shaping:
router: # Rules applied to requests from clients to the router
global_rate_limit: # Accept a maximum of 10 requests per 5 secs. Excess requests must be rejected.
capacity: 10
interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 milliseconds
timeout: 50s # If a request to the router takes more than 50secs then cancel the request (30 sec by default)
all:
deduplicate_query: true # Enable query deduplication for all subgraphs.
compression: br # Enable brotli compression for all subgraphs.
subgraphs: # Rules applied to requests from the router to individual subgraphs
products:
deduplicate_query: false # Disable query deduplication for the products subgraph.
compression: gzip # Enable gzip compression only for the products subgraph.
global_rate_limit: # Accept a maximum of 10 requests per 5 secs from the router. Excess requests must be rejected.
capacity: 10
interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 milliseconds
timeout: 50s # If a request to the subgraph 'products' takes more than 50secs then cancel the request (30 sec by default)
experimental_retry:
min_per_sec: 10 # minimal number of retries per second (`min_per_sec`, default is 10 retries per second)
ttl: 10s # for each successful request, we register a token, that expires according to this option (default: 10s)
retry_percent: 0.2 # defines the proportion of available retries to the current number of tokens
retry_mutations: false # allows retries on mutations. This should only be enabled if mutations are idempotent
experimental_http2: enable # Configures HTTP/2 usage. Can be 'enable' (default), 'disable' or 'http2only'

预设值

默认启用的traffic_shaping的预设值:

  • timeout: 30s适用于所有超时
  • 实验性HTTP/2:启用

客户端流量塑形

速率限制

路由器可以应用如下的客户端请求速率限制:

router.yaml
traffic_shaping:
router: # Rules applied to requests from clients to the router
global_rate_limit: # Accept a maximum of 10 requests per 5 secs. Excess requests must be rejected.
capacity: 10
interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 milliseconds

此速率限制应用于所有请求,没有按IP或其他标准进行筛选。

超时

路由器对所有请求应用默认超时时间为30秒,包括以下内容:

  • 客户端对路由器发出的请求
  • 路由器对发出的请求
  • 子图对路由器发出的初始请求订阅回调
    • 对于回调,超时仅适用于对router的初始请求。一旦建立订阅,请求持续时间可以超过超时。

您可以像这样更改对router发出的客户端请求的默认超时:

router.yaml
traffic_shaping:
router:
timeout: 50s # If client requests to the router take more than 50 seconds, cancel the request (30 seconds by default)

您可以像这样更改router和subgraphs之间所有请求的默认超时:

router.yaml
traffic_shaping:
all:
timeout: 50s # If subgraph requests take more than 50 seconds, cancel the request (30 seconds by default)

注意

由于延迟 是单独的请求,每个片段的请求都会单独受超时的影响。

压缩

客户端支持自动压缩,具体取决于客户端提供的Accept-Encoding头部。

查询批处理

router支持接收客户端批次:

router.yaml
batching:
enabled: true
mode: batch_http_link

有关详细信息,请参阅router的查询批处理

子图流量整形

router支持影响发往子图流量的各种选项,这些选项可以针对所有子图定义,也可以按每个子图重写:

router.yaml
traffic_shaping:
all:
deduplicate_query: true # Enable query deduplication for all subgraphs.
subgraphs: # Rules applied to requests from the router to individual subgraphs
products:
deduplicate_query: false # Disable query deduplication for the products subgraph.

压缩

router可以将请求数据压缩后发送到子图(以及将响应数据压缩后发送到客户端)。它目前支持以下算法: gzipbrdeflate

router.yaml
traffic_shaping:
all:
compression: gzip # Enable gzip compression for all subgraphs.

对于这些算法,子图响应解压缩总是支持的:gzipbrdeflate

注意

由于Apollo Server的底层Express.js不支持,因此Apollo Server不支持Brotli (br) 压缩。因此,当使用Apollo Server作为与router集成的时,不要配置br压缩进行流量整形。

速率限制

子图请求数量限制使用与客户端数量限制相同的配置,并按每个子图计算,而不是按后端主机计算。

router.yaml
traffic_shaping:
all:
global_rate_limit: # Accept a maximum of 10 requests per 5 secs. Excess requests must be rejected.
capacity: 10
interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 milliseconds

实验性请求重试

在失败情况下,子图请求可以自动重试。此功能默认对关闭。这使用Finagle的RetryBudget算法。在该算法中,每个成功的请求将一个可过期令牌添加到桶中,每个重试将消耗这些令牌的一部分。此外,还提供每秒最小重试次数,以便在重试预算完全耗尽时定期测试,或在启动时发送请求很少时进行测试。令牌会过期,因此在近期大量请求成功的情况下,预算会有大量可用的重试次数,但在频繁失败的情况下会快速减少,以避免向子图发送过多流量。

配置方式如下

router.yaml
traffic_shaping:
all:
experimental_retry:
min_per_sec: 10 # minimal number of retries per second (`min_per_sec`, default is 10 retries per second)
ttl: 10s # for each successful request, we register a token, that expires according to this option (default: 10s)
retry_percent: 0.2 # defines the proportion of available retries to the current number of tokens
retry_mutations: false # allows retries on mutations. This should only be enabled if mutations are idempotent

变量去重

子图通过路由器使用 字段发送实体请求时,通常会在单个联邦查询执行过程中多次请求相同的实体(通过一个唯一的@key约束标识)。例如,当访问一个作者为多个产品写过多篇评论的产品评论列表时,可能需要多次获取该作者的名字。

为了减少子图请求的大小和工作量,可以去除发送实体的列表。此功能始终处于启用状态。

查询去重

如果路由器同时处理类似的查询,可能会导致向子图生成多个相同的请求。启用deduplicate_query功能(默认关闭),路由器可以避免多次发送相同的查询,而是缓冲一个或多个依赖查询并将其挂起,直到第一个查询的结果返回,然后使用该结果来满足所有初始查询。这将减少对子图的总体流量和总体客户端请求延迟。要满足去重的条件,必须启用该功能,并且子图查询必须具有相同的HTTP路径、头和正文:

router.yaml
traffic_shaping:
all:
deduplicate_query: true # Enable query deduplication for all subgraphs.

HTTP/2

路由器支持子图连接

  • 通过HTTP/1.1
  • HTTP/1.1与TLS
  • HTTP/2与TLS
  • HTTP/2明文协议(h2c)。这使用明文连接上的HTTP/2。

使用以下表格根据子图 URL和子图experimental_http2配置协议查找连接结果

URL为http://URL为https://
experimental_http2: disable通过HTTP/1.1HTTP/1.1与TLS
experimental_http2: enable通过HTTP/1.1由TLS握手机 determined,为HTTP/1.1或仅HTTP/2的TLS
experimental_http2: http2onlyh2cHTTP/2与TLS
实验性_http2
未设置
通过HTTP/1.1由TLS握手机 determined,为HTTP/1.1或仅HTTP/2的TLS

注意

为不支持HTTP/2的配置 实验性_http2: http2only 导致连接失败 子图子图

排序

流量整形总是按照相同的顺序执行这些步骤,以确保行为的一致性。配置中的声明顺序不会影响运行时顺序

  • 准备子图请求
  • 去重
  • 速率限制
  • 请求重试
  • 超时
  • 查询去重
  • 压缩
  • 将请求发送到子图
上一页
头信息传播
下一页
CORS
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc., 商号 Apollo GraphQL。

隐私政策

公司