我有一个排队等待人们上传到我的网站的照片,因为在高峰时期,一个小时内可以上传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个进程将无法选择任何一个进程来提供帮助,直到初始进程超时。。。
请给我一些建议!
谢谢您
暂无答案!
目前还没有任何答案,快来回答吧!