Php 队列管理器无法将项添加到重新执行时的情况?

Php 队列管理器无法将项添加到重新执行时的情况?,php,queue,Php,Queue,假设我们正在队列中执行一些任务。执行某些队列项目时,我们捕获到一些异常,并尝试将此项目添加回队列以重试,但由于与Redis(例如)的连接中断或任何其他问题,QueueManager无法执行此操作 $Item = $QueueManager->getNext(); try { $Item->runWorker(); } catch (\Exception $e) { $Item->incrementRetries(); $QueueManager->

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

$Item = $QueueManager->getNext();
try {
    $Item->runWorker();
} catch (\Exception $e) {
    $Item->incrementRetries();
    $QueueManager->addItem($Item); //what to do if error occures here?
}
正如你们所看到的,我们失去了这个项目。
在这种情况下该怎么办?

如果由于连接丢失而导致间歇性故障,我会尝试重新连接。如果仍然失败,或者是停机,那么您要么在基础架构中构建冗余,要么在代码中处理冗余

您可以提高队列/db的可用性。设置负载平衡器和多个节点(独立或复制)。如果一个坏掉了,它将故障转移到一个工作的。根据队列使用的软件的不同,它可能会将所有作业持久化到磁盘,因此,如果它停止运行,当它重新联机时,仍然可以处理作业。您只需确保至少有一个节点始终在运行并接受连接。根据您使用的队列,这可能是可能的,也可能是不可能的

如果附加硬件不是一个选项,那么您需要在代码中处理它。您需要添加备用回退。您可以使用回退数据库并将数据插入其中,或将数据写入平面文件,然后在恢复连接后处理该数据。如果您使用多台服务器,那么在每个服务器上本地存储数据的回退可能会有问题

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

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


希望这能有所帮助

我真的很感谢你的详细解释!非常感谢你。