Frage

Das Unternehmen für die ich arbeite erstellt Anwendungen für die Blackberry-Plattform.

Wir haben auf einem proprietären „Analysesystem“ arbeiten, die uns Code innerhalb unserer Anwendungen einbetten können und haben die Anwendungen einige Statistiken zu unseren zentralen Servern berichten jedes Mal, sie laufen. Derzeit arbeitet das System in Ordnung; aber es ist nur in der Betaphase mit 100-200 Hits pro Stunde. Die „Hits“ sind, ohne ein Problem mit den Servern gesendet. Wir haben eine sehr solide API gebaut, um die Akzeptanz und die Speicherung der Hits (in einer MySQL-DB) zu behandeln. Wir haben die Last getestet und wir sollten ohne Probleme pro Stunde Hunderttausende von Treffern der Lage sein, gerecht zu werden. Das ist nicht wirklich ein Problem.

Das Problem der Statistiken zeigt. Wir haben eine Anzeigetafel ähnlich wie Mint gebaut (haveamint.com), es zeigt die Treffer über jede Stunde, die letzten Tage, Monate, Wochen, Jahre ... etc. Die erste Version lief gerade Abfragen von Daten aus dem Hits Tabelle ziehen und es auf die Schnelle zu interpretieren. Das ist nicht für sehr lange arbeiten. Unsere aktuelle Lösung ist, dass die Hits „Warteschlange“ für die Verarbeitung und wir haben einen cron alle 5 Minuten kommen durch die Hits zu nehmen und sie in den „Caches“ für jede Stunde sortieren, Tag, Woche, Monat, Jahr ... etc. Das funktioniert erstaunlich, und es ist unglaublich skalierbar; aber es funktioniert nur für 1 Zeitzone. Da das gesamte Unternehmen den Zugang zu dieser hat, sind wir mit ein paar hundert Benutzer in verschiedenen Zeitzonen zu tun. Was ich als „Heute“ in San Jose definieren ist viel anders als das, was mein Kollege in London definiert als heute. Da die aktuelle Lösung nur auf 1 Zeitzone zwischengespeichert ist, es ist ein Alptraum für jeden, der die Daten außerhalb unserer Zeitzone ist zu überprüfen.

Unser aktueller Plan, dies zu beheben ist Caches für jede Zeitzone (40 insgesamt) zu schaffen; aber das würde bedeuten, dass wir die Menge an Daten, die von 40 sind die Multiplikation ... das ist schrecklich zu mir und da die Caches sehr groß sein kann, multipliziert es klingt wie eine schlechte Idee; plus, wenn wir gehen, um die Warteschlange zu verarbeiten, es wird viel mehr CPU-Zeit in Anspruch nehmen, sie in 40 verschiedenen Caches zu setzen.

Jeder sonst eine bessere Vorstellung davon, wie dieses Problem zu lösen?

(Sorry für eine so lange question..it ist nicht ganz einfach zu erklären. Dank all!)

War es hilfreich?

Lösung

Die Lösung, die Sie vorschlagen, hat zu viel Redundanz. Ich würde vorschlagen, Sie speichern die Daten in mindestens 30-Minuten-Eimern statt stündlich und die Zeitzone UTC normalisiert werden.

Mit 30-Minuten-Eimer, wenn ein Benutzer stündliche Daten anfordert für 1 - 02.00 von -4,5 UTC Sie Daten für 05.30 holen können - 06.30 von Ihrem System und zeigen. Wenn Sie Daten speichern, in Schritten von einer Stunde kann man nicht mit N + 0,5 Stunden Unterschieden in den Zeitzonen Anfragen an Anwender bedienen.

Für die täglichen Zahlen würden Sie 48 halbe Stunde Slots aggregieren müssen. Die Schlitze würde holen durch die Benutzerzeitzone bestimmt werden.

Es wird interessant, wenn man zu dem jährlichen Daten erhalten, weil Sie am Ende mit 17.520 halber Stunde Eimer aggregieren. Um diese Berechnung zu erleichtern würde ich vorschlagen, dass Sie die voraggregierten Jahresdaten pro UTC-Zeit erhalten und die subtrahieren aggregierten Daten für die ersten 4,5 Stunden des Jahres und fügen aggregierten Daten für die ersten 4,5 Stunden des nächsten Jahres. Hierdurch werden im Wesentlichen das ganze Jahr um 4,5 Stunden und die Arbeit ist nicht so viel. Arbeiten von hier aus können Sie das System weiter optimieren.

EDIT:. Es stellte sich heraus Kathmandu ist 5,45 GMT, so dass Sie die Daten in 15-Minuten-Eimer statt 30-Minuten-Eimer speichern müssten

EDIT 2: Eine weitere einfache Verbesserung um sich jährliche aggregieren so nicht 17.520 Eimer jedes Mal hinzufügen Sie müssen und ohne jedes Land ein Aggregat benötigt wird. Aggregieren die jährlichen Daten von Jan 02 - Dezember 30. Da die maximale Zeitzonendifferenz zwischen zwei beliebigen Ländern 23 Stunden ist, bedeutet dies, dass Sie die jährlichen Daten nehmen können (Jan 02 - Dezember 30) und fügen Sie ein paar Eimer vor und nach wie angemessen. Zum Beispiel für eine -5 UTC-Zeitzone würde hinzufügen Sie alle Eimer auf 1. Januar nach 0500, alle Eimer am 31. Dezember und am 1. Januar des folgenden Jahres bis zu 0500 Stunden.

Andere Tipps

Wenn Software entwerfen, die mehrere Zeitzonen berührt, würde ich sagen, immer speichern Sie das Datum / Zeit in UTC mit einem anderen Feld für die ursprüngliche Zeitzone und haben eine Funktion, die die Zeit in Anspruch nimmt und wandelt sie in und aus UTC / Zeitzone. Sie werden ihnen eine Menge Ärger sparen die verschiedenen Fälle von Tag-Schalter, Sommer, Menschen auf Statistiken aus einem Land, von der anderen Seite der Erde und so weiter ....

Suche zu handhaben

In Ihrem Fall die Caches in UTC mit und Anpassung nur die Anforderungen in UTC konvertiert werden soll helfen. Verwenden Sie keine stat speichern als „heute“ zu sein, sollte sie für Stunden 00: 00: 00UTC bis 23: 59:. 59UTC und wenn jemand für die Statistik für heute in New York fragt, tun die Umwandlung

Soweit ich sehen kann, Sie für den Speicherteil eines Data-Warehouse-Systems suchen hier (Ihre Berichte würden das Front-End sein).

Eigentlich ist die Art und Weise kommerzielle Systeme es tun, ist die Cache Du beschrieben: Ihre Tabellen Preaggregate und Caches von ihnen erstellen. Der einzige Weg, um Ihre Anfragen zu beschleunigen, um das Datenbanksystem für sie weniger tun zu machen. Dies bedeutet, dass weniger Daten, was wiederum bedeutet weniger Zeitaufwand in den Daten oder weniger Daten in dem Indizes laufen.

Das heißt, würde ich entweder die „40-Cache-Lösung“ vorschlagen (gibt es wirklich mehr als 24 Zeitzonen). Sie sollten trivialer der Lage sein, die Sortierwarteschlange parallelisieren von Kopien der Daten zu erstellen.

Eine andere Möglichkeit, dies zu tun, wäre bei der Stunde Granularität zwischenzuspeichern und aggregieren dann die Stunden in Tage (oder 30 Minuten, wenn Sie Ihre Zeitzonen dies erfordern). Dies bedeutet, dass Sie mit einer feineren Granularität als Ihre tägliche Cache Cache, aber bei einer gröberen Körnung als die Originaldaten.

Diese Art von Daten in der Regel gespeichert Round-Robin-oder Kreis Datenbanken. überprüfen Sie diese http://www.shinguz.ch/MySQL/mysql_20070223.html und diese http: //techblog.tilllate. com / 2008/06/22 / Round-Robin-Daten-Storage-in-mysql / wissen, wie sie funktionieren und wie sie unter MySQL implementieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top