队列管理器无法添加项目以重新执行的情况?

时间:2014-06-17 18:58:17

标签: php queue

让我们假设我们正在队列中执行一些任务。执行某个队列项时,我们会捕获一些异常并尝试将此项添加回队列以进行重试,但由于与Redis(例如)或任何其他问题的连接丢失,QueueManager无法执行此操作。 / p>

$Item = $QueueManager->getNext();
try {
    $Item->runWorker();
} catch (\Exception $e) {
    $Item->incrementRetries();
    $QueueManager->addItem($Item); //what to do if error occures here?
}

正如你所看到的,我们正在失去物品。 在这种情况下该怎么办?

1 个答案:

答案 0 :(得分:1)

如果连接丢失,这是一个间歇性的问题,我会尝试重新连接。如果仍然失败,或者是中断的情况,那么您要么在基础架构中构建冗余,要么在代码中处理冗余。

您可以提高队列/数据库的可用性。设置负载均衡器和多个节点(独立或复制)。如果一个人失败,它将失败到一个工作的。根据您用于队列的软件,它可能会将所有作业保留到磁盘,因此如果它发生故障,作业仍然可以在重新联机时进行处理。您只需要确保至少有一个节点始终在运行并接受连接。根据您使用的队列,这可能会也可能不会。

如果无法选择其他硬件,则需要在代码中处理。您需要添加备用后备。您可以使用回退数据库并将数据插入其中,或者为平面文件写入数据,并在以后恢复连接时进行处理。如果您使用的是多台服务器,那么在每台服务器上本地存储数据的回退可能会有问题。

我不确定您使用的是哪种软件用于队列(我假设您使用Redis,因为您提到它)但是检查是否有一种方法在您告诉它之前不会从队列中删除该项目。这样,如果你失去连接并且项目失败,你不需要将它重新添加到队列中,因为它仍然在那里,你只需要设置一个超时并继续前进。然后,该项目将在某一点重新尝试。如果项目已处理,但您仍然有连接,则将其从队列中删除,然后继续。

最后,您可能需要评估当前用于队列的软件是否适合您。也许您需要找到一个具有更高可靠性和/或支持类似用例的工具,如上所述。

希望有所帮助