2013-07-17 39 views
1

我们有一个高交易PHP站点,整体表现良好,但弱链接是慢搜索结果。原因是我们汇总了众多来源的数据。例如:在PHP中汇总数据集以获得最佳性能

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

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

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

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

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

+1

不需要java:http://php.net/Thread !! –

回答

0

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

EDITED这里也可以考虑任何形式的异步调用。尝试异步调用Gearman 中的启动任务,然后在主请求过程中从您的db中获取数据,并开始检查异步任务执行结果(您可以在memcache或redis中共享它)。这样你可以并行化一部分聚合工作。

+0

感谢您的回复。我现在会看看Gearman。 – AdamP

0

这只是一个尚未提及的替代选项。

你可以坚持纯粹的PHP - 只需编写4个新进程作为监听本地套接字连接的守护进程运行。您的搜索脚本可以与每个守护进程建立套接字连接并将搜索参数发送给它们,然后等待结果。您可以使用select()高效地等待套接字上的结果,但即使是在所有4个套接字上依次使用拦截fgets()调用的简单解决方案,只要在尝试读取消息之前将消息发送给所有4个守护进程,就会给您带来很好的并发性任何结果。

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

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

相关问题