我并不是一名(非常优秀的)后端开发人员,因此了解流程和内存与我的薪资等级有关。
我目前正在使用 MEAN 堆栈构建一个应用程序。我在本地主机上运行了一个单独的 Express 服务器,它是一个网络抓取工具。
我的流程是,我的 Angular 应用收集用户数据 -> 将其发送到 MEAN express 后端 -> Express 路由POST
向我的网络抓取工具发送请求,然后抓取工具执行其工作(用于requestjs
获取页面、用于cheerio
加载数据并对 HTML 进行一些解析)。
抓取过程可能需要一点时间(最多 5 分钟),因此我想向浏览器发送更新消息。目前我这样做:
- 每 5 秒钟,浏览器就会
GET
向我的 MEAN API 发送一个请求,要求它从我的网络爬虫请求更新消息 - MEAN API
GET
向我的网络爬虫服务器发送请求 - 网络抓取服务器检查进度(只是函数中使用的局部变量)。
这有效,但在抓取工具运行时,更新响应非常慢。请参阅下面的日志:
看来我的网页抓取服务器在仅 1 个用户请求(抓取约 1500 个网站)的情况下就已不堪重负。我只能想象,当 10、20、1000 个用户使用该服务时,整个系统就会崩溃。
我的流程完全错了吗?我觉得自己有点力不从心,但我想学习和调试我的网络抓取工具滞后的地方,看看我能做些什么来优化它!
编辑:根据标题 - 这是我没有为我的 Node/Express 服务器分配足够内存的问题吗?
答案1
这是一个较旧的帖子,但我认为我可以通过这个帖子帮助某些人。
首先,屏幕截图仅显示了抓取服务器的响应,从我尝试回答的角度来看,这不会有太大帮助,但是,我以前遇到过这种情况。
我认为您的 node/express scraper 和 node/express/angular 应用程序位于同一个硬件/共享服务器(硬件,而非服务器实例)上。
如果是这种情况,您可以运行 32 位 python 抓取工具,并且如果您的抓取工具以网络允许的最快速度循环请求和响应,则可以限制中等设置。
您可能需要#1 - 在不同的基本 URL 上记录您的抓取工具的成功率和失败率,以确保您没有被列入黑名单。#2 - 等待抓取工具的每次循环,即使只有几毫秒。#3 - 这是最重要的,请将您的抓取工具从角度硬件上取下来。
我们设置了 10 个虚拟桌面和 10 个物理桌面,它们都运行着抓取工具 - 它们所做的就是这些。问题是 http 请求和响应以及网站的抓取(尤其是异步执行时)会给该机器的硬件和连接带来负担。我通常只在服务器上运行一个 Web 应用程序,数据库位于不同的服务器上,CDN 是独立的,文档/图像存储甚至与此不同。我知道这听起来有点复杂或令人生畏,但关注点分离使得调试瓶颈变得更容易。
希望这有助于前进。