我想使用 MySQL 作为作业队列。多台机器将生产和消费工作。工作需要安排;有些可能每小时运行一次,有些每天运行一次,等等。
这看起来相当简单:对于每个作业,都有一个“nextFireTime”列,让工作机器使用 nextFireTime 搜索作业,将记录的状态更改为“inProcess”,然后在作业执行时更新 nextFireTime结束。
当一个 worker 默默地死去时,问题就来了。它将无法更新 nextFireTime 或将状态设置回“空闲”。
不幸的是,作业可能会长时间运行,因此无法选择用于查找已处理时间过长的作业的收割线程。没有有效的超时值。
谁能建议一种能够正确处理不可靠工作机器的设计模式?
最佳答案
大概是这样
当一个工作人员获取一个工作时,它可以将它的进程 ID 或另一个唯一 ID 添加到工作中的一个字段
然后在另一个表中,每个 worker 不断更新他们还活着的值。更新“我还活着”字段时,您会检查所有其他“最后一次工作人员显示出生命迹象”。如果一个 worker 超过了限制,找到它正在处理的所有工作并重置它们。
换句话说,看门狗在工作进程上工作,而不是工作本身。
关于mysql - 使用 MySQL 作为作业队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7030681/