任务:
目标是尽快完成这4项任务,下面是一些可能的示例方法。
可能的示例接近
多步骤1:刮除所有页面并将html存储为.txt文件.在将html存储为文本之后,运行一个单独的模块来解析/清理/持久化数据。
多步骤2:刮除/分析/清除数据并存储在.txt文件中。运行一个单独的模块将数据插入数据库。
一步:一步一步地抓取/分析/清理/持久化数据。
Assumptions:
我还没有用node.js做足够的测试来建立一个最佳实践,但是对于优化这些任务的任何洞察力将是非常感谢的。
显然,还有一些未回答的问题(典型页面上有多少html,解析、请求/响应延迟有多少,用于解析data...etc的框架是什么),但是高级别的最佳实践/关键考虑因素将是有益的。谢谢。
发布于 2015-09-14 04:21:57
对于这样的问题,您只能忽略真正控制瓶颈位置的某些方面。因此,您从一个聪明但并不复杂的实现开始,并且花费相当多的时间来确定如何度量您的性能以及瓶颈所在。
然后,基于瓶颈所在的知识,您提出了一个建议的设计更改,实现了该更改,并查看了您的总体吞吐量有多大的不同。然后你再仪器,再测量,看看你的新瓶颈是哪里,提出了一个新的理论,如何克服这个瓶颈,实现,测量,理论,迭代等。
您真的不想过度设计第一个实现,也不想让第一个实现过于复杂,因为您认为真正的瓶颈在哪里很容易出错。
所以,我可能会从这样的设计开始:
创建一个node.js进程,它只会下载页面并将其写入磁盘。在任何地方都不要使用异步I/O,并使其可配置用于同时下载多少次页面。不要解析,只需将原始数据写入磁盘即可。您将希望找到一些非常快速的方式来存储哪个URL是哪个文件。这可能很简单,比如将信息添加到文本文件中,也可能是数据库写入,但想法是,您只希望它快速。
然后,创建另一个node.js进程,它重复地从磁盘抓取文件、解析文件、清理数据并将数据保存到您的SQL数据库。
单独运行第一个node.js进程并让它运行,直到它收集1000个web页面或收集15分钟(以第一位为准)来度量您最初能够达到的吞吐量。在运行时,请注意计算机上的CPU利用率和网络利用率。如果您已经大致了解了第一个node.js流程可能需要的内容,那么您就完成了第一个node.js进程。如果您希望它运行得更快,那么您需要找出瓶颈所在。如果您是CPU绑定的(不太可能完成这个I/O任务),那么您可以集群并运行这些node.js进程中的多个,为每个进程提供一组要获取的URL和一个单独的地方来编写所收集的数据。很有可能你是受I/O约束的。这可能是因为您没有完全填满现有的网络连接( node.js进程花费了太多时间等待I/O),或者您已经饱和了您的网络连接,这是现在的瓶颈。你得弄清楚这是哪一个。如果您添加了更多的同时获取web页面,并且性能没有增加甚至下降,那么您可能已经饱和了您的web连接。您还必须注意node.js中的文件I/O子系统是否饱和,该子系统使用限制线程池来实现异步I/O。
对于第二个node.js过程,您将遵循类似的过程。给它1000个网页,看看它处理它们的速度有多快。因为您确实有I/O来读取磁盘中的文件并写入数据库,所以您需要一次进行多个页面解析,以便在读取或写入一个页面时能够最大限度地利用CPU。您可以一次编写一个node.js进程来处理多个解析项目,也可以集群一个node.js进程。如果您的服务器中有多个CPU,那么您至少希望拥有与CPU相同的进程。与URL获取过程不同,用于解析的代码可能会被认真地优化以加快速度。但是,与其他性能问题一样,在您知道自己是CPU绑定并且它正在阻碍您之前,不要试图对代码进行过度优化。
然后,如果您的SQL数据库可以在另一个框上,或者至少使用另一个磁盘,那么这可能是一件好事,因为它将磁盘写入与其他磁盘写入分开。
在最初的几步之后,你去哪里将完全取决于你从最初的几步中学到了什么。您测量瓶颈所在的位置和设计测试瓶颈理论的快速实验的能力对于取得快速进展和避免将开发时间浪费在错误的优化上将非常重要。
FYI,一些家庭互联网连接ISP可能会触发一些警报器与您的数据请求的数量和速率。他们对这些信息的处理可能因ISP的不同而有很大差异。我认为大多数人最终都有能力限制您的连接,以保护共享您的管道的其他人的服务质量,但我不知道他们何时/是否会这样做。
这听起来是一个非常有趣的项目,试图优化和充分利用。对于一个中等到高级的软件类来说,这将是一个伟大的最终项目。
https://stackoverflow.com/questions/32556142
复制相似问题