【问题标题】:Run a DB-intensive query/calculation asynchronously异步运行数据库密集型查询/计算
【发布时间】:2014-12-04 02:50:28
【问题描述】:

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

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

评级计算并不繁重,但需要计算可能有 1,000 多个项目的评级,并且通过 wp-cron 每小时执行一次将开始对内容众多的网站造成问题。忽略对页面加载的影响(一旦达到特定间隔,wp-cron 就会处理页面加载请求),在某些时候脚本将达到时间限制。将站点设置为使用“plain ol' cron”将解决页面加载问题,但不能解决超时问题。

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

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

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

【问题讨论】:

    标签: wordpress cron rating


    【解决方案1】:

    根据主机的不同,您可能会遇到棘手的情况。让我概述几个理想的案例,您可以选择/选择您需要的地方。

    选项 1

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

    这里的想法是您要从等式中删除您的活动网站。您要做的最后一件事是让一个代价高昂的 cron 作业锁定实时站点的数据库或导致查询在索引编制时变慢。

    选项 2

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

    如果您已经在网站上使用 Elastic Search 之类的东西,则可以将评分添加为添加的索引方面。然后在评分变化时更新帖子,稍后使用 ES API 查询最受欢迎的帖子。

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

    选项 3

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

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

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

    【讨论】:

    • 选项 1 不可用,因为我无法控制这些人的托管位置。选项 2 很有趣,但可能是过度杀伤/太多工作无法合并(加上成本)。我认为选项 3 是这里的赢家。将需要用户进行一些配置,但不会太多以至于无法记录。谢谢埃里克!
    猜你喜欢
    • 2020-06-07
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多