【问题标题】:Multitenant GraphQL Server多租户 GraphQL 服务器
【发布时间】:2021-06-08 22:27:17
【问题描述】:

我们正在为我们的 SaaS 多租户服务探索 GraphQL 服务器,我们在单个多租户 GraphQL 服务器后面有多个微服务/服务。现在我们有一种情况,客户可以通过我们首选的机制扩展他们的 GQL 模式;

那么有什么方法可以让我们仍然拥有一个 GQL 服务器,通过多个端点为多个 GQL 模式提供服务?

或者我们必须将每个客户端的 GQL 服务器 + 架构部署在完全独立的服务器中?

【问题讨论】:

    标签: graphql fastify


    【解决方案1】:

    您可以让多个模式由同一个应用程序提供服务。 GraphQL Schema 甚至可以在运行时构建。也许你甚至可以使用 fastify GraphQL 中间件。对于更复杂的事情,您可能必须构建自己的中间件,但这完全有可能。

    创建具有不同架构的多个端点很容易。你可以简单地挂载更多的 GraphQL 中间件:

    for (const customer of customers) {
      app.register(graphqlFastify, { 
        prefix: '/' + customer.name + '/graphql', 
        graphql: {
          schema: customer.schema,
        },
      });
    }
    

    但这可能不能很好地扩展。您可能希望使用带参数的路由,然后自己执行 GraphQL 函数。也许,你可以把它和graphql-helix结合起来:

    import { graphql } from 'graphql';
    
    fastify.get('/:username/graphql', (request, reply) => {
      const { queryString, variables, operationName } = getGraphQLParams(request);
      const schema = getUserSchema(request.username);
    
      return graphql(schema, queryString, rootVal, context, variables, operationName);
    });
    

    上面的所有代码都没有经过测试,我对 fastify 的了解不足以创建工作代码。但我希望这表明了可能性。

    【讨论】:

    • 感谢您的建议,它给了我一些想法;让我试试。因此,您上面提到的第一个选项不可扩展,因为它将所有客户的模式托管到服务器内存中,而第二个选项在运行时绑定它们?但我想,我们需要将模式存储在内存中或像 Redis 这样的缓存中以用于第二个选项以及所有实际目的?
    • 在第一个解决方案中,所有模式都将静态绑定到路由。在第二个示例中,模式将在请求时创建,这可能会对性能造成巨大影响。问题是:您尝试做的并不是 GraphQL 的真正标准用例。根据您的用例,您可以完全摆脱 graphql-js 执行并开发自己的执行引擎。
    • 我访问了你的链接graphql-helix,看起来它在运行时将查询与模式绑定,如果模式在本地可用,它应该不会花费太多时间,这只是一个决定根据每个客户选择哪一个。这是请求和模式之间运行时绑定的示例,假设模式已经准备好,这不应该是那么昂贵的操作吧? const result = await processRequest({ operationName, query, variables, request, schema, });
    • 如果您的架构已经在内存中可用,这应该不会更昂贵。 IMO,人们不应该仅仅从理论上推理性能,而应该尝试一下。
    • 试过第一个选项,不行,FastifyError: 装饰器'graphql'已经被添加了! mercurius 不支持在同一台服务器上部署多个模式;因为在所有装饰器中都没有可选的路径/前缀。我会尝试第二个选项,Fastify 有第二个选项的例子吗?
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2018-07-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多