【问题标题】:Meteor app loses connection to MongoDB due to large(ish?) trafficMeteor 应用程序由于大量(ish?)流量而失去与 MongoDB 的连接
【发布时间】:2018-06-07 17:47:51
【问题描述】:

我最近开始学习meteor,我正在开发一个类似于公交车时刻表应用程序的应用程序;我有几个屏幕(大约 30 个带有浏览器的设备),我将它们全部连接到一个在 cmd 上运行我的应用程序的本地主机(该应用程序使用带有本地 MongoDB 的 windows 10 离线,没有在线服务器)。每组屏幕都显示了从 MongoDB 集合中提取的相关巴士及其时间表。

该应用程序过去运行良好,但当我添加 10 个屏幕时,客户端似乎在几分钟后与服务器断开连接;我有在屏幕上显示服务器时间的流星调用,这一次在服务器掉线时显示为 undefined,我无法通过 MeteorToys 看到我的任何收藏文档,我看到了这些收藏,但是文档为 0。另外,我无法登录到我的管理页面(这是我制作的基本用户界面,简单的 MongoDB 帐户集合)

值得一提的是,整个应用并没有崩溃;我仍然可以导航到我的页面,因为我的布局、HTML 和 CSS 仍然显示,只是我的服务器相关功能停止了。

我意识到这是一个流量问题,因为当我断开所有屏幕并运行应用程序时,它运行良好。另外,当我一一重新连接时,它似乎也可以正常工作。

我在客户端的控制台上没有收到任何错误,在服务器 CMD 上,应用程序没有崩溃,它一直在运行,没有任何错误。

另外,我每秒都向控制台添加 Meteor.status() ping,我得到了这个

{status: "connected", connected: true, retryCount: 0} 

从技术上讲,这意味着服务器没有离线?

我很迷茫,我该怎么做才能纠正这个问题?

更新:

我注意到我有几个每秒运行的 ServerSessions 从服务器获取我的时间。我将它们更改为正常会话,我现在面临一个不同的问题;我认为某处存在内存泄漏;当它冻结时,我注意到我的 RAM 使用量飙升至 8GB(我将我的 max_old_space 设置为 8912,所以这应该不是问题)正常使用量大约是在运行时大约 600-900MB

然后我得到FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory => Exited with code: 3

在浏览器上使用503 (Service Unavailable) 无法访问服务器 然后服务器重新启动,它做同样的事情。帮助:(

【问题讨论】:

  • 正如维克多的回答中所建议的,你如何运行你的服务器?您是否为生产正确构建了它?
  • 我暂时只通过“meteor”或者“npm start”通过CMD运行
  • 然后你在开发模式下运行你的流星应用程序,这确实比必要的更多计算并且可能会增加你的RAM使用超时。您应该 build 您的应用用于生产用途。
  • 我正在开发这个作为离线解决方案;有没有办法在本地部署它?感谢您的宝贵时间,谢谢!
  • "deploy" 并不一定意味着您必须在公共互联网上发布它。将其视为将您的 Meteor 项目转换为经典节点应用程序。

标签: javascript html css mongodb meteor


【解决方案1】:

我在应用加载大量数据并进行计算时遇到了相同的行为。当 nodejs 服务器 CPU 负载时​​,应用程序失去与其节点后端的连接,当数据库服务器 CPU 负载时​​,应用程序失去与数据库的连接。

以下是一些建议:

  • 如果您还没有阅读,请从这篇文章开始:https://bulletproofmeteor.com/ 它是几年前写的,但里面仍然有很多好的做法
  • 在您的机器上监控您的应用程序,尝试了解瓶颈是什么:数据传输、磁盘读取、cpu 密集型任务?
  • 查看您的发布/订阅模式。您可能会向客户端发送太多数据,也许您可​​以限制所需的数据量?
  • 如果您的设置很关键,请不要使用meteor 命令在单个 Windows 机器上运行它! : 从使用 meteor build https://guide.meteor.com/build-tool.html 构建一个合适的 nodejs 应用程序开始
  • 使用 nginx 处理传入的连接,它健壮且可扩展
  • 为数据库使用单独的主机,也许是 3 台机器的 mongo 副本集(这可能会通过提供更多数据库可用性来解决您的问题,但我尚未测试)

关于构建的编辑: 构建应用后,您将获得一个文件夹。以下是在生产模式下启动应用程序的步骤:

cd into your meteor app folder
meteor build targetFolder --directory
cd targetFolder/bundle
(cd programs/server && npm install)
meteor node targetFolder/main.js #I use meteor node to ensure version compatibility

【讨论】:

  • 非常感谢您提供这些!很有用的笔记。我肯定你是对的;我确实有几个计算(在服务器上以一秒的增量运行)。我实际上做了一些修改,原来的问题已经消失了,但现在我认为我正面临内存泄漏;我注意到我的 RAM 使用率上升到近 8GB 并放弃了(我的 NPM 启动设置为 8GB,这已经足够了)然后它在服务器控制台上以 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory => Exited with code: 3 超时,在浏览器上以 503 超时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2019-10-22
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多