我可以为我的应用程序使用cron作业(需要具有极高的可扩展性)吗?

时间:2012-10-09 19:26:14

标签: php linux api cron cron-task

我即将开展一个大项目,在那里我需要预定的任务(cron作业)来运行一个脚本,该脚本将遍历我的整个实体数据库,并调用多个API,如Facebook,Twitter&每10分钟一次Foursquare。我需要这个应用程序可扩展。

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

  1. 从API中获取数据很慢..
  2. 在我的数据库中有数千条记录(不断增加),在10分钟内处理每条记录需要花费太多时间。
  3. 某些共享服务器仅在30秒后停止运行脚本。
  4. 由于持续密集的脚本运行导致服务器问题。
  5. 我的问题是如何构建我的应用程序......?

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

2 个答案:

答案 0 :(得分:5)

  

我即将开展一个大型项目,我需要安排   任务(cron作业)运行一个循环遍历我的整个脚本   实体数据库并调用多个API,例如   Facebook,Twitter&每10分钟一次Foursquare。我需要这个   应用程序可扩展。

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

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

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

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

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

在多个分布式计算平台上,这还允许您通过在地理位置或连接方面明智地分配Mappers来更快地运行查询,并通过玩游戏来减少各种平台之间的流量成本。亚马逊“区域”(亚马逊也有一个消息服务,您可能会发现这些消息对于任务之间的通信很有价值)

一个注意事项:我不确定PHP是否适合这一切。我宁愿想Python。

虽然在每个实例的20,000个用户流量级别上,我认为你最好还是与Facebook,Foursquare等人一起讨论这个问题。您至少可以收集一些策略,例如将连接器脚本作为独立任务运行,每个连接器根据该服务的用户ID 对其队列进行排序,以利用可能存在的小数据位置,并利用流水线操作以减少服务器负载,从而挤出更多带宽。最多,他们可能会指向批量API或不同协议,或者以1万亿美元购买: - )

答案 1 :(得分: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
  3. 我个人会看一个更强大的框架来处理作业调度(参见Grails with Quartz),而不是重新发明轮子并编写自己的作业调度程序。不要忘记您可能需要不时检查任务的状态,因此您需要围绕任务记录解决方案。