GraphOS 路由器的分布式缓存
配置 Redis 支持的查询计划和 APQ 缓存
此功能仅适用于 GraphOS 企业计划.
您可以通过免费注册来体验它。 企业试用.
如果您有多个 GraphOS 路由器 实例,这些实例可以共享一个基于 Redis 的缓存,用于它们的 查询计划 和 自动持久查询 (APQ)。这意味着,如果 任何 个 路由器 实例缓存了某个特定的值, 所有 实例都可以查找该值,从而显著提高响应速度。有关 查询计划 和 APQ 的更多详细信息,请参阅有关 内存缓存 的文章。
先决条件
要使用此功能
- 您必须有一个您的 路由器 实例可以与之通信的 Redis 集群(或单个实例)。
- 您必须拥有 GraphOS 企业计划,并在 将路由器连接到 GraphOS。
它是如何工作的
每当路由器实例需要 查询计划 或 APQ 查询字符串以解决客户端 操作:
- 路由器实例首先检查自己的 内存缓存 中是否有所需值,如果找到则使用该值。
- 如果没有找到,路由器实例随后检查分布式 Redis 缓存中是否有所需值,如果找到则使用。它还会将其找到的值复制到自己的内存缓存中。
- 如果没有找到,路由器实例 生成 所需的查询计划或请求全操作字符串以用于 APQ。
- 路由器实例将获取的值存储在分布式缓存 以及 自己的内存缓存中。
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配置文件中:
supergraph:query_planning:cache:redis:urls: ["redis://..."]
urls的值是集群中所有Redis实例的URL列表。
所有查询计划缓存条目将使用分布式缓存中的plan.作为前缀。
分布式APQ缓存
要启用自动持久化查询(APQ)的分布式缓存,请将以下内容添加到您的路由器YAML配置文件中:
apq:router:cache:redis:urls: ["redis://..."]
urls的值是集群中所有Redis实例的URL列表。
所有APQ缓存条目将在分布式缓存中使用apq
作为前缀,后跟一个空字节字符(在大多数编程语言中通过转义序列\0
引用)。
常见的Redis配置
Redis的配置方式对于APQ缓存、查询计划缓存和实体缓存是一致的。
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 URLpassword: 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 URLtimeout: 5ms # Optional, by default: 2msttl: 24h # Optionalnamespace: "prefix" # Optional#tls:required_to_start: false # Optional, defaults to falsereset_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中的缓存条目将重置其过期时间。