2016-08-19 20 views
1

Es wird eine REST-API geben, die Daten von mobilen Geräten sammelt. Jedes mobile Gerät speichert Daten (bis zu einem gewissen Grad), bevor sie an die API gesendet werden. So sendet beispielsweise jedes mobile Gerät alle 4 Minuten 50 Datenzeilen an die API. Eine Zeile sieht wie folgt aus:Datenbank (en)/Tools für viele parallele Masseneinfügungen

{"uid": "123", "lon": "12.1", "lat": "12.1", "vel": "145", "timestamp": "12345"} 

So zum Beispiel, wenn es wird 1000 aktive Geräte dann könnte es (worst case) passieren, dass es 1000 parallel schreibt und jeder Schreib fügt 50 „Reihen“. In der Tat wird API in einem Moment versuchen, 50k Zeilen in die Datenbank einzufügen. Darüber hinaus, wenn jedes der Geräte Daten 2 Stunden pro Tag sendet, dann wird es jeden Tag 1 500 000 (1,5 Millionen) neue Zeilen geben.

Später werden alle gesammelten Daten an einen anderen Dienst gesendet, in größeren Blöcken (von einem Arbeiter, der darauf wartet, dass X-Zeilen in der Datenbank erscheinen und er sie an den externen Dienst sendet). Alle Zeilen, die älter als 7 Tage sind, werden möglicherweise gelöscht. Auch einer der API-Endpunkte ermöglicht das Abrufen von Daten für einen der letzten 7 Tage, basierend auf den Feldern "uid" (user_id) und "timestamp".

Die Frage ist, welche Datenbank (oder Kombination von Datenbanken/Tools) zu viele Schreibvorgänge/Sekunde verarbeiten soll?

Meine erste Idee war es, DynamoDB zu verwenden, da es super leicht skalierbar ist (ich kann nur Schreibvorgänge/Sek. Kaufen), aber es ist unmöglich für 50k Schreibvorgänge in einem Moment. Also meine zweite Idee war, eine Zwischendatenbank (en) zu verwenden, um Blöcke von 50 Zeilen zu cachen, die von einem Hintergrund-Worker/-Prozess mit einer begrenzten Anzahl verarbeiteter Chunks in demselben Moment in die primäre db eingefügt werden.

Ich glaube, heute gibt es viele Apps, die viele Daten von mobilen Geräten sammeln (wie GPS-Position, Geschwindigkeit, etc) - wie machen sie das?

Ich frage nicht auf DBA, weil es nicht nur datenbankspezifische Frage sein könnte.

Antwort

1

Ich habe gerade 1,5 Millionen Zeilen in eine vollständig indizierte Tabelle eingefügt. Ich benutzte einen einzigen Thread, PostgreSQL-Datenbank, lief auf meinem Notebook. Die ganze Sache dauerte 45,1 Sekunden.

Wenn das alles Ihre täglichen Daten sind, nicht einmal ein Rad zu erfinden. Holen Sie sich PostgreSQL und einen Multicore-Server.

Verwandte Themen