2016-07-13 7 views
0

http://redis.io/commands/rpoplpushredis zuverlässige Warteschlange Muster

„RPOPLPUSH (oder BRPOPLPUSH für die blockierende Variante) bietet eine Möglichkeit, dieses Problem zu vermeiden:. Die Verbraucher die Nachricht abruft und gleichzeitig schiebt sie in eine Abarbeitungsliste Es wird verwenden den LREM-Befehl, um die Nachricht aus der Verarbeitungsliste zu entfernen, sobald die Nachricht verarbeitet wurde. "

Dieses zuverlässige Warteschlangenmuster wird empfohlen. Der Schlüssel hier ist das Entfernen von Elementen aus der Warteschlange, wenn der Prozess nicht beendet wird. Aber meine größte Verwirrung ist, warum Verarbeitungswarteschlange hier benötigt wird? Das gleiche Ziel könnte erreicht werden, indem nur eine Warteschlange beibehalten wird.

Antwort

1

Das Problem tritt auf, wenn mehr als ein Task auf die Warteschlange zugreift, was wahrscheinlich der Fall ist. Wenn Sie es in der Warteschlange belassen, riskieren Sie eine andere Aufgabe, es abzuholen und die Nachricht zu duplizieren. Um dies zu lösen und Zuverlässigkeit zu haben, verwenden Sie RPOPLPUSH. Dadurch wird die Nachricht aus der Hauptwarteschlange entfernt, in eine sekundäre Warteschlange verschoben und der Task die Nachricht gegeben, die Aufgabe auszuführen. Jetzt kann eine sekundäre Aufgabe mitkommen und auf die Hauptwarteschlange zugreifen, ohne sich um die Duplizierung kümmern zu müssen.

Schließlich, wenn die erste Aufgabe abgeschlossen ist, kann LREM und entfernen Sie die Nachricht aus der Verarbeitungswarteschlange und damit seinen Job abgeschlossen. Dieser Prozess wird von jeder Task wiederholt und Sie können eine einzelne Verarbeitungswarteschlange für alle Tasks oder eine separate Verarbeitungswarteschlange für jede Task implementieren. Dies hängt von Ihrem Anwendungsfall ab.

Verwandte Themen