Heim > PHP-Framework > Laravel > Einführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code)

Einführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code)

不言
Freigeben: 2018-08-28 13:37:22
Original
3435 Leute haben es durchsucht

Dieser Artikel bietet Ihnen eine Einführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code). Ich hoffe, dass er für Freunde hilfreich ist.

In der tatsächlichen Projektentwicklung stoßen wir häufig auf Situationen, in denen leichte Warteschlangen erforderlich sind, z. B. das Senden von Textnachrichten, das Senden von E-Mails usw. Diese Aufgaben reichen nicht aus, um schwere Nachrichtenwarteschlangen wie Kafka und RabbitMQ zu verwenden, aber Und es erfordert Funktionen wie Asynchronität, Wiederholung und Parallelitätskontrolle. Im Allgemeinen verwenden wir Redis, Beanstalk und Amazon SQS, um verwandte Funktionen zu implementieren. In diesem Artikel werden die am häufigsten verwendeten Redis-Warteschlangen vorgestellt.

Bevor wir den Warteschlangendienst von Laravel erklären, müssen wir zunächst über den auf Redis basierenden Warteschlangendienst sprechen. Erstens ist Redis für das Caching konzipiert, kann aber aufgrund einiger seiner eigenen Eigenschaften für Nachrichtenwarteschlangen verwendet werden

Redis-Warteschlangendatenstruktur

Verknüpfte Liste auflisten

Die Nachrichtenwarteschlangenfunktionen von Redis wie FIFO (First In, First Out) sind einfach zu implementieren. Sie benötigen lediglich ein Listenobjekt, um Daten vom Anfang abzurufen und Daten vom Ende zu stopfen.

Verwandte Befehle: (1) Links rein und rechts raus: lpush/rpop (2) Rechts rein und links raus: rpush/lpop.

Diese einfache Nachrichtenwarteschlange ist einfach zu implementieren.

Zset Ordered Set

Einige Aufgabenszenarien erfordern nicht, dass die Aufgabe sofort ausgeführt wird, aber einige Aufgaben sind sehr wichtig und müssen wiederholt werden, wenn die Aufgabe fehlschlägt. Diese Funktionen können nicht allein durch die Verwendung von Listen erreicht werden. Zu diesem Zeitpunkt ist eine geordnete Sammlung von Redis erforderlich.

Der geordnete Redis-Satz ähnelt dem Redis-Satz. Es handelt sich um eine Sammlung, die nicht dieselbe Zeichenfolge enthält. Der Unterschied zwischen ihnen besteht darin, dass jedem Mitglied der geordneten Menge eine Bewertung zugeordnet ist, anhand derer die Mitglieder der geordneten Menge von der niedrigsten zur höchsten Bewertung eingestuft werden.

Wenn man nur den geordneten Satz und die verzögerten Aufgaben betrachtet, gibt es keinen Zusammenhang, aber Sie können die Punktzahl des geordneten Satzes auf den Zeitpunkt festlegen, zu dem die verzögerte Aufgabe gestartet wird, und dann den geordneten Satz abfragen, um die abzurufen Abgelaufene Aufgaben kommen zur Verarbeitung heraus und erkennen so die Funktion, Aufgaben zu verzögern.

Bei wichtigen Aufgaben, die wiederholt werden müssen, wird die Aufgabe vor ihrer Ausführung in eine geordnete Sammlung aufgenommen und die längste Ausführungszeit der Aufgabe festgelegt. Wenn die Aufgabe erfolgreich ausgeführt wird, wird die Aufgabe aus der geordneten Sammlung gelöscht. Wenn die Aufgabe nicht innerhalb der angegebenen Zeit abgeschlossen wird, werden die Aufgaben im geordneten Satz wieder in die Warteschlange gestellt.

Verwandte Befehle:

(1) ZADD Fügt ein oder mehrere Mitglieder zu einem geordneten Satz hinzu oder aktualisiert seine Punktzahl, wenn er bereits vorhanden ist.

(2) ZRANGEBYSCORE Gibt einen geordneten Satz von Mitgliedsbereichen nach Punktzahl zurück.

(3) ZREMRANGEBYRANK Entfernt alle Mitglieder aus einer geordneten Menge innerhalb des angegebenen Index.

Aufgabenplanung des Laravel-Warteschlangendienstes

Der Aufgabenplanungsprozess des Warteschlangendienstes ist wie folgt:

Einführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code)

Laravels Warteschlangendienst besteht aus zwei Es gibt zwei Prozesssteuerungen, eine ist der Produzent und die andere ist der Verbraucher. Diese beiden Prozesse manipulieren drei Redis-Warteschlangen, von denen eine List für unmittelbare Aufgaben und zwei Zsets für verzögerte und ausstehende Aufgaben zuständig ist.

Der Produzent ist dafür verantwortlich, Aufgaben an Redis zu senden. Wenn es sich um eine sofortige Aufgabe handelt, wird sie standardmäßig in die Warteschlange gestellt. Wenn es sich um eine verzögerte Aufgabe handelt, wird sie in die Warteschlange gestellt: Standard. verzögert.

Der Verbraucher fragt zwei Warteschlangen ab, entnimmt kontinuierlich Aufgaben aus der Warteschlange, stellt die Aufgaben zunächst in queue:default:reserved ein und führt dann verwandte Aufgaben aus. Wenn die Aufgabe erfolgreich ausgeführt wird, wird die Aufgabe in queue:default:reserved gelöscht, andernfalls wird sie wieder in die Warteschlange queue:default:delayed gestellt.

Der Gesamtprozess des Laravel-Warteschlangendienstes

Aufgabenverteilungsprozess:

Einführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code)

Aufgabenprozessorbetrieb:

Einführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code)

Aufgabe erstellen

Warteschlangeneinstellungen

'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => 'default',
        'retry_after' => 90,
    ],
Nach dem Login kopieren

In config/queue.php konfigurieren
Im Allgemeinen ist die Standard-Redis-Konfiguration Wie oben, Verbindung ist der Verbindungsname von Redis in der Datenbank. Beachten Sie, dass Sie bei Verwendung eines Redis-Clusters das Schlüssel-Hash-Tag verwenden müssen Läuft über retry_after hinaus. Nach dieser Zeit wird die Aufgabe wieder in die Warteschlange gestellt.

Erstellung der Aufgabenklasse

Die Struktur der Aufgabenklasse ist sehr einfach, sie enthält im Allgemeinen nur eine Handle-Methode, die die Warteschlange zum Aufrufen dieser Aufgabe verwendet.

Wenn Sie möchten, dass Aufgaben in die Warteschlange verschoben und nicht synchron ausgeführt werden, müssen Sie die IlluminateContractsQueueShouldQueue-Schnittstelle implementieren.

Wenn Sie Aufgaben an eine bestimmte Verbindung senden möchten, z. B. Redis oder Sqs, müssen Sie die Verbindungsvariable festlegen.

Wenn Sie die Aufgabe in eine bestimmte Warteschlange verschieben möchten, können Sie die Warteschlangenvariable festlegen.

如果想要让任务延迟推送,那么需要设置 delay 变量。

如果想要设置任务至多重试的次数,可以使用 tries 变量;

如果想要设置任务可以运行的最大秒数,那么可以使用 timeout 参数。

如果想要手动访问队列,可以使用 trait : IlluminateQueueInteractsWithQueue。

任务的分发
分发服务
写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:

class PodcastController extends Controller
{
    public function store(Request $request)
    {
        // 创建播客...

        ProcessPodcast::dispatch($podcast);
    }
}
Nach dem Login kopieren

如果想延迟执行一个队列中的任务,可以用任务实例的 delay 方法。

 ProcessPodcast::dispatch($podcast)
                ->delay(Carbon::now()->addMinutes(10));
Nach dem Login kopieren

通过推送任务到不同的队列,可以给队列任务分类,甚至可以控制给不同的队列分配多少任务。要指定队列的话,就调用任务实例的 onQueue 方法:

ProcessPodcast::dispatch($podcast)->onQueue('processing');
Nach dem Login kopieren

如果使用了多个队列连接,可以将任务推到指定连接。要指定连接的话,可以在分发任务的时候使用 onConnection 方法:

ProcessPodcast::dispatch($podcast)->onConnection('redis
');
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von Warteschlangen im Laravel-Framework (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage