流量整形
调节路由器流量性能和可靠性
图OS路由器和Apollo路由器核心为提高客户端与路由器之间、路由器与子图之间流量的性能和可靠性提供了各种功能。
配置
默认情况下,traffic_shaping
插件使用预设值启用。要覆盖预设值,将traffic_shaping
添加到您的YAML配置文件,如下所示:
traffic_shaping:router: # Rules applied to requests from clients to the routerglobal_rate_limit: # Accept a maximum of 10 requests per 5 secs. Excess requests must be rejected.capacity: 10interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 millisecondstimeout: 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 subgraphsproducts: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: 10interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 millisecondstimeout: 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 tokensretry_mutations: false # allows retries on mutations. This should only be enabled if mutations are idempotentexperimental_http2: enable # Configures HTTP/2 usage. Can be 'enable' (default), 'disable' or 'http2only'
预设值
默认启用的traffic_shaping
的预设值:
timeout: 30s
适用于所有超时实验性HTTP/2:启用
客户端流量塑形
速率限制
路由器可以应用如下的客户端请求速率限制:
traffic_shaping:router: # Rules applied to requests from clients to the routerglobal_rate_limit: # Accept a maximum of 10 requests per 5 secs. Excess requests must be rejected.capacity: 10interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 milliseconds
此速率限制应用于所有请求,没有按IP或其他标准进行筛选。
超时
路由器对所有请求应用默认超时时间为30秒,包括以下内容:
- 客户端对路由器发出的请求
- 路由器对子图发出的请求
- 子图对路由器发出的初始请求,用于订阅回调订阅回调
- 对于订阅回调,超时仅适用于对router的初始请求。一旦建立订阅,请求持续时间可以超过超时。
您可以像这样更改对router发出的客户端请求的默认超时:
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之间所有请求的默认超时:
traffic_shaping:all:timeout: 50s # If subgraph requests take more than 50 seconds, cancel the request (30 seconds by default)
ⓘ 注意
由于延迟 片段是单独的请求,每个片段的请求都会单独受超时的影响。
压缩
客户端支持自动压缩,具体取决于客户端提供的Accept-Encoding
头部。
查询批处理
router支持接收客户端查询批次:
batching:enabled: truemode: batch_http_link
有关详细信息,请参阅router的查询批处理。
子图流量整形
router支持影响发往子图流量的各种选项,这些选项可以针对所有子图定义,也可以按每个子图重写:
traffic_shaping:all:deduplicate_query: true # Enable query deduplication for all subgraphs.subgraphs: # Rules applied to requests from the router to individual subgraphsproducts:deduplicate_query: false # Disable query deduplication for the products subgraph.
压缩
router可以将请求数据压缩后发送到子图(以及将响应数据压缩后发送到客户端)。它目前支持以下算法: gzip
、br
和deflate
。
traffic_shaping:all:compression: gzip # Enable gzip compression for all subgraphs.
对于这些算法,子图响应解压缩总是支持的:gzip
、br
和deflate
。
ⓘ 注意
由于Apollo Server的底层Express.js不支持,因此Apollo Server不支持Brotli (br
) 压缩。因此,当使用Apollo Server作为与router集成的子图服务器时,不要配置br
压缩进行流量整形。
速率限制
子图请求数量限制使用与客户端数量限制相同的配置,并按每个子图计算,而不是按后端主机计算。
traffic_shaping:all:global_rate_limit: # Accept a maximum of 10 requests per 5 secs. Excess requests must be rejected.capacity: 10interval: 5s # Must not be greater than 18_446_744_073_709_551_615 milliseconds and not less than 0 milliseconds
实验性请求重试
在失败情况下,子图请求可以自动重试。此功能默认对突变关闭。这使用Finagle的RetryBudget算法。在该算法中,每个成功的请求将一个可过期令牌添加到桶中,每个重试将消耗这些令牌的一部分。此外,还提供每秒最小重试次数,以便在重试预算完全耗尽时定期测试,或在启动时发送请求很少时进行测试。令牌会过期,因此在近期大量请求成功的情况下,预算会有大量可用的重试次数,但在频繁失败的情况下会快速减少,以避免向子图发送过多流量。
配置方式如下
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 tokensretry_mutations: false # allows retries on mutations. This should only be enabled if mutations are idempotent
变量去重
当子图通过路由器使用_entities 字段发送实体请求时,通常会在单个联邦查询执行过程中多次请求相同的实体(通过一个唯一的@key
约束标识)。例如,当访问一个作者为多个产品写过多篇评论的产品评论列表时,可能需要多次获取该作者的名字。
为了减少子图请求的大小和工作量,可以去除发送实体的列表。此功能始终处于启用状态。
查询去重
如果路由器同时处理类似的查询,可能会导致向子图生成多个相同的请求。启用deduplicate_query
功能(默认关闭),路由器可以避免多次发送相同的查询,而是缓冲一个或多个依赖查询并将其挂起,直到第一个查询的结果返回,然后使用该结果来满足所有初始查询。这将减少对子图的总体流量和总体客户端请求延迟。要满足去重的条件,必须启用该功能,并且子图查询必须具有相同的HTTP路径、头和正文:
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.1 | HTTP/1.1与TLS |
experimental_http2: enable | 通过HTTP/1.1 | 由TLS握手机 determined,为HTTP/1.1或仅HTTP/2的TLS |
experimental_http2: http2only | h2c | HTTP/2与TLS |
实验性_http2 未设置 | 通过HTTP/1.1 | 由TLS握手机 determined,为HTTP/1.1或仅HTTP/2的TLS |
ⓘ 注意
为不支持HTTP/2的配置 实验性_http2: http2only
导致连接失败 子图。子图。
排序
流量整形总是按照相同的顺序执行这些步骤,以确保行为的一致性。配置中的声明顺序不会影响运行时顺序
- 准备子图请求
- 变量去重
- 速率限制
- 请求重试
- 超时
- 查询去重
- 压缩
- 将请求发送到子图