我有一个很长的mysql队列。我有1个工作脚本来处理每个队列。
但是当这个worker正在运行时,可能会更新数据库或获取新的行插入。
示例工作者脚本
get_current_queue = SELECT from queue...
while(get_current_queue) {
update_current_row_from_queue "processing"
//some cpu intensive processing here that takes varying amount of time.
}
问题是工作者脚本需要不同的时间,具体取决于给定时间的队列有多长,以及每个cpu处理需要多长时间(转换视频为ex)。
所以当我在第一个工作脚本运行时运行另一个工作脚本时,第一个工作人员尚未在队列数据库中标记为“处理”的队列将落在第二个工作人员的待办事项列表中。
我不知道如何解决这个问题。
当一个工人运行时,我需要一些方法来标记这个批处理,所以只有这个工人才能运行它。
并且在运行时,插入新行后,如果我选择启动另一个工作程序,它可以正常工作。
答案 0 :(得分:1)
将表队列中的一个字段用于当前正在处理该行的工作人员ID。
首先做update queue set worker_id = myid Where worker_id = '' LIMIT 100
然后select * from queue where worker_id = myid
并处理这些行。
毕竟从队列中删除这些行或将它们标记为已处理。
当您的某个工作人员在处理通过将worker_id设置回''来解锁未处理的行时,您可能需要某种回退来覆盖这种情况。
答案 1 :(得分:1)
这也可以更容易地检查工人是否已经死亡。因为每个工人在任何给定时间只能有一个任务。
我实施了一个这样的系统,每周末运行imagemagick处理超过250,00张图像的机器。 (这就是工作进来的时候。)然后我可以在一周内无人可及的情况下关闭工人,随着工作量的增加将他们解雇。像冠军一样工作。