php - 当并行处理的队列不多时,如何保持它的敏捷?
问题描述
我有一个人们上传到我网站的照片的队列,因为在高峰时间可能会在一小时内上传 10,000 或更多张照片。
我的 php 脚本每分钟通过 cron 调用一次,并使用 where 子句从数据库中挑选照片FLOOR(photoId / 100) % $digit
,其中$digit = $counter % 10;
因此,在第一分钟处理 ID 与 xxxx0xx 匹配的照片,然后处理 ID 为 xxxx1xx 和 xxxx2xx 的下一分钟照片,等等。我LIMIT 0, 1000
查询并让它在我超时之前尝试做尽可能多的事情。
我有一个 6 核 HT xeon,通常让这些进程运行 6 分钟。
当我启动该过程时,我会运行它ionice
,nice
如果服务器的 1 分钟平均负载高于 6,我将中止。如果没有,我会增加$counter
并继续。
这似乎是完成大量工作的一个相当好的平衡,而不会过多地阻碍网站性能(一切都在同一个专用服务器上)。
我为什么要做FLOOR(photoId / 100)
而不仅仅是photoId
?好吧,人们上传了很多批量照片(即快速连拍),并且在网站上效果更好,因为这些照片都同时出现。这并不总是能做到这一点,但它会非常接近并且比仅仅改装要好得多photoId
。
当队列很忙并且有很多人在上传时,这非常有效。
但是在只有一位摄影师上传几十张照片的安静时间,他们可能会变得“不走运”,并且排队需要 10 分钟才能找到他们的身份证件来处理。
减轻这种情况的最佳方法是什么?到目前为止,我对排队的整个想法都是垃圾,我应该做些更好的事情吗?
而不是整个 % 技术,我可以只选择前 1000 个未标记为“正在处理”的 id。
然后我在数据库中将它们标记为“正在处理”,这样下一个过程就不会选择它们。尽可能多地做,然后取消标记其余的,以便可以再次选择它们。但是,如果队列中的人数少于 1000,那么接下来的 5 个进程将无法选择任何帮助,直到初始进程超时......
请提出建议!
谢谢
解决方案
推荐阅读
- java - 以 pdf 格式发送字节
- ios - Swift 5 如何使用按钮删除和复制表格视图单元格
- python - 如何加速下面的代码?实现没有中心元素的 maxpool
- python - 添加 https 支持后无法访问托管在 EC2 上的 Flask 应用程序
- reactjs - 用于初始化 useState 钩子的传入属性在调用钩子的更新程序方法时得到更新
- ssl - 如何通过 Jrockit Keytool 导入 crt 和 key
- python - 如何将抓取的数据列表转换为 excel 列?
- python - 计数值,使用 Pandas 保留重复项
- java - 添加测试后构建失败,即使脚本中没有错误。在eclipse中使用selenium,testng和maven
- thunderbird - Thunderbird 使用 qmail 扩展回复