新增GraphQL查询缓存:两种实现方案的差异、选型及插件疑问
Apollo GraphQL响应缓存:两种实现的差异、选型与Fargate适配
一、两种实现的核心差异
- @cacheControl指令:属于字段/类型级的缓存控制,能为单个字段、类型设置独立的缓存时效(
maxAge),还可通过scope: PUBLIC/PRIVATE区分公共/私有缓存。比如给latestPost字段设置@cacheControl(maxAge:10),意味着该字段的返回值会被缓存10秒,即便同一查询里的其他字段有不同缓存策略也互不影响。 - apollo-server-plugin-response-cache插件:属于完整响应级的缓存,会把整个查询的返回结果作为一个整体进行缓存。它依赖
@cacheControl的配置来决定是否缓存,或者通过自定义逻辑控制缓存范围。
二、选型依据
- 选
@cacheControl:当你需要精细控制不同字段的缓存策略时(比如部分字段缓存1分钟,另一部分缓存5分钟),或者需要区分公共/私有缓存场景(比如用户个人数据设为PRIVATE,仅当前用户可见)。 - 选响应缓存插件:当你的查询响应可以作为整体缓存,不需要字段级的差异化控制时,插件能简化缓存逻辑,直接复用整个响应的缓存结果。
三、Fargate环境适配注意事项
Fargate是无状态实例,本地内存缓存无法在实例间共享,所以不管用哪种缓存方式,必须配置分布式缓存后端(比如Redis)。在Apollo Server配置中指定缓存存储为分布式缓存,确保所有Fargate实例共用同一缓存池,避免缓存不一致的问题。
四、响应缓存插件的缓存范围控制
插件默认不会缓存所有查询,需要通过以下方式指定需缓存的特定查询:
- 结合@cacheControl指令:在Schema的目标查询字段上添加
@cacheControl(maxAge: N),插件会自动识别并缓存该查询的完整响应。示例:
type Query { latestPost: Post @cacheControl(maxAge: 60) # 缓存该查询响应60秒 userProfile: User @cacheControl(maxAge: 300, scope: PRIVATE) # 私有缓存,仅当前用户可见 }
- 自定义缓存判断逻辑:在插件配置中通过
shouldCacheRequest函数自定义规则,比如根据查询名称、请求头、用户身份等判断是否缓存。示例:
const responseCachePlugin = ApolloServerPluginResponseCache({ shouldCacheRequest(requestContext) { // 仅缓存操作名为LatestPost的查询 return requestContext.request.operationName === 'LatestPost'; }, });
内容的提问来源于stack exchange,提问作者tmc
相关产品推荐
相关产品推荐

