异步运行数据库密集型查询/计算

时间:2014-12-03 18:13:09

标签: wordpress cron rating

这个问题与WordPress的wp-cron函数有关,但通用性足以应用于任何数据库密集型计算。

我正在创建一个网站主题,需要定期计算系统中所有内容的时间衰减评级。此评级确定主页上帖子的顺序,该页面被分页以允许访问者可能查看所有内容。需要经常计算此评级值,以确保网站具有按正确顺序列出的新内容。

评级计算并不重要,但需要计算1,000个项目的评级,并且每小时通过wp-cron进行评估将开始为具有大量内容的网站带来问题。忽略对页面加载的影响(wp-cron在达到特定时间间隔后处理页面加载时的请求),在某些时候脚本将达到时间限制。设置网站使用"普通ol'的cron"将解决页面加载问题,但不解决超时问题。

假设我无法控制将要运行的网站,那么定期处理此评级计算的最佳方法是什么?想到的一些事情:

  • 仅计算最近1,000个帖子的评分,假设其他帖子不会被看到太多。不过,我不喜欢忽略所有旧内容的想法。
  • 计算第一个,比如100左右,然后只计算旧组的评级(如果加载了这些页面)。但这可能很难做到,并导致不正确的列表和评级(这对于较旧的内容来说不是一个大问题,而是我想避免的事情)
  • 定期批处理100个左右,跟踪最后一个处理过程。这将最终循环遍及整个内容。

还有其他想法吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

根据主机的不同,您可能处于潜在的棘手状态。让我概述一些理想情况,您可以选择/选择您需要的地方。

选项1

首先镜像数据库并使用辅助应用程序(WordPress或其他方式)对该数据库镜像进行异步计算。当他们完成后,他们可以更新项目根目录中的静态文件,将数据写入共享的Memcached实例,触发POST到WordPress' admin_post端点写一些内部状态,无论如何。

这里的想法是,您要从等式中删除您的活动网站。你要做的最后一件事就是让一个昂贵的cron作业锁定现场网站的数据库,或者导致查询在索引时减慢速度。

选项2

将计算完全卸载到单独的应用程序中。使用WordPress实时跟踪评级是一个糟糕的主意,因为它绕过页面缓存并在每次新的评级进入时触发无法访问的请求。将其推送到第二台服务器意味着您的WordPress网站速度超快,这也意味着您可以让第二台服务器首先为你做计算。

如果您已在网站上使用类似弹性搜索的内容,则可以添加评分作为添加的索引方面。然后只需在评分更改时更新帖子,并使用ES API稍后查询大多数热门帖子。

或者,您可以使用Keen IO等托管服务来记录和汇总评分。

选项3

仍然使用cron,但不要将其安排为WordPress中的cron作业。而是编写一个WP CLI例程,为您重建索引。然后,安排真正的cron作业来处理工作。

这具有使用PHP命令行版本的优点,可以将其配置为跳过对FPM / CGI /用于为站点提供服务的任何版本施加的超时和内存限制。这也意味着您不必等待站点流量来触发作业 - 而且长时间运行的作业不会阻止WordPress中的其他cron事件被触发。

如果使用此过程,我会将作业设置为每小时运行一次,并且每小时运行一批数据库中总帖子数的1/24。您可以跟踪数据库中的偏移量甚至是已处理的帖子ID,只需要您在一天内默默地重新索引帖子。