2016-07-23 6 views
0

Unser System verfügt über Jobs, die Eingabewarteschlangen enthalten, die IDs von Elementen enthalten, die als Eingabe für die Jobs verwendet werden müssen. Es gibt einige tausend dieser Eingangswarteschlangen und jede Warteschlange enthält einige Zehntausende bis zu einigen Millionen IDs. Ein Job nimmt normalerweise einen Stapel von IDs aus einer Warteschlange (etwa 20.000) und erledigt seine Aufgabe. Auf der anderen Seite habe ich einige Produzenten, die IDs in die Warteschlangen schieben. Diese arbeiten auch in Stapeln, daher fügen wir oft ein paar Tausend bis zu ein paar Millionen IDs gleichzeitig in die Warteschlange ein.Beste Art, große "Arbeitswarteschlangen"/"Eingabewarteschlangen" zu verwalten?

Wir haben keine Messaging-Systeme wie Rabbit verwendet, da unsere Hersteller oft Duplikate in die Warteschlange schieben - daher ist es für uns vorzuziehen, eine festgelegte Logik zu verwenden. Darüber hinaus erhalten unsere Jobs eine Benachrichtigung, sobald sie in die Warteschlange gestellt werden - es ist also nicht notwendig, sie zu abonnieren.

Der Inhalt der Warteschlange ist temporär und Daten können im Falle eines Fehlers verloren gehen.

Kann jemand empfehlen, wie man dieses Problem am besten löst?

Wir verwenden derzeit eine RDBMS-Tabelle, in der die ID der Primärschlüssel ist und es eine zweite Spalte gibt, die die Warteschlange identifiziert. Einfügungen werden mit einer ON DUPLICATE KEY UPDATE-Syntax durchgeführt, sodass wir alles in einer einzigen Batch-Anweisung ausführen können. Nachteil ist die hohe IO-Last. Vorteil ist, dass wir leicht in den Inhalt der Warteschlange schauen können und sehr leicht manuelle Aktionen (Masseneinfügungen, Löschungen usw.) durchführen können, falls wir manuell intervenieren müssen.

Ich frage mich, ob Redis eine Wahl für uns sein könnte (mit Sets?) - Was ist mit Speicherlimits? Funktioniert es, wenn es an die Festplatte gebunden ist? Was passiert, wenn wir "Zeug" von der Set/Queue "nehmen" wollen (& entfernen)? Führt es eine große Last in Bezug auf IO aus?

Jeder Eingang, egal über die Technologie (wir verwenden JVM-basierte Sprachen) oder Datenbank, ist willkommen!

Antwort

0

Wenn Sie nur IDs speichern, dann redis und sein Set ist ein perfektes Werkzeug für den Job. Es behandelt die Einzigartigkeit, hat nicht diese langsame SQL-Teil, SPOP kann mehrere Elemente gleichzeitig (zufällig ausgewählt, obwohl).

Allerdings funktioniert es nicht sehr gut, wenn die Datenmenge den verfügbaren RAM übersteigt, also sollten Sie das berücksichtigen (nur genug RAM bekommen). Auf der positiven Seite, keine I/O bei jeder Transaktion! :)

Es gibt ein paar Tausend dieser Eingangswarteschlangen und jede Warteschlange enthält von einigen zehntausend bis zu einigen Millionen ids

auf einer Größe der ids Je, dieser Datensatz könnte problematisch sein, um auf eine einzige Maschine zu passen. Da Sie immer nur eine Warteschlange gleichzeitig verwenden (richtig?), Können Sie den Redis-Cluster sicher bereitstellen, wodurch die Datenmenge auf mehrere Computer verteilt wird.

+0

wird der Redis-Shard vollautomatisch oder muss ich darauf achten, dass nicht zu viele große Warteschlangen auf einer einzelnen Maschine platziert werden - und somit den verfügbaren RAM überschreiten? Ich könnte das tatsächlich tun, indem ich eine benutzerdefinierte Sharding-Funktion zur Verfügung stelle, da ich eine gute Schätzung jeder Warteschlangengröße habe. –

Verwandte Themen