KerndatenHintergrundaufgaben

Job-Queues

FIFO-Queues, die keine Jobs verlieren, wenn ein Worker ausfällt, mit Produzenten und Konsumenten, die parallel laufen.

LPUSH/s mit Pipelining, gemessen
31.6M
verlorene Jobs bei Absturz
0
Polling
0
Schritt 1 von 5
Produzenten schieben Jobs ein

Jeder Dienst fügt Arbeit hinzu, ohne auf Konsumenten zu warten.

Beispielsitzungplaying
# Produzenten schieben Jobs ein
hotkv> LPUSH queue:emails "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
(integer) 18

Ein animierter Durchlauf mit echten HotKV-Befehlen und Beispielantworten. Klicken Sie auf einen Schritt, um direkt dorthin zu springen. Befehle und Antworten bleiben auf Englisch, genau so, wie Sie sie in HotKV eingeben und sehen.

Das Problem

Hintergrundarbeit wie E-Mails, Bildskalierung und Webhooks braucht eine Queue zwischen dem Code, der sie erzeugt, und dem Code, der sie erledigt. Eine Queue, die einen Job verliert, wenn ein Worker mitten in der Aufgabe abstürzt, ist schlimmer als gar keine, weil niemand bemerkt, dass der Job weg ist.

So löst HotKV es

Listen ergeben eine einfache FIFO-Queue. BLMOVE verschiebt jeden Job in dem Moment, in dem er an einen Worker geht, auf eine Verarbeitungsliste, sodass ein laufender Job immer irgendwo gespeichert ist, falls dieser Worker verschwindet. Produzenten und Konsumenten werden von parallelen Worker-Threads bedient.

Schritt für Schritt

Was passiert, Befehl für Befehl

  1. 01

    Produzenten schieben Jobs ein

    Jeder Dienst fügt Arbeit hinzu, ohne auf Konsumenten zu warten.

    LPUSH queue:emails "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
  2. 02

    Ein Worker übernimmt einen Job sicher

    BLMOVE blockiert, bis ein Job verfügbar ist, und verschiebt ihn dann in einem Schritt auf eine Verarbeitungsliste.

    BLMOVE queue:emails queue:emails:processing RIGHT LEFT 0
  3. 03

    Nach Erledigung bestätigen

    Die E-Mail ist raus. Der Job wird von der Verarbeitungsliste entfernt.

    LREM queue:emails:processing 1 "{\"to\":\"ada@example.com\",\"tpl\":\"welcome\"}"
  4. 04

    Ein Worker stürzt ab

    Worker 2 fällt mitten im Job aus. Sein Job liegt weiter in der Verarbeitungsliste und ist nicht verloren.

    LRANGE queue:emails:processing 0 -1
  5. 05

    Neu einreihen und weitermachen

    Ein Monitor verschiebt den liegen gebliebenen Job zurück in die Queue, und ein anderer Worker übernimmt ihn.

    LMOVE queue:emails:processing queue:emails LEFT RIGHT
Wo es passt

Szenarien aus der Praxis

Transaktionale E-Mails und SMS

Nachrichten zu Registrierung, Quittung und Passwort-Reset werden von der Web-App eingereiht und von einem Pool von Workern versendet.

Medienverarbeitung

Uploads werden für Vorschaubilder und Transcoding eingereiht, und ein abgestürzter Transcoder verliert nie eine Datei.

Webhook-Zustellung

Ausgehende Webhooks werden eingereiht und erneut versucht, ohne die Anfrage zu blockieren, die sie ausgelöst hat.

Integriert

Was Sie bekommen

FIFO mit blockierenden Lesezugriffen

LPUSH mit BRPOP, und Worker schlafen, bis Arbeit eintrifft.

LPUSHBRPOP

Keine verlorenen Jobs

BLMOVE übergibt jeden Job atomar an eine Verarbeitungsliste.

BLMOVELREM

Parallele Produzenten und Konsumenten

Produzenten und Konsumenten werden von parallelen Worker-Threads bedient.

Mehr nötig?

Für Bestätigungen, Consumer Groups und Replay verwenden Sie Streams.

XADDXREADGROUP

Häufige Fragen

Was passiert mit einem Job, wenn ein Worker abstürzt?

Wenn Sie Jobs mit BLMOVE übernehmen, liegt der Job in der Verarbeitungsliste. Ein Monitor kann alles, was dort zu lange liegt, zurück in die Queue verschieben.

Müssen Worker pollen?

Nein. BRPOP und BLMOVE blockieren, bis ein Job eintrifft, mit optionalem Timeout.

Listen oder Streams?

Listen sind die einfachste Queue. Streams ergänzen Consumer Groups, Bestätigung pro Nachricht und Verlauf. Siehe den Anwendungsfall Event-Streaming.

Verwandte Anwendungsfälle

Probieren Sie es mit Ihrer eigenen Workload

HotKV spricht das Redis-Protokoll, sodass Sie einen bestehenden Client darauf richten und genau diese Befehle ausführen können.