Express / NodeJS + Mongoose App服务器响应缓慢

时间:2018-08-11 17:11:20

标签: node.js mongodb express mongoose keystonejs

问题

我有一个Express(Node.JS)+ MongoDB应用,服务器响应加载时间平均为4-7秒(缓慢)。

我了解根据google pagespeed tools,平均服务器响应时间不到200毫秒。

此应用正在异步地从mongoDB中获取数据,但是到数据库的往返时间非常慢,每次调用平均大约需要500ms-1s。这些调用是简单的findAll调用,用于检索少于<100条记录的数据。

上下文

  • 猫鼬版本:4.13.14
  • 数据库服务器的MongoDB版本为3.4.16
  • 数据库服务器托管在AWS /俄勒冈州(us-west-1)的MongoDB Atlas M10上
  • Web服务器由SFO1(us-west-1)中的now.sh托管
  • 按照MongoDB Atlas的性能顾问的建议执行推荐的索引
  • 在几毫秒内查询数据就可以在本地环境(本地服务器+本地数据库)中很好地获取数据
  • 受影响的页面的猫鼬日志可在此gist
  • 中找到

Mongo Server配置

  • Mongo Atlas M10
  • 2GB Ram
  • 10 GB存储空间
  • 100 IOPS
  • 已加密
  • 自动扩展存储

尝试的解决方案:

我已经检查了数据库指标,它们看起来不错。也没有慢查询。这些是简单的findAll查询。蒙哥地图集的性能顾问认为没有异常。

生产应用程序和数据库都位于同一区域。

我已经尝试通过运行.lean()优化查询(猫鼬)的应用层

问题:

我还应该在哪里改善数据库延迟?一个简单的查询如何花这么长时间?否则,为什么预期的时间约为200毫秒,我的服务器响应时间最多需要4s?

4 个答案:

答案 0 :(得分:2)

嘿,您可以尝试在同一区域中托管服务器和数据库。我认为网络在这种情况下造成了开销。如果服务器和数据库位于同一区域,则它们位于同一网络上,这将大大减少延迟。在aws上有一个图表 enter image description here

答案 1 :(得分:1)

使用相同的开发堆栈(mongodb,nodejs),我的nodejs代码曾经遇到过同样的问题,我陷入了api迟来响应的麻烦,并且花了很多时间之后才发现服务器是真正的罪魁祸首从heroku更改为amazon aws EC2实例,事情开始快速而且出奇地快,所以大概  您的网络服务器是罪魁祸首


要确保 mongodb 不是罪魁祸首,请编写一个api端点,您可以在其中返回一些json响应而无需对数据库进行任何查询。

答案 2 :(得分:0)

我用我的硕士学位开发的应用程序给您增加了一些像您一样的问题。我添加了一个在线运行的node.js api并将其呈现在教室中。我意识到每次我想在api中进行调用时,响应都会占用时间。我意识到问题之一是防火墙造成的学校网络。我放置服务器heroku.com的地方也给了一些延迟。我所做的是使用Redis(https://redis.io/)来提高性能,而且heroku也因为请求是http而不是https而给我带来了一些问题。

进行测试,以在本地主机上运行应用程序和数据,并查看性能。如果您没有任何问题,请尝试检查是否没有使您的请求混乱,例如托管节点服务器的位置。

让我知道这是否有帮助,或者您仍然遇到问题,以便我可以更好地帮助您。

答案 3 :(得分:-2)

您还可以尝试使用Azure服务。注册时,只需少量服务即可免费获得1年。 Azure使您可以在各个区域中部署多个实例,从而可以最大程度地减少延迟。如果预算合适,则可以使用针对Node.js + mongoDB应用程序进行了高度优化和自动管理的Web应用程序。