1

我正在使用 Apollo Federation,我有一个关于缓存的问题。

现在我有一个这样的查询,我想在哪里找到帖子的作者:

query GetPost {
  post(id: "123") {
    id
    author {
      id
      name
    }
  }
}

Post 是一项服务,Author 是另一项服务。“id”包含在 post 模型中,因为在使用客户端 apollo 库时这是预期的。

当该查询运行时,内部会发出两个请求:每个服务一个。

现在,生成的对 post 服务的请求(由网关)非常简单,如下所示:

query {
  post(id: "123") {
    id
  }
}

我每分钟都会得到数千个,并想缓存它们。显然,通过 ID 获取帖子的 ID 永远不会改变,所以每次这样的请求都是浪费。

有没有办法在网关端缓存这个请求?这样它就不会向邮政服务发出请求。

4

1 回答 1

0

根据Apollo 文档,您可以通过扩展 RemoteGraphQLDataSource 类来自定义用于从实现服务中检索数据的提取器。自定义提取器可以是任何实现提取规范的函数,在此示例中,我使用node-fetch-cache将查询持久化到网关上的磁盘。

const { ApolloGateway, RemoteGraphQLDataSource } = require("@apollo/gateway");

class CachingDataSource extends RemoteGraphQLDataSource {
    fetcher = require('node-fetch-cache')('./locaCache');
}

const gateway = new ApolloGateway({
    serviceList: [
        { name: "post", url: "http://posts.service" },
        { name: "author", url: "http://author.service" },
    ],
    buildService({ name, url }) {
        if (url === "http://posts.service") {
            return new CachingDataSource({ url, name });
        } else {
            return new RemoteGraphQLDataSource({
                url,
                name
            });
        }
    },
});
于 2021-04-03T02:30:36.937 回答