Heim  >  Artikel  >  PHP-Framework  >  Was passiert, wenn die Laravel-Warteschlange ausfällt?

Was passiert, wenn die Laravel-Warteschlange ausfällt?

PHPz
PHPzOriginal
2023-04-23 09:08:281163Durchsuche

Bei Verwendung der Laravel-Warteschlange kann es zu Fehlern bei der Aufgabenausführung kommen. Zu diesem Zeitpunkt bietet Laravel eine gute Lösung, nämlich die Verwendung einer Fehlerwarteschlange.

Wenn wir Warteschlangenaufgaben ausführen, können wir fehlgeschlagene Aufgaben in eine Warteschlange verschieben, die speziell für die Bearbeitung fehlgeschlagener Aufgaben entwickelt wurde, und diese Warteschlange dann regelmäßig überprüfen und die darin enthaltenen fehlgeschlagenen Aufgaben erneut ausführen. Auf diese Weise können wir vermeiden, dass die Warteschlangenaufgaben aufgrund kleinerer Probleme beendet werden, und uns weiterhin bedienen.

Die Fehlerwarteschlange von Laravel bietet mehrere Konfigurationen und erweiterbare Schnittstellen, die wir entsprechend unseren eigenen Anforderungen konfigurieren können.

Zuerst müssen wir die Warteschlange festlegen, in die fehlgeschlagene Aufgaben in der Konfigurationsdatei config/queue.php aufgenommen werden sollen. Der Schlüssel dieses Konfigurationselements ist failed und sein Wert ist ein Array, das zwei Konfigurationselemente enthält: driver und queue. Das Konfigurationselement driver gibt an, welchen Fehlertreiber wir standardmäßig verwenden möchten, database und redis. Und queue gibt an, in welche Warteschlange die fehlgeschlagene Aufgabe gelangt. config/queue.php 中设置失败的任务应该进入的队列。该配置项的键为 failed,其值为一个数组,其中包含 driverqueue 两个配置项。driver 配置项表示我们希望使用哪个失败驱动,Laravel 默认提供了 databaseredis 两个失败驱动。而 queue 则表示失败任务将进入哪个队列。

'failed' => [
    'driver' => 'database',
    'queue' => 'failed',
],

如果我们希望使用其他的失败驱动,我们可以通过注册自定义失败驱动并在 driver 配置项中引用它来实现。

注册自定义驱动的代码如下所示:

Queue::failing(function ($connection, $job, $data) {
    // 自定义处理逻辑
});

接下来,我们需要定义处理失败任务的具体逻辑。我们可以直接将失败任务再次推入队列中,这样在下一次队列处理时该任务就会再次被执行。或者,我们也可以将失败任务的一些信息存储下来以备后续检查以及处理。

对于将失败任务推入队列的处理方式,我们可以使用以下代码:

Queue::failing(function ($connection, $job, $data) {
    $queue = $job->getQueue();
    $payload = $job->payload();

    Queue::pushRaw($payload, $queue);
});

这段代码将失败任务重新推到了原始队列中,等待下一次被执行。

而对于将失败任务信息存储的处理方式,我们可以使用以下代码:

Queue::failing(function ($connection, $job, $data) {
    // 将失败任务信息存储到数据库中
    DB::table('failed_jobs')->insert([
        'connection' => $connection,
        'queue' => $job->getQueue(),
        'payload' => $job->getRawBody(),
        'exception' => $data['exception'],
        'failed_at' => now(),
    ]);
});

这段代码将失败任务的信息存储到数据库表 failed_jobs 中,以便我们稍后进行检查以及处理。

除了以上两种处理方式,Laravel 还提供了更多的处理方式供我们选择。我们可以查看 Laravel 的文档以及源代码以了解更多详情。

最后,我们需要定期检查失败队列并重试其中的任务。Laravel 默认提供了 queue:retry 命令来进行任务重试,该命令接受一个可选参数 --queue,表示我们要重试的任务队列。如果不指定该参数,则默认重试所有队列。

php artisan queue:retry 5 --queue=my-queue

该命令将会从失败队列中的 my-queue 队列中重新执行前 5 个失败任务。

除此之外,我们还可以使用操作系统的定时任务工具(如 crontab)来周期性地执行 queue:retryrrreee

Wenn wir andere Fehlertreiber verwenden möchten, können wir dies tun, indem wir einen benutzerdefinierten Fehlertreiber registrieren und im Konfigurationselement driver darauf verweisen.

Der Code zum Registrieren eines benutzerdefinierten Treibers lautet wie folgt:

rrreee

Als nächstes müssen wir die spezifische Logik für die Behandlung fehlgeschlagener Aufgaben definieren. Wir können die fehlgeschlagene Aufgabe direkt erneut in die Warteschlange verschieben, sodass die Aufgabe bei der nächsten Warteschlangenverarbeitung erneut ausgeführt wird. Alternativ können wir auch einige Informationen über fehlgeschlagene Aufgaben zur späteren Prüfung und Bearbeitung speichern. 🎜🎜Für die Verarbeitungsmethode zum Verschieben der fehlgeschlagenen Aufgabe in die Warteschlange können wir den folgenden Code verwenden: 🎜rrreee🎜Dieser Code verschiebt die fehlgeschlagene Aufgabe zurück in die ursprüngliche Warteschlange und wartet auf die nächste Ausführung. 🎜🎜Um Informationen zu fehlgeschlagenen Aufgaben zu speichern, können wir den folgenden Code verwenden: 🎜rrreee🎜Dieser Code speichert die Informationen zu fehlgeschlagenen Aufgaben in der Datenbanktabelle failed_jobs, damit wir sie später überprüfen und verarbeiten können. 🎜🎜Zusätzlich zu den beiden oben genannten Verarbeitungsmethoden stellt Laravel uns auch weitere Verarbeitungsmethoden zur Auswahl. Weitere Informationen finden Sie in der Dokumentation und im Quellcode von Laravel. 🎜🎜Abschließend müssen wir die Fehlerwarteschlange regelmäßig überprüfen und die darin enthaltenen Aufgaben erneut ausführen. Laravel bietet standardmäßig den Befehl queue:retry, um Aufgaben erneut auszuführen. Dieser Befehl akzeptiert einen optionalen Parameter --queue, der die Aufgabenwarteschlange darstellt, die wir wiederholen möchten. Wenn dieser Parameter nicht angegeben ist, werden alle Warteschlangen standardmäßig erneut versucht. 🎜rrreee🎜Dieser Befehl führt die ersten 5 fehlgeschlagenen Aufgaben aus der Warteschlange my-queue in der Fehlerwarteschlange erneut aus. 🎜🎜Darüber hinaus können wir auch das Tool für geplante Aufgaben des Betriebssystems (z. B. Crontab) verwenden, um den Befehl queue:retry regelmäßig auszuführen, um fehlgeschlagene Aufgaben regelmäßig zu bearbeiten. 🎜🎜Kurz gesagt, die Fehlerwarteschlange von Laravel bietet eine sehr nützliche Lösung, um den Fehler von Warteschlangenaufgaben zu bewältigen. Wir können es nach unseren eigenen Bedürfnissen konfigurieren und auf viele verschiedene Arten mit fehlgeschlagenen Aufgaben umgehen. Gleichzeitig müssen wir auch die Fehlerwarteschlange regelmäßig überprüfen und die darin enthaltenen Aufgaben erneut ausführen, um sicherzustellen, dass die Aufgaben in der Warteschlange normal ausgeführt werden können. 🎜🎜Ich hoffe, dieser Artikel ist für alle hilfreich. 🎜

Das obige ist der detaillierte Inhalt vonWas passiert, wenn die Laravel-Warteschlange ausfällt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn