Die Firma, für die ich arbeite, erstellt Anwendungen für die Blackberry-Plattform.Der beste Weg, ein skalierbares Hits/Analytics-System zu entwickeln?
Wir haben an einem proprietären "Analysesystem" gearbeitet, das es uns ermöglicht, Code in unsere Anwendungen einzubetten und die Anwendungen jedes Mal, wenn sie laufen, Statistiken auf unseren zentralen Servern zu melden. Derzeit funktioniert das System einwandfrei. Aber es ist nur in der Beta mit 100-200 Treffern pro Stunde. Die "Treffer" werden problemlos an die Server gesendet. Wir haben eine sehr solide API entwickelt, um die Akzeptanz und Speicherung der Treffer (in einer MySQL DB) zu handhaben. Wir haben die Last getestet und wir sollten in der Lage sein, Hunderttausende von Treffern pro Stunde ohne Probleme zu bewältigen. Das ist nicht wirklich ein Problem.
Das Problem zeigt die Statistik. Wir haben ein Display ähnlich Mint's (haveamint.com) gebaut, es zeigt die Hits über jede Stunde, die letzten Tage, Monate, Wochen, Jahre ... usw. Die erste Version führte gerade Abfragen durch, indem sie Daten aus der Treffertabelle extrahierte und sie im Hintergrund interpretierte. Das hat nicht lange funktioniert. Unsere aktuelle Lösung ist, dass die Treffer für die Verarbeitung "in die Warteschlange gestellt" werden und wir alle 5 Minuten einen Cron bekommen, der die Treffer nimmt und sie in "Caches" für jede Stunde, jeden Tag, jede Woche, jeden Monats, jedes Jahres sortiert. Dies funktioniert erstaunlich und es ist unglaublich skalierbar; Es funktioniert jedoch nur für 1 Zeitzone. Da das gesamte Unternehmen darauf zugreifen kann, haben wir es mit einigen hundert Benutzern in verschiedenen Zeitzonen zu tun. Was ich in San Jose als "Heute" definiere, ist VIEL anders als das, was mein Kollege in London als Heute definiert. Da die aktuelle Lösung nur in einer Zeitzone zwischengespeichert wird, ist dies ein Albtraum für jeden, der die Daten außerhalb unserer Zeitzone überprüft.
Unser aktueller Plan, dies zu beheben, ist das Erstellen von Caches für jede Zeitzone (40 insgesamt); das würde aber bedeuten, dass wir die Datenmenge mit 40 multiplizieren ... das ist schrecklich für mich, und da die Caches sehr groß sein können, ist es einfach eine schlechte Idee zu multiplizieren; Wenn wir die Warteschlange bearbeiten, wird es viel mehr CPU-Zeit benötigen, um sie in 40 verschiedene Caches zu laden.
Jeder andere hat eine bessere Idee, wie man dieses Problem lösen kann?
(Sorry für eine so lange question..it ist nicht ganz einfach zu erklären. Dank all!)
So spezifisch wie Ihre Frage ist, ich entwerfe tatsächlich etwas sehr ähnliches und würde hier für die Eingabe kommen. +1 –
Es wäre sehr interessant zu sehen, Ihre Hit-Handling/Speichern API :) – Jacco