我目前有一个PHP脚本,它从各种来源收集类似的数据,每120秒对每个数据源进行抓取和解析。目前我有20个数据源,但我希望在未来几周内再整合100个数据源。
目前,每个数据源都在其自己的线程中被抓取,有一个主要的PHP脚本将执行其他脚本来执行抓取工作。这种方法允许同时擦除所有源,但它也会给服务器带来压力,并成为数据库(MySQL)的瓶颈。
我正在寻找扩展当前应用程序的方法,我可以使用AWS执行此类操作吗?也许这些抓取脚本中的每一个都可以在他们自己的小型服务器实例中运行,这些实例中的每一个都将由“主”实例自动创建,然后在脚本完成后死亡。我对AWS没有任何经验,所以我不完全确定这是否可行,或者这可能只是一个坏主意。
这里的主要问题是:如何扩展当前的抓取脚本以允许许多新的数据源?即使我需要购买额外服务,我也对任何解决方案感兴趣。
答案 0 :(得分:2)
您正在描述一种工作者/队列模式,主服务器执行入队和执行工作,这当然会对您的服务器造成巨大压力。
首先,您的员工需要异步:您不应该等待可能会或可能不会回来的事情。你真的应该看一下ZeroMQ,我可以补充说,它包含了这个星球上的一些最好的文档。如果你愿意学习,看看它是如何工作的,并按照一些教程,那里有很多。让您的队列接受新的工作并将其他人(即其他盒子)分派到主服务器上。
您可以创建某种实例控制器来处理AWS实例。你真的只需要坐下来思考你的逻辑(我什么时候想要这么多盒子,我什么时候想关闭它们)。一旦你了解它,API就非常简单易用。 Here's some code我写了一段时间来回收亚马逊的SDK for PHP。我不确定它是否100%使用最新版本(我在一年前使用过它),但概念就在那里 - 你有简单的方法,如startBox()
或{{1你从队列中调用,让你的盒子一旦启动就自动开始做它。
您可以使用来自亚马逊pricing here的stopBox()
个实例,其免费等级 info here达到一定限额。
让它正常工作,在主服务器上有一个循环,决定在某些情况下(例如,数据库表中的作业数量),您需要在任何时间工作多少个盒子,并且您将拥有理论上无限扩展。以下是我为代码所做的工作:
记录所有内容。记录每个箱子,每个箱子都会下降。计算代码中的成本并存储它们,可能存储在数据库中,或记录它们,这样您就可以确切知道自己花了多少钱 - 不想让事情发生手。
确保打开您的数据库端口,以便您的实例可以与您的数据库通信,说明何时完成工作或您需要在您的主人之间传递任何其他内容"盒子和你的"奴隶"框。
另外,如果您要为网络服务器付费,那么您需要使用aws为<小时付费,因此您需要获得启动该框的时间,以及何时是时候关闭了,只有在55分钟左右的时间才关闭它 - 你也可以为你付出的代价获得额外的分钟。
我无法想到其他任何事情。做你的研究,找出构建排队系统的最佳方法,并在考虑可扩展性的情况下构建它(它可以对你控制的数字作出反应和改变)。
答案 1 :(得分:1)
在多个实例(比如说每台服务器5个)中分割您的内容并让它们与Amazon RDS等中央数据库通信。
如果你每120秒做一次这样做,你就不需要杀死实例。