Express GraphQL TTFB 非常长
Posted
技术标签:
【中文标题】Express GraphQL TTFB 非常长【英文标题】:Express GraphQL TTFB is extremely long 【发布时间】:2019-12-01 15:53:48 【问题描述】:我有一个非常简单的设置。 Express-GraphQL API 与 MongoDB 数据库。 MongoDB 响应通常非常快,但是当我想从 GrapQL API 返回时,TTFB 花费的时间太长,尤其是对于多用户查询。
例如,当我请求用户时,TTFB 为 25.65 毫秒,内容下载约为 0.6 毫秒。但是当我请求所有具有相同字段的用户时,TTFB 是 4.32 秒,内容下载大约是 1.28 秒。
内容下载没问题,但我觉得 TTFB 比它应该的要长。您可以使用下面的 RootQuery 检查我的部分架构。
const RootQuery = new GraphQLObjectType(
name: 'RootQueryType',
fields:
user:
type: UserType,
args: mail: type: GraphQLString,
resolve(parent, args)
return User.findOne(mail: args.mail);
,
users:
type: new GraphQLList(UserType),
resolve(parent,args)
return User.find().collation( locale: "en" ).sort(name: 1, surname: 1);
);
降低 TTFB 的最佳方法是什么?
【问题讨论】:
“花费太长时间”与什么相比?只是反刍数据库查询结果的 REST 端点? 【参考方案1】:从您的代码 sn-p 我看不到 UserType
是如何定义的,我也不知道您正在执行的 graphql 查询是如何准确的。话虽如此,高 TTFB 数字通常表明服务器正在执行繁重的任务,因此,您很可能在查询中请求来自 UserType
的字段,该查询具有关联的昂贵解析器(可能执行另一个 MongoDB 查询),这将是执行的次数与用户存在的次数一样多。这被称为 N+1 问题,您可以使用 dataloder 解决它,这将允许您在一个查询中批量处理那些昂贵的 MongoDB 查询。
如果您能提供有关UserType
和您正在执行的查询的更多信息,那将会很有帮助。
参考资料: - https://itnext.io/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a - https://github.com/graphql/dataloader
【讨论】:
您可以在下面找到我的 UserType 和查询。除了它之外的所有字段都有一个类型 GraphQLString ``` const UserType = new GraphQLObjectType( name: 'User', fields: () => ( id:, username:, name:, surname:, displayName:, department: , 手机号码:, 邮件: 职务:, 部门: , 公司: ) ); ``` 查询 ``` 查询 用户 姓名 姓 部门 手机 邮箱 ```以上是关于Express GraphQL TTFB 非常长的主要内容,如果未能解决你的问题,请参考以下文章
express + express-graphql helloworld 返回 null
使用 apollo-express 限制或过滤 graphql 查询