Warum Redis für die Warteschlange?
Ich habe den Eindruck, dass Redis ein guter Kandidat für die Implementierung eines Warteschlangensystems sein kann. Bis zu diesem Zeitpunkt haben wir unsere MySQL-Datenbank mit Polling oder RabbitMQ verwendet. Mit RabbitMQ hatten wir viele Probleme - die Client-Bibliotheken sind sehr arm und fehlerhaft, und wir möchten nicht zu viele Entwicklerstunden in die Behebung dieser Probleme, ein paar Probleme mit der Serververwaltungskonsole usw. investieren Zumindest haben wir keine Zeit für Millisekunden oder sind nicht sehr leistungsintensiv. Solange ein System eine Architektur hat, die eine Warteschlange intelligent unterstützt, sind wir wahrscheinlich in guter Verfassung.
Okay, das ist der Hintergrund. Im Grunde habe ich ein sehr klassisches, einfaches Warteschlangenmodell - mehrere Produzenten, die Arbeit produzieren, und mehrere Verbraucher, die Arbeit verbrauchen, und sowohl Produzenten als auch Verbraucher müssen in der Lage sein, intelligent zu skalieren. Es stellt sich heraus, dass eine Naivität PUBSUB
nicht funktioniert, da ich nicht möchte, dass alle Abonnenten Arbeit verbrauchen. Ich möchte nur, dass ein Abonnent die Arbeit erhält. Auf den ersten Blick scheint es mir BRPOPLPUSH
ein intelligentes Design zu sein.
Können wir BRPOPLPUSH verwenden?
Das grundlegende Design mit BRPOPLPUSH
ist, dass Sie eine Arbeitswarteschlange und eine Fortschrittswarteschlange haben. Wenn ein Konsument Arbeit erhält, schiebt er das Objekt atomar in die Fortschrittswarteschlange und wenn er die Arbeit beendet, ist es LREM
es. Dies verhindert ein Blackholing der Arbeit, wenn Kunden sterben, und macht die Überwachung ziemlich mühelos. Beispielsweise können wir feststellen, ob es ein Problem gibt, das dazu führt, dass die Verbraucher für die Ausführung von Aufgaben viel Zeit in Anspruch nehmen.
Es sorgt dafür
- Arbeit wird an genau einen Verbraucher geliefert
- Die Arbeit wird in einer Status-Warteschlange abgelegt, sodass sie nicht als Konsument angesehen werden kann
Die Nachteile
- Mir kommt es ziemlich seltsam vor, dass das beste Design, das ich gefunden habe, nicht wirklich verwendet wird,
PUBSUB
da sich die meisten Blog-Posts über das Anstehen über Redis auf dieses Thema zu konzentrieren scheinen. Ich habe das Gefühl, etwas Offensichtliches zu vermissen. Der einzige Weg, den ich sehe,PUBSUB
ohne zweimal Aufgaben zu verbrauchen, besteht darin, einfach eine Benachrichtigung zu senden, dass Arbeit angekommen ist, die die Verbraucher dann nicht blockieren könnenRPOPLPUSH
. - Es ist unmöglich, mehr als ein Arbeitselement gleichzeitig anzufordern, was anscheinend ein Leistungsproblem darstellt. Für unsere Situation keine große, aber es ist ziemlich offensichtlich, dass diese Operation nicht für hohen Durchsatz oder diese Situation ausgelegt war
- Kurz gesagt: Vermisse ich etwas Dummes?
Füge außerdem den node.js-Tag hinzu, da dies die Sprache ist, mit der ich mich hauptsächlich beschäftige. Node bietet möglicherweise einige Vereinfachungen bei der Implementierung, da es sich um eine Single-Thread- und eine nicht blockierende Bibliothek handelt. Darüber hinaus verwende ich die Node-Redis-Bibliothek und die Lösungen sollten oder können auch auf ihre Stärken und Schwächen eingehen.