2015-05-13 50 views
0

林刚开始接触的队列,他们工作的优良消息和发送电子邮件和短信对Twilio等队列和Webworkers与Laravel

但现在我想要做一些更复杂,耗时。我正在寻找将大约10,000行的文件上传到AmazonS3,解析它,检查重复项,然后只插入不重复的记录。

当我运行此过程需要6分钟才能完成。这是很长的路要走。我希望在后台运行此操作,并根据队列状态随时更新可视化进度条。

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

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

如何在不减缓站点/主服务器速度的情况下实现这一目标?我很抱歉的极其广泛的问题

回答

0

Laravel Queues可以做你想做的,但有几点要解决你的电子邮件。

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

好,队列运行在服务器上的一个单独的进程,所以你可能看不到服务器上产生了重大影响,只要你的后台程序不会做任何事情太紧张服务器。如果您担心会影响性能,并且您正在运行Linux服务器,则可以选择限制进程使用的资源 - 请查看renice命令,该命令允许您调整进程的优先级。如果您不在Linux上,那么您的操作系统可能还有其他选项。

对于数据库来说,如果不知道你的表是什么样的,那很难回答。可能可以在两个表上检查重复的单个查询和JOIN,也许可以将检查结果写入不同的表。这可能工作,但它也可能需要很长时间,取决于如何设置表。另一种解决方案是使用主数据库表的镜像 - 暂时复制它,做你的工作,然后删除它。最后,对于一个确实涉及的解决方案,建立数据库复制和工作奴隶。

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

而工人将失败 - 我发现我的工作进程经常失败。我认为它与PHP CLI设置有关,但它没有引起任何问题,所以我没有进一步调查。但是,对于长期工作,您可能会遇到困难。减轻这种影响的一种方法是将你的工作分解成多个小型工作,并将它们“菊花链”连接在一起:当part1完成时,它将第二部分排队;当part2完成时,它会排队第3部分等。

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