Wie kann eine Datenmenge zwischen mehreren Prozessen geteilt werden?

8

Wir müssen ein System einrichten, in dem mehrere Prozesse am selben Datensatz arbeiten. Die Idee besteht darin, eine Menge von Elementen zu haben (d. H. Keine wiederholten Werte), die von unseren Arbeitsprozessen (asynchron) gezogen werden können. Die Prozesse können auf mehreren Servern verteilt sein, daher benötigen wir eine verteilte Lösung.

Gegenwärtig ist das Muster, an das wir denken, Redis, um ein Set zu halten, das die Arbeitsdaten enthält. Jeder Prozess sollte eine Verbindung mit dem Set herstellen und einen Wert daraus abrufen. Die zufällige Funktionalität von spop ist eigentlich ein Plus für uns, da wir einen randomisierten Zugriff auf die Elemente in der Menge benötigen. Die Daten müssten aus unserer PostgreSQL-Hauptdatenbank stammen.

Wie gesagt, wir haben auch eine PostgreSQL-Datenbank zur Abfrage, auf die die Prozesse beim Anfordern von Elementen zugreifen können. Wir wissen jedoch nicht, ob unter schweren Lasten ein Engpass entstehen könnte. Wir erwarten einen schweren bis sehr schweren gleichzeitigen Zugriff (denken Sie an Hunderte oder sogar Tausende von Prozessen) an dieses Subsystem.

Falls dies relevant ist, verwenden wir Python mit rQ , um asynchrone Aufgaben (Jobs und Worker) zu behandeln.

Edit: In Bezug auf die Größe kann erwartet werden, dass die Elemente nicht sehr groß sind - die Top-Größe sollte ungefähr 500 - 1000 Bytes betragen. Sie sind im Grunde URLs, also sollten sie, wenn nicht etwas Seltsames passiert, weit unter dieser Größe liegen. Die Anzahl der Elemente hängt von der Anzahl der gleichzeitigen Prozesse ab, so dass wahrscheinlich etwa 10 bis 50 K Elemente ein guter Ballpark wären. Denken Sie daran, dass dies eher ein Staging-Bereich ist, daher sollte der Schwerpunkt eher auf Geschwindigkeit als auf Größe liegen.

Meine Fragen sind zusammengefasst:

  1. Ist eine Redis eine gute Idee für den gemeinsamen Zugriff bei Verwendung mehrerer Prozesse? Gibt es irgendwelche Daten, die uns wissen lassen, wie diese Lösung skalieren wird? Wenn ja, können Sie irgendwelche Hinweise oder Ratschläge geben?

  2. Was wäre beim Auffüllen der gemeinsamen Daten eine gute Update-Strategie?

Vielen Dank!

    
Juan Carlos Coto 31.12.2012, 17:46
quelle

1 Antwort

2

Keine vollständige Antwort, nur ein paar Gedanken: Wie gesagt, Redis behält Ihre Menge im Speicher. Um also 1 zu beantworten, müssen Sie über ein Worst-Case-Szenario nachdenken oder es zumindest abschätzen:

  • Wie viel Speicherplatz benötigen Sie für jedes Element der Gruppe?
  • wie viele (Quantität) Elemente sind eine sehr schwere Last

Sobald Sie eine Schätzung haben, können Sie berechnen und sehen, ob es sinnvoll ist, Redis zu verwenden:

Wenn Sie zum Beispiel Elemente von 100 Bytes haben und eine "sehr schwere" Last von 1.000.000 Elementen erwarten, werden Sie mindestens 100 MB Speicher für Redis benötigen und es ist machbar, es zu benutzen und sogar billig. Aber wenn Sie Benötigen Sie 500 Bytes pro Element und Ihre schwere Last bedeutet 30.000.000 Elemente, dann brauchen Sie 15 GB Speicher, und es ist sogar machbar, aber vielleicht zu teuer im Vergleich zu Ihrem Postgre dB, was zu der zweiten Schätzung führt, die Sie haben müssen:

  • Wie viele Anfragen / Sekunde (insgesamt) haben Sie gegen Ihren Redis / Postgre-Server oder wie viele Prozesse Sie erwarten, um Anfragen zu machen und wie viele / Sekunden jeder Prozess machen wird.

Anhand einiger Schätzungen können Sie entscheiden, welche Lösung für Ihre Anforderungen / Ihr Budget am besten geeignet ist.

    
Sergio Ayestarán 31.12.2012, 21:21
quelle