我即将开展一个大型项目,我需要计划任务(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 万亿美元的价格购买您 :-)