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 非常长的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用本地 IIS 时等待 ttfb 的时间这么长?

接口速度慢问题查找(TTFB时间长)

express + express-graphql helloworld 返回 null

使用 apollo-express 限制或过滤 graphql 查询

当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?

如何在 GraphQL 中执行突变?