0

我即将开展一个大型项目,我需要计划任务(cron 作业)来运行一个脚本,该脚本将遍历我的整个实体数据库并每 10 分钟调用多个 API,例如 Facebook、Twitter 和 Foursquare . 我需要这个应用程序是可扩展的。

我已经可以预见到一些潜在的陷阱......

  1. 从 API 获取数据很慢..
  2. 在我的数据库中有数千条记录(不断增加),在 10 分钟内处理每条记录将花费太多时间。
  3. 一些共享服务器仅在 30 秒后停止运行脚本。
  4. 由于不断运行密集的脚本而导致的服务器问题。

我的问题是如何构建我的应用程序......?

  1. 我可以创建多个 cron 作业来处理我的数据库的一小部分(这必须是自动化的)吗?
  2. 这可能需要数千个 cron 工作。这是否可持续?
  3. 如何绕过某些服务器的 30 秒问题?
  4. 有没有更好的方法来解决这个问题?

谢谢!

4

2 回答 2

5

我即将开展一个大型项目,我需要计划任务(cron 作业)来运行一个脚本,该脚本将遍历我的整个实体数据库并每 10 分钟调用多个 API,例如 Facebook、Twitter 和 Foursquare . 我需要这个应用程序是可扩展的。

您最好的选择是将应用程序设计为使用分布式数据库,并将其部署在多个服务器上。

您可以将其设计为在两个“等级”服务器中工作,这与 map-reduce 方法不同:仅执行查询和“预消化”某些数据(“map”)的轻量级服务器,以及聚合数据的服务器(“减少”)。

一旦你这样做了,你就可以建立一个性能基线并计算出来,比如说,如果你每分钟可以生成 2000 个查询并且你可以处理尽可能多的响应,那么你需要每 20,000 个用户使用一个新服务器。在“每分钟生成 2000 个查询”中,您需要考虑:

  • 从数据库中检索数据
  • 进出控制服务器的流量带宽
  • 到 Facebook、Foursquare、Twitter 等的流量带宽。
  • 必须在本地登录(可能会提取日志摘要并将其上传到命令和控制)

这种架构的一个优点是您可以从小处着手——可以使用一台同时运行连接器、映射器、减速器、命令和控制以及持久性的机器来构建测试平台。当您成长时,您只需将不同的服务外包给不同的服务器。

在几个分布式计算平台上,这还允许您通过在地理或连接方面明智地分配 Mapper 来更快地运行查询,并通过使用例如亚马逊“区域”(亚马逊还有一个消息服务,您可能会发现在任务之间进行通信很有价值)

一个注意事项:我不确定 PHP 是否适合整个事情。我宁愿认为Python。

不过,在每个实例 20,000 个用户的流量水平上,我认为您最好与 Facebook、Foursquare 等公司的人一起讨论这个问题。至少您可能会收集一些策略,例如将连接器脚本作为独立任务运行,每个连接器根据该服务的用户 ID对其队列进行排序,以利用可能存在的少量数据局部性,并利用流水线来压缩更多带宽更少的服务器负载。最多,他们可能会向您指出批量 API 或不同的协议,或者以 1 万亿美元的价格购买您 :-)

于 2012-10-09T20:00:45.497 回答
2

请参阅http://php.net/manual/en/function.set-time-limit.php绕过 30 秒限制。

对于 PHP 中的调度作业,请查看:

  1. http://www.phpjobscheduler.co.uk/
  2. http://www.zend.com/en/products/server/zend-server-job-queue

我个人会考虑一个更强大的框架来处理作业调度(参见 Grails with Quartz),而不是重新发明轮子并编写自己的作业调度器。不要忘记您可能需要不时检查任务的状态,因此您将需要围绕任务的日志记录解决方案。

于 2012-10-09T19:54:00.190 回答