在PHP中聚合数据集以获得最佳性能

时间:2013-07-17 02:07:49

标签: php multithreading node.js search

我们有一个高事务PHP站点,整体表现良好,但弱链接是慢搜索结果。我们之所以汇总来自众多来源的数据。例如:

用户点击搜索>从本机数据库获取结果1>从API 2获得结果2>从API 3获得结果3>从API 4获得结果4>聚合和排序>输出到浏览器。

数据来自各种来源,有些来自我们自己的PostgreSQL数据库,但其余来自各种外部API。

正如您所看到的,这种顺序访问是一个真正的杀手。我一直在研究使用线程的各种方法,因此我可以将每个请求分配给它自己的线程并执行最终聚合。

到目前为止,我倾向于专门为搜索编写基于Java的图层。我的想法是向Java服务发送一条消息,它处理脚步池和聚合。我在考虑使用node.js,但我认为可能很难达到最终结果。

有没有人有任何想法或建议?我愿意使用任何语言或技术。

2 个答案:

答案 0 :(得分:0)

看起来您的请求执行时间不能小于API请求执行时间,即使您在异步模式下同时运行所有子请求也是如此。如果您需要将聚合函数应用于所有API和DB数据,则确实如此。但如果您不需要它,请尝试将请求分成小部分。您也可以尝试使用像Gearman这样的任务队列。

已编辑您还可以在此处考虑任何类型的异步调用。为每个api调用尝试在Gearman 异步中启动任务,然后在主请求过程中从您的db获取数据并开始检查异步任务执行结果(您可以在memcache或redis中共享它)。这样就可以并行化部分聚合工作。

答案 1 :(得分:0)

这只是一个尚未提及的备选方案。

你可以坚持使用纯PHP - 只需编写4个新进程,这些进程作为守护进程侦听本地套接字连接。您的搜索脚本可以与每个守护程序建立套接字连接并将搜索参数发送给它们,然后等待结果。您可以使用select()在套接字上有效地等待结果,但即使只是在所有4个套接字上按顺序使用阻塞fgets()调用的简单解决方案,只要您发送消息,就可以获得良好的并发性在尝试读取任何结果之前,所有4个守护进程。

但是,当10个不同的用户同时执行搜索时,这并不会自动提供良好的并发性。守护进程可能能够一次有效地为多个套接字连接提供服务。对于本机数据库查询,您的驱动程序将需要支持异步查询。那些apis调用可能正在使用socket / http。使用select()可以轻松并行套接字/ http请求,也可以考虑使用curl_multi

但是......在一天结束时,使用支持语言的语言可能会更简单。