多租户GraphQL服务器

多租户GraphQL服务器,graphql,fastify,Graphql,Fastify,我们正在为我们的SaaS多租户服务探索GraphQL服务器,在单个多租户GraphQL服务器后面有多个微服务/服务。现在我们遇到了这样一种情况:客户可以通过我们首选的机制扩展他们的GQL模式 那么,有没有办法让我们仍然拥有一个通过多个端点为多个GQL模式提供服务的GQL服务器 或者,我们必须将每个客户端的GQL server+模式部署在完全独立的服务器中?同一个应用程序可以提供多个模式。GraphQL模式甚至可以在运行时构建。也许您甚至可以使用fastify GraphQL中间件。对于更复杂的事

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

那么,有没有办法让我们仍然拥有一个通过多个端点为多个GQL模式提供服务的GQL服务器


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

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

使用不同的模式创建多个端点很容易。您只需安装更多GraphQL中间件即可:

for(客户的常量客户){
应用程序寄存器(Graphqlfy,{
前缀:'/'+customer.name+'/graphql',
图ql:{
schema:customer.schema,
},
});
}
但这可能无法很好地扩展。您可能希望使用带有参数的路由,然后自己执行GraphQL函数。也许,您可以将此与:

从'graphql'导入{graphql};
fastfy.get('/:username/graphql',(请求、回复)=>{
const{queryString,variables,operationName}=getGraphQLParams(请求);
const schema=getUserSchema(request.username);
返回graphql(schema、queryString、rootVal、context、变量、operationName);
});

上面所有的代码都没有经过测试,我不知道fastify是否足以创建工作代码。但我希望这能显示出可能性。

谢谢你的建议,它给了我一些想法;让我试试看。因此,您上面提到的第一个选项是不可伸缩的,因为它将所有客户的模式托管到服务器内存中,而第二个选项在运行时绑定它们?但我想,我们需要将模式存储在内存或缓存中,就像第二个选项中的Redis一样,用于所有实际目的?在第一个解决方案中,所有模式都将静态绑定到一个路由。在第二个示例中,模式将在请求时创建,这可能会对性能造成巨大影响。问题是:您试图做的并不是GraphQL的标准用例。根据您的用例,您可以完全脱离graphql js执行,开发您自己的执行引擎。我访问了您的链接graphql helix,它看起来像是在运行时将查询与模式绑定在一起,如果模式在本地可用,它应该不会花费太多时间,这将是一个决定哪一个选择的基础上每个客户。下面是请求和模式之间的运行时绑定示例,假设模式已经准备好,这不应该是代价高昂的操作,对吗?const result=await processRequest({operationName,query,variables,request,schema,});如果您的模式已经在内存中可用,那么这应该不会更昂贵。在我看来,人们不应该仅仅从理论上对性能进行推理,而应该尝试一下。尝试了第一个选项,但没有效果,FastifyError:已经添加了装饰程序“graphql”!mercurius不支持在同一台服务器上部署多个模式;因为在所有装饰器中没有可选的路径/前缀。我会尝试第二种选择,有没有第二种选择与Fastify的例子?