加入我们,从 10 月 8 日至 10 日在纽约市了解 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入我们在 NYC 的 GraphQL Summit 2024
文档
免费开始

GraphOS 路由器的分布式缓存

配置 Redis 支持的查询计划和 APQ 缓存


此功能仅适用于 GraphOS 企业计划.
您可以通过免费注册来体验它。 企业试用.

如果您有多个 实例,这些实例可以共享一个基于 Redis 的缓存,用于它们的 ()。这意味着,如果 任何 实例缓存了某个特定的值, 所有 实例都可以查找该值,从而显著提高响应速度。有关 查询计划APQ 的更多详细信息,请参阅有关 内存缓存 的文章。

先决条件

要使用此功能

  • 您必须有一个您的 路由器 实例可以与之通信的 Redis 集群(或单个实例)。
  • 您必须拥有 GraphOS 企业计划,并在 将路由器连接到 GraphOS

它是如何工作的

每当路由器实例需要 查询计划 或 APQ 查询字符串以解决客户端 操作

  1. 路由器实例首先检查自己的 内存缓存 中是否有所需值,如果找到则使用该值。
  2. 如果没有找到,路由器实例随后检查分布式 Redis 缓存中是否有所需值,如果找到则使用。它还会将其找到的值复制到自己的内存缓存中。
  3. 如果没有找到,路由器实例 生成 所需的查询计划或请求全操作字符串以用于 APQ。
  4. 路由器实例将获取的值存储在分布式缓存 以及 自己的内存缓存中。

Redis URL 配置

分布式缓存配置必须包含一个或多个基于预期部署不同方案的 URL:

  • redis - 通过 TCP 连接到集中式服务器。
  • rediss - 通过TLS连接到中央服务器。
  • redis-cluster - 通过TCP连接到集群。
  • rediss-cluster - 通过TLS连接到集群。
  • redis-sentinel - 通过sentinel层连接到中央服务器。
  • rediss-sentinel - 通过sentinel层连接到TLS中央服务器。

URL必须具有以下格式

单个节点

redis|rediss :// [[username:]password@] host [:port][/database]

示例: redis://127.0.0.1:6379

集群

redis|rediss[-cluster] :// [[username:]password@] host [:port][?[node=host1:port1][&node=host2:port2][&node=hostN:portN]]

或者,如果配置了多个URL

[
"redis|rediss[-cluster] :// [[username:]password@] host [:port]",
"redis|rediss[-cluster] :// [[username:]password@] host1 [:port1]",
"redis|rediss[-cluster] :// [[username:]password@] host2 [:port2]"
]

哨兵

redis|rediss[-sentinel] :// [[username1:]password1@] host [:port][/database][?[node=host1:port1][&node=host2:port2][&node=hostN:portN]
[&sentinelServiceName=myservice][&sentinelUsername=username2][&sentinelPassword=password2]]

或者,如果配置了多个URL

[
"redis|rediss[-sentinel] :// [[username:]password@] host [:port][/database][?[&sentinelServiceName=myservice][&sentinelUsername=username2][&sentinelPassword=password2]]",
"redis|rediss[-sentinel] :// [[username1:]password1@] host [:port][/database][?[&sentinelServiceName=myservice][&sentinelUsername=username2][&sentinelPassword=password2]]"
]

路由器配置

💡 提示

在您的路由器YAML配置文件中,您应该通过环境变量和变量扩展指定您的Redis URL。这可以防止您的Redis URL被提交到版本控制中,如果它们包含用户名和/或密码等认证信息,则尤其危险。

分布式查询计划缓存

要启用查询计划的分布式缓存,请将以下内容添加到您的路由器YAML配置文件中:

router.yaml
supergraph:
query_planning:
cache:
redis:
urls: ["redis://..."]

urls的值是集群中所有Redis实例的URL列表。

所有查询计划缓存条目将使用分布式缓存中的plan.作为前缀。

分布式APQ缓存

要启用自动持久化查询(APQ)的分布式缓存,请将以下内容添加到您的路由器YAML配置文件中:

router.yaml
apq:
router:
cache:
redis:
urls: ["redis://..."]

urls的值是集群中所有Redis实例的URL列表。

所有APQ缓存条目将在分布式缓存中使用apq作为前缀,后跟一个空字节字符(在大多数编程语言中通过转义序列\0引用)。

常见的Redis配置

Redis的配置方式对于APQ缓存、查询计划缓存和实体缓存是一致的。

router.yaml
supergraph:
query_planning:
cache:
redis:
urls: ["redis://..."]
username: admin/123 # Optional, can be part of the urls directly, mainly useful if you have special character like '/' in your password that doesn't work in url. This field takes precedence over the username in the URL
password: admin # Optional, can be part of the urls directly, mainly useful if you have special character like '/' in your password that doesn't work in url. This field takes precedence over the password in the URL
timeout: 5ms # Optional, by default: 2ms
ttl: 24h # Optional
namespace: "prefix" # Optional
#tls:
required_to_start: false # Optional, defaults to false
reset_ttl: true # Optional, defaults to true

超时时间

连接Redis并发送命令都受到超时时间的限制,默认设置为2毫秒,可以被覆盖。

有效期限(TTL)

ttl选项定义了Redis条目的默认全局过期时间。对于APQ缓存,默认无过期时间,而对于查询计划缓存,默认过期时间设置为30天。

命名空间(Namespace)

当使用同一个Redis实例来处理多个用途时,namespace选项为所有由路由器定义的键定义了一个前缀。

TLS

对于Redis TLS连接,您可以在路由器的YAML配置文件中配置客户端证书或覆盖根证书管理机构,以配置tls。例如:

apq:
router:
cache:
redis:
urls: [ "rediss://redis.example.com:6379" ]
tls:
certificate_authorities: ${file./path/to/ca.crt}
client_authentication:
certificate_chain: ${file./path/to/certificate_chain.pem}
key: ${file./path/to/key.pem}

必须启动

当激活时,如果路由器无法连接到Redis,required_to_start选项将防止路由器启动。默认情况下,即使没有连接到Redis,路由器也会启动,这会导致只使用内存缓存来存储APQ和查询计划,并且实体缓存可以平滑地发送请求到

重置TTL

当此选项激活时,访问Redis中的缓存条目将重置其过期时间。

上一页
内存缓存
下一页
实体缓存
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc.,又名Apollo GraphQL。

隐私政策

公司