php—当并行处理的队列中没有太多内容时,如何保持其快速性?

3mpgtkmj  于 2021-06-20  发布在  Mysql
关注(0)|答案(0)|浏览(156)

我有一个排队等待人们上传到我的网站的照片,因为在高峰时期,一个小时内可以上传10000张或更多的照片。
我的php脚本每分钟都通过cron调用一次,并使用where子句从数据库中选取照片 FLOOR(photoId / 100) % $digit ,在哪里 $digit = $counter % 10; 因此,在第一分钟的照片与识别码匹配x0xx得到处理,然后下一分钟的照片与识别码x1x,然后x2xx,以此类推 LIMIT 0, 1000 并让它在超时之前尽可能多地执行查询。
我有一个6核htxeon,通常让这些进程运行6分钟。
当我启动这个过程时,我会运行它 ionice 以及 nice 如果服务器的1分钟平均负载高于6分钟,我将中止。如果不是,我就增加 $counter 继续。
这似乎是一个相当好的平衡,完成了很多工作,而不会影响网站性能太多(一切都在同一个专用服务器上)。
我为什么这么做 FLOOR(photoId / 100) 而不仅仅是 photoId ? 好吧,人们上传了大量的批量照片(即快速爆发的照片),它在网站上的工作更好,所有这些都出现在同一时间。这并不总是能实现,但它将非常接近,比仅仅修改要好得多 photoId .
当队列很忙并且有很多人正在上传时,这个方法非常有效。
但在一个安静的时间里,只有一个摄影师上传了几十张照片,他们可能会“倒霉”,让排队的人花10分钟来处理他们的身份证。
最好的缓解方法是什么?我排到这一步的整个想法都是垃圾吗?我应该做些更好的事情吗?
我可以选择前1000个没有标记为“正在处理”的ID,而不是整个%技术。
然后在数据库中将它们标记为“正在处理”,这样下一个进程就不会选择它们。做尽可能多的,然后取消标记其余的,这样他们可以再次挑选。但是如果队列中少于1000个进程,那么接下来的5个进程将无法选择任何一个进程来提供帮助,直到初始进程超时。。。
请给我一些建议!
谢谢您

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题