2010-11-21 11 views
1

Ich möchte eine Frage über Ansätze in Highload-Web-Anwendungen Entwicklung mit SQL-Datenbanken stellen. Angenommen, wir haben ein einfaches CMS-System, das Zugriff auf verschiedene Artikel bietet. Auch möchten wir Artikel Besuche Menge in der Datenbank speichern. Dieser Besucherzähler erhöht sich jedes Mal, wenn der Benutzer den Artikel ansieht.Highload Web-Projekte mit SQL-Datenbanken

In Bezug auf die SQL-Datenbank haben wir in der Tabelle "Artikel" ein Integer-Feld "visits", das wir jedes Mal erhöhen müssen, wenn der Benutzer den Artikel besucht. Wenn der Artikel eine große Anzahl gleichzeitiger Besuche aufweist, muss der Feldwert "Besuche" der aktuellen Datenbankzeile korrekt geändert werden.

Ich benutze pessimistischen Locking-Ansatz: "SELECT .. FOR UPDATE". Jedes Mal, wenn ein Benutzer einen Artikel besucht, sperre ich eine bestimmte Zeile in der Tabelle "Artikel" und erhöht den Zähler "Besuche".

Ist dieser Ansatz korrekt?

Ich benutze MySQL-Datenbank in meinen Projekten.

Antwort

2

Dieser Ansatz wird für Standorte mit mittlerer Auslastung verwendet, aber letztendlich werden Sie mit Sperrproblemen konfrontiert.

Auf einer Website mit sehr hoher Auslastung möchten Sie eine Nachrichtenwarteschlange implementieren und "besuchte" Ereignisse an die Warteschlange senden.

Ein Offline-Prozess würde die Warteschlange lesen und die Spalten entsprechend aktualisieren. Dies würde ermöglichen, dass nur ein einzelner Prozess jederzeit auf diese bestimmte Spalte zugreifen kann.

+0

Könnten Sie bitte Ihre Belastungsbereiche in Zahlen angeben? das wäre großartig, deins – benjamin

2

Ich würde definitiv nicht empfehlen, aggregierte Daten (wie "Anzahl der Besuche") in den Artikeldaten zu speichern, sondern eine separate Tabelle zu verwenden, in der Sie einen neuen Datensatz für jeden Besuch protokollieren. Speichern Sie dort den Zeitstempel, die Artikel-ID, die IP-Adresse und andere Daten. Das Grundprinzip dahinter ist, dass Sie den Datenbankeintrag für jeden Artikel nicht für jeden Besuch sperren müssen, was wahrscheinlich zu Sperrenproblemen führen würde.

Wenn Sie nun die Anzahl der Ansichten abrufen möchten, wählen Sie einfach in der Protokolltabelle aus. Für mittelgroße Websites, die "gut genug" sein sollten; Wenn die Last zunimmt, müssen Sie die Anzahl der Ansichten pro Artikel regelmäßig berechnen und die View-Zähler zwischenspeichern, um den Zugriff auf diese Daten zu beschleunigen.

+0

Wie FlySwat schrieb, könnte der Zugriff auf die Artikel auch protokolliert werden, indem man in eine Warteschlange schreibt und dann die Aktualisierungen stapelweise verarbeitet. Dies hat jedoch den Nachteil, dass Sie die Artikeltabellen aktualisieren müssen (und somit die Artikeldatensätze sperren müssen), wenn eine Ansicht auftritt. – mhanisch