【问题标题】:Queues and Webworkers with LaravelLaravel 的队列和 Webworkers
【发布时间】:2015-05-13 21:02:59
【问题描述】:

我刚刚开始使用队列,它们可以很好地用于向 Twilio 等发送消息和发送电子邮件和短信。

但现在我想做一些更复杂、更耗时的事情。我希望将大约 10,000 行的文件上传到 AmazonS3,对其进行解析,检查重复项,然后仅插入不重复的记录。

当我运行这个过程时,它需要 6 多分钟才能完成。这太长了。我想让这个在后台运行,视觉进度条会根据队列状态偶尔更新。

另外,在运行时,我希望用户能够完全访问站点和数据库表。这个过程,将锁定我的主表。 所以我基本上想让它在后台运行,只触摸一次主表以检查重复项,然后从那里将文件处理/解析为一个 10,000 多行的临时表。同时让另一张桌子空闲。

一旦完成......它只会写回主表一次。

如何在不降低站点/主服务器速度的情况下实现这一目标?对于这个极其广泛的问题,我深表歉意

【问题讨论】:

    标签: php queue laravel-5 web-worker


    【解决方案1】:

    Laravel Queues 可以做您想做的事,但您的电子邮件中有几点需要说明。

    如何在不降低站点/主服务器速度的情况下实现这一目标?

    好吧,队列在服务器上作为一个单独的进程运行,因此您可能不会看到对服务器的重大影响,前提是您的后台进程不会对服务器。如果您担心对性能的影响并且您正在运行 Linux 服务器,则可以选择限制进程使用的资源 - 查看renice 命令,它允许您调整进程的优先级。如果您不在 Linux 上,那么您的操作系统可能还有其他选择。

    关于数据库,如果不知道您的表是什么样子,就很难回答这个问题。可以使用单个查询和JOIN 在两个表上检查重复项,也许将检查结果写入不同的表。这可能有效,但也可能需要很长时间,具体取决于表的设置方式。另一种解决方案是使用主数据库表的镜像 - 临时复制它,做你的工作,然后删除它。最后,对于真正涉及的解决方案,设置数据库复制并关闭从属设备。

    至于运行队列工作者,我发现使用supervisord 运行我的后台工作非常有帮助——它允许我轻松启动/停止进程,并在进程失败时自动重启进程。 documentation on queue listeners 对此进行了一些讨论。

    而且工作进程会失败 - 我发现我的工作进程经常失败。我认为它与 PHP CLI 设置有关,但它没有给我带来任何问题,所以我没有真正进一步调查它。但是,对于长期运行的工作,您可能会遇到困难。缓解这种情况的一种方法是将您的工作分解为多个较小的工作并将它们“菊花链”在一起:当第 1 部分完成时,它将第 2 部分排队;当 part2 完成时,它会排队 part3,等等。

    至于进度条,这很简单。让作业使用当前状态更新一个值(可能在您的数据库中,或者可能在文件系统中),并在客户端上有一个 Javascript 函数定期执行 AJAX 请求以获取该值并更新进度条。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多