在我们的probject中,我们将作业排队到固定的队列名称中(例如app_data_pull,periodic_data_sync等)。集群中的每个服务器都有1个或多个线程工作器(由超级用户管理)来监视这些队列,因此在任何时候,我们可能有10个以上的工匠都在监听单个队列。看来Laravel的队列机制试图同步和锁定作业,以防止多个线程同时拾取同一作业。但是有时,我看到并发执行同一作业。
是否有人了解Artisan队列工作人员如何(或什至)如何处理同步?对于处理信号以确保作业有序执行是否有任何特殊指导?
答案 0 :(得分:0)
您应该检查特定Queue类中的 pop 和 getNextJob 方法。不同的队列使用不同的方法来阻止作业。例如,DatabaseQueue通过调用以下命令将作业标记为保留:
$this->database->table($this->table)->where('id', $job->id)->update([
'reserved_at' => $job->touch(),
'attempts' => $job->increment(),
]);