首页 > 解决方案 > 当并行处理的队列不多时,如何保持它的敏捷?

问题描述

我有一个人们上传到我网站的照片的队列,因为在高峰时间可能会在一小时内上传 10,000 或更多张照片。

我的 php 脚本每分钟通过 cron 调用一次,并使用 where 子句从数据库中挑选照片FLOOR(photoId / 100) % $digit,其中$digit = $counter % 10;

因此,在第一分钟处理 ID 与 xxxx0xx 匹配的照片,然后处理 ID 为 xxxx1xx 和 xxxx2xx 的下一分钟照片,等等。我LIMIT 0, 1000查询并让它在我超时之前尝试做尽可能多的事情。

我有一个 6 核 HT xeon,通常让这些进程运行 6 分钟。

当我启动该过程时,我会运行它ionicenice如果服务器的 1 分钟平均负载高于 6,我将中止。如果没有,我会增加$counter并继续。

这似乎是完成大量工作的一个相当好的平衡,而不会过多地阻碍网站性能(一切都在同一个专用服务器上)。

我为什么要做FLOOR(photoId / 100)而不仅仅是photoId?好吧,人们上传了很多批量照片(即快速连拍),并且在网站上效果更好,因为这些照片都同时出现。这并不总是能做到这一点,但它会非常接近并且比仅仅改装要好得多photoId

当队列很忙并且有很多人在上传时,这非常有效。

但是在只有一位摄影师上传几十张照片的安静时间,他们可能会变得“不走运”,并且排队需要 10 分钟才能找到他们的身份证件来处理。

减轻这种情况的最佳方法是什么?到目前为止,我对排队的整个想法都是垃圾,我应该做些更好的事情吗?

而不是整个 % 技术,我可以只选择前 1000 个未标记为“正在处理”的 id。

然后我在数据库中将它们标记为“正在处理”,这样下一个过程就不会选择它们。尽可能多地做,然后取消标记其余的,以便可以再次选择它们。但是,如果队列中的人数少于 1000,那么接下来的 5 个进程将无法选择任何帮助,直到初始进程超时......

请提出建议!

谢谢

标签: phpmysqlqueuejob-queue

解决方案


推荐阅读