使用 nestjs 和 graphql 调查响应序列化的性能
Investigate performance of response serialization with nestjs and graphql
我正在调查 nodejs 后端中序列化的性能问题。我想要一些关于如何调查服务中的应用程序逻辑已 return 编辑其响应后发生的事情的建议。
目前有一个使用 typeorm 执行的错误查询 return 大约 12000 行。此查询的速度不是问题,但是当结果从服务中 return 时,api 实际 return 响应大约需要 100 秒。该应用程序使用带有 graphql 的 nestjs 作为 api.
我猜想在 apollo 服务器或 nestjs 中进行了一些繁重的序列化。我该如何进一步调查?数据库查询的大小是这里唯一的问题,还是其他问题?
这里真正的问题是,这会阻塞 nodejs 的事件循环大约 100 秒,这会冻结整个后端。
您确定正在执行的实际查询仅返回 12000 行,还是 12000 行只是最终从 API 返回的数字?
您很可能会向 NestJS 后端返回更多行,然后需要将这些行规范化为您从 API 收到的实际结果集。如果您正在进行大量联接并且与 Object-relational impedance mismatch.
的概念相关,那么 运行 就是一个容易解决的问题
过去我有一个类似的问题,我从 API 得到的结果集只返回了几千行,但超过 40 万行被发送回 TypeORM,然后必须适当地展平它们并导致您 运行 遇到的确切性能问题。
我强烈建议您检查生成的 SQL 是否有问题的查询,然后 运行 在数据库上手动检查它以查看您实际返回了多少行。
通过控制台日志调试发现不是typeorm的问题。大多数时间都没有花在 typeorm 上,甚至没有花在服务或解析器上。大部分时间花在了解析器 return 之后的某处,这让我想到了 apollo 服务器本身。
当尝试从同一服务 return 但使用常规休息控制器时,只花了大约一秒钟。我最终做的是对解析器中的响应数据使用 JSON.stringify,然后将 graphql 响应作为字符串键入。对于这种特殊情况,它很好,因为数据无论如何都与系统的其余部分完全隔离。
问题可能出在验证 returned 数据输入的 apollo 服务器部分,但这主要是猜测。
我正在调查 nodejs 后端中序列化的性能问题。我想要一些关于如何调查服务中的应用程序逻辑已 return 编辑其响应后发生的事情的建议。
目前有一个使用 typeorm 执行的错误查询 return 大约 12000 行。此查询的速度不是问题,但是当结果从服务中 return 时,api 实际 return 响应大约需要 100 秒。该应用程序使用带有 graphql 的 nestjs 作为 api.
我猜想在 apollo 服务器或 nestjs 中进行了一些繁重的序列化。我该如何进一步调查?数据库查询的大小是这里唯一的问题,还是其他问题?
这里真正的问题是,这会阻塞 nodejs 的事件循环大约 100 秒,这会冻结整个后端。
您确定正在执行的实际查询仅返回 12000 行,还是 12000 行只是最终从 API 返回的数字?
您很可能会向 NestJS 后端返回更多行,然后需要将这些行规范化为您从 API 收到的实际结果集。如果您正在进行大量联接并且与 Object-relational impedance mismatch.
的概念相关,那么 运行 就是一个容易解决的问题过去我有一个类似的问题,我从 API 得到的结果集只返回了几千行,但超过 40 万行被发送回 TypeORM,然后必须适当地展平它们并导致您 运行 遇到的确切性能问题。
我强烈建议您检查生成的 SQL 是否有问题的查询,然后 运行 在数据库上手动检查它以查看您实际返回了多少行。
通过控制台日志调试发现不是typeorm的问题。大多数时间都没有花在 typeorm 上,甚至没有花在服务或解析器上。大部分时间花在了解析器 return 之后的某处,这让我想到了 apollo 服务器本身。
当尝试从同一服务 return 但使用常规休息控制器时,只花了大约一秒钟。我最终做的是对解析器中的响应数据使用 JSON.stringify,然后将 graphql 响应作为字符串键入。对于这种特殊情况,它很好,因为数据无论如何都与系统的其余部分完全隔离。
问题可能出在验证 returned 数据输入的 apollo 服务器部分,但这主要是猜测。