(ASP.NET) Wie würden Sie gehen über eine Echtzeit-Zähler zu schaffen, die Datenbankänderungen verfolgt?

StackOverflow https://stackoverflow.com/questions/1072067

Frage

Hier ist das Problem.

Auf einer Seite, die ich vor kurzem über sie genommen haben Spuren „Meilen“ Sie an einem Tag lief. So kann ein Benutzer in die Website einzuloggen, hinzufügen, dass sie 5 Meilen liefen. Diese wird dann in die Datenbank.

Am Ende des Tages, um 01.00 Uhr, ein Dienst, der alle Meilen berechnet, alle Benutzer lief in den Tag und gibt eine Textdatei zu App_Data. Die Textdatei wird dann in Flash auf der Startseite angezeigt.

Ich denke, diese Art von lächerlich. Ich wurde gesagt, sie hat dies wegen der massiven Performance-Probleme zu tun. Sie werden mir nicht genau sagen, wie sie taten es vor oder was das große Performance-Problem war.

So wie würden Sie Jungs nehmen? Das erste, was mir in den Sinn kam, war ein Web-Service, der die Daten über einen AJAX-Aufruf wird. Vielleicht ist jedes Mal ein neuer „Meile“ Eintrag hinzugefügt wird ein Trigger ausgelöst und aktualisiert die „GlobalMiles“ Tabelle.

Ich würde schätzen, irgendwelche Informationen oder Tipps zu diesem Thema.

Vielen Dank!

War es hilfreich?

Lösung

Die Beantwortung dieser Frage ist ein bisschen schwierig, da wir nicht alle Ihre Anforderungen und etwas vorher nicht arbeiten. Also hier sind einige andere Ideen.

Als erstes überdenken Sie Ihre Annahmen. Erzeugen eines statischen Bericht einmal pro Tag eine absolut gültige Lösung, wenn alles was Sie brauchen täglich Berichte ist. Warum schlagen die Datenbank mehrmals throghout den Tag, wenn alles, was benötigt wird ist eine Momentaufnahme (zum Beispiel viele Blog-Software verwendet, um HTML-Dateien zu schreiben, wenn ein Blog wurde eher geschrieben als dazu dient, den Eintrag aus der Datenbank jedes Mal nach oben - viele noch tun als Optimierung). Ist die „Echtzeit“ -Funktion etwas, das Sie hinzufügen möchten?

Ich würde nicht sofort zu AJAX springen. Verwenden Sie die gleiche Eingabemethode, bewegen Sie einfach den Bericht von der statischen zur dynamischen. zu viel auf einmal zu tun, ist ein guter Weg, um sich selbst begraben. Wenn die vorhandenen Code ändern Ich versuche, Bereiche zu finden, die ich in Isolation wih den geringsten Auswirkungen auf den Rest der Anwendung ändern kann. Dann, wenn Sie den dynamischen Bericht haben, dann können Sie AJAX hinzufügen (und bitte benutzen progressive Erweiterung ).

Wie für den dynamischen Bericht selbst Sie haben ein paar Optionen.

Natürlich können Sie nur SUM SELECT (), aber es klingt wie das die Performance-Probleme verursachen würde, wenn jeder Benutzer eine große Anzahl von Einträgen hat.

Wenn Ihre Datenbank unterstützt, würde ich mit einem Blick indizierte Sicht (manchmal auch eine materialisierte Ansicht). Es sollte auf die Echtzeit-Summendaten ermöglicht eine schnelle Aktualisierungen unterstützen:

CREATE VIEW vw_Miles WITH SCHEMABINDING AS 
SELECT SUM([Count]) AS TotalMiles, 
COUNT_BIG(*) AS [EntryCount],
UserId
FROM Miles
GROUP BY UserID
GO
CREATE UNIQUE CLUSTERED INDEX ix_Miles ON vw_Miles(UserId)

Wenn der Aufwand für das zu viel ist, Lösung des @ jn29098 ist eine einmal gut. Aufrollen eine geplante Aufgabe verwenden. Wenn es eine Menge von Einträgen für jeden Benutzer ist, können Sie nur das Delta vom letzten Mal, fügen Sie die Aufgabe ausgeführt wurde.

UPDATE GlobalMiles SET [TotalMiles] = [TotalMiles] + 
  (SELECT SUM([Count]) 
    FROM Miles 
    WHERE UserId = @id 
      AND EntryDate > @lastTaskRun
    GROUP BY UserId)
WHERE UserId = @id

Wenn Sie nicht über die Speicherung der einzelnen Einträge kümmern, sondern nur die Summe kann man die Zählung im laufenden Betrieb aktualisiert werden:

UPDATE Miles SET [Count] = [Count] + @newCount WHERE UserId = @id

Sie können diese Methode in Verbindung mit dem SPROC verwenden, die den Eintritt und haben beide Welten ergänzt.

Schließlich Ihre Trigger-Methode würde auch funktionieren. Es ist eine Alternative zu der indizierten Sicht, wo Sie das Update tun, um sie auf einem Tisch instad von SQL automatisch tun. Es ist auch ähnlich wie die vorherige Option, wo Sie die globale Aktualisierung aus dem sproc und in einen Abzug zu bewegen.

Die letzten drei Optionen machen es schwieriger, die Situation zu handhaben, wenn ein Eintrag entfernt wird, aber wenn das nicht ein Merkmal der Anwendung ist, dann müssen Sie möglicherweise nicht darüber Sorgen zu machen.

Nun, da Sie haben materialisieren, Echtzeit-Daten in Ihrer Datenbank können Sie jetzt dynamisch Ihren Bericht generieren. Dann können Sie Lust mit AJAX hinzuzufügen.

Andere Tipps

Wenn sie wirklich Performance-Probleme aufgrund haben, werden zu viele Zugriffe auf die Datenbank dann schlage ich vor, dass Sie alle die Eingabe nehmen und stopfen sie in eine Message Queue (MSMQ). Dann können Sie einen Dienst am anderen Ende haben, das die Nachrichten aufnimmt und macht einen Masseneinsatz der Daten. Auf diese Weise können weniger db Treffer haben. Dann können Sie die Ausgabe in der Textdatei auf dem Update auch.

würde ich eine Übersichtstabelle erstellen, die auf einmal / Stunde oder jede Nacht gerollt ist, die Gesamt Meilen laufen berechnet. Für individuelle Anfragen konnten Sie von der nächtlichen Übersichtstabelle sowie zusätzliche protokollierten Meilen für den Zeitraum zwischen der letzten Rollup Berechnung ziehen, und wenn der Benutzer zeigt die Seite die Summe für den Benutzer zu erhalten.

Wie viele Benutzer reden Sie und wie viele Protokolldatensätze pro Tag?

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