实现graphqlapi的高性能库
graphlayer的Python项目详细描述
为什么是Graphlayer?
是什么导致graphqlapi运行缓慢? 在graphql的大多数实现中, 对响应中的每个节点运行解析函数。 这可能导致性能不佳,主要有两个原因。 第一个是n+1问题。 第二个是为响应中的每个节点调用潜在的异步解析函数的开销。 尽管每次调用的开销很小, 对于大型数据集,这些开销的总和可能是响应的绝大多数时间。
graphlayer建议可以根据请求的形状而不是响应来调用resolve函数。 这样就避免了n+1问题而不引入额外的复杂性, 例如以dataloader和类似库的方式对请求进行批处理, 并允许以更自然地映射到数据存储(如SQL数据库)的样式编写解析函数。 其次,尽管调用resolve函数仍然有开销, 此开销乘以请求中的节点数而不是响应: 对于大型数据集,这是相当大的节省。
作为一个具体的例子,考虑查询:
query { books { title author { name } } }
天真的graphql实现会发出一个sql查询来获取所有书籍的列表, 然后查询每本书的作者。 使用dataloader,获取每本书作者的n个查询将组合成一个查询。 使用GraphLayer,只需一个查询即可获得作者,而无需任何批处理。