在NodeJS和MongoDB之间优化API的故事

在Medvine Limited。 我们尝试通过API与第三可视化平台连接来显示数据。 我的任务是确保数据交付以正确可视化平台。 但是我的任务完成后。 发生新的挑战! API太慢了。

API延迟

从上图。 右上角您会注意到时钟图标。 这意味着可视化平台无法及时从API获取数据。 我测试发送请求到该API之后。 需要5.2秒。 没问题,并且可以毫无问题地获取数据,除非我们有多个可视化的API。 并且所有API都一样慢。 当一次有多个API请求时,会导致CPU超载而服务器无响应。 这是灾难。

使用.lean()优化MongoDB查询

通常我使用猫鼬用out.lean()查询。 性能直到从此查询获得结果为止需要5.2秒。

然后,在.then()之前添加.lean()。 持续时间从5.2秒提高至2.3秒

通过.lean()优化猫鼬查询之前与之后

.lean()的作用是启用此选项时。 它将来自查询的响应作为Javascript普通对象。 不是猫鼬文档,其中包含诸如getters / setters之类的魔术功能。 那就是为什么性能提高了近50%。

转入生产阶段,MongoDB Atlas遇到了问题。

经过在本地主机测试。 我将此与生产服务器集成在一起。 那时我们使用MongoDB Atlas免费层存储数据。 当我测试对服务器的启动请求时。 直到服务器响应需要53秒!!!

集成到生产服务器之前与之后

因此,我们决定将数据从MongoDB Atlas移至我们的本地mongoDB。 使用docker进行设置非常简单。 更改API端点后。 它不再慢了。 来自服务器的时间响应数据在2.3到1.8秒之间。

服务器的2.3–1.8秒响应仍然很慢。 我们可以使其更快吗?

在与团队讨论以寻求其他解决方案之后。 我们的CTO看到了我的编码并将其显示在大屏幕上。 我的代码非常简单。 我从查询中获取响应数据。 兑现承诺。 然后通过获取查询响应的数据来获取结果并进行逻辑处理。 一遍又一遍地循环直到获得我想要的格式数据。 计算它并以Json的形式返回结果。

优化前的我的代码

然后,他提出了如何通过准备我需要使用的每个数据并将其存储到对象中来优化此代码的想法。 当我需要使用它时。 我只调用包含所需值的对象。 它不需要使用多重循环来获取数据。 这是示例代码

优化后的代码

最终的解决方案是根据我使用的查询参数在mongoDB中创建索引。 一起完成这两个路径后,服务器的响应时间最终减少到0.2秒。

摘要API响应时间从一开始就更快

通过优化过程,我学到了什么。

  • 如果不需要Mongo响应的额外功能(例如getter / setter),请使用.lean()
  • 文件设计很重要。 如果设计不够好,则必须多次加入。 并且会降低性能。
  • 不要忘记在查询中使用mongoDB中使用的索引关键字。 有索引更快。
  • 编码部分。 代码的质量和性能将决定您拥有多少知识。 不要停下来为新事物倾斜和开放思想。

下篇再见。