【发布时间】:2021-01-16 21:55:10
【问题描述】:
我正在为多个同时午餐的 cronjobes 相同的记录过程问题而苦苦挣扎
简介
- 我有 100 多个客户的 db 表
- 对于每个客户,我必须每 5 分钟通过 cronjobe 运行一些脚本
- Cronjobe 从 db 中获取每个客户立即更新上次使用的时间戳,以便下一个 cron 将选择 5 分钟前处理的下一条记录
- Cronjobe 处理大约需要 30 秒
- 所以这意味着在所需的 5 分钟内处理所有 100 个客户,我将需要大约 10 次模拟 cron jobes wokring
- 所有 cron 定义为:* * * * * php cron.php(因此每 1 分钟午餐 10 个 cronjobes)
- cron 对该客户 ip 进行一些网络查找并将其记录到日志数据库中,它应该在每 5 分钟内为每个客户发生一次,因为稍后我将根据每个客户的日志绘制图表
- 代码用PHP编写,DB是MySql
问题是当 10 个 cronjobes 同时启动时,随机发生 2 个 cronjobes 从数据库中选择同一个客户进行处理
所以这意味着 2 个 crons 几乎同时开始(微秒差异) 两者都是同时从数据库中选择最后一个未处理的行(例如 id:17),然后更新数据库中的相同 id17 3-dth 午餐 cronjobe 已经使用了 id:18。 但我需要每个 coronjobe 从数据库中获取不同的唯一下一条记录
As a workaround i tried to add random sleep(rand(1,10)) delay at beginning of cron.php but don't help mutch, random duplication still happens cause cron continuously selects last unprocessed next customer which sometime matches with another cornjobe next customer select at same time
有没有针对这种情况的解决方案???
【问题讨论】:
-
您可以将每个客户永久分配到十个 cron 作业之一。这样,客户总是由同一个工作处理,不会发生冲突。除了这样一个基本的解决方案:这一切听起来很奇怪。您真的需要每 5 分钟花费 30 秒处理每个客户的时间吗?这让我想知道这是怎么回事。对于更好的解决方案,最好有一个想法,我也很好奇。
-
@KIKOSoftware 感谢您的评论,实际上,客户和 crons 数量将不断增加,很难将每个客户优化分配给其个人玉米作业。 cron 对该客户 ip 进行一些网络查找并将其记录到日志数据库中,它应该在每 5 分钟内为每个客户发生一次,因为稍后我将根据日志绘制图表 - 这个想法是让许多 cronjobes 随机选择最后一个未处理的客户和流程
-
将客户分配给 cron 作业并不难。假设您有 10 个工作,编号为 0 到 9,以及 200 个客户,唯一 ID 为 0 到 199。您可以像这样分配客户:
$jobNo = $customerID % 10;。同样,一个 cron 作业可以简单地选择每 10 个客户。这并不难做到。 -
@KIKOSoftware aha 我明白了,谢谢,通过 %id 掩码选择的好方法,但在这种情况下,如果管理员说删除了所有与掩码 %5 匹配 cron 的客户,那么第 5 个 cronjobe 将拥有更少然后其他人要做的工作(而不是他可以帮助他人),解决方案将再次不是最佳的,但是是的,我们将避免重复
-
是的,被删除的客户会带来轻微的挑战,但我认为这是可以克服的。这个基本思想保持不变:让客户永远不会被多个 cron 作业选中。