Toprica: PostgreSQL: Auktionsskript mit Countdown - DB-Architektur

Beitrag lesen

Guten Abend!

Ich möchte den weisen Rat der Community einholen.

Vorerst das Grobe:
Server Apache 2.2.x
PHP 5.3.2
PostgreSQL 8.4

Auf einer Seite können Leute Coins kaufen.
Es werden verschiedene Produkte reingesetzt.
Jedes Produkt hat einen Countdown X Min und einen Startpreis von 0 Coins.
Die Leute setzen Coins und müssen am Ende die Anzahl der Coins noch einmal bezahlen und bekommen dafür das Produkt. Sie sparen dabei im Durchschnitt 40% des Preises.
Immer wenn ein Coin(bei Klick auf "bieten") gesetzt wird, erhöht sich der Countdown wieder um Y Sekunden und der Cointcounter um 1.
Wenn es zum Ende der Auktion kommt, dann passiert es ganz schnell das auf die selbe Datenbank und den selben Datensatz 100 mal pro Sekunde zugegriffen wird. Das Ganze läuft btw über Ajax so das die Leute schnell mal in ein Klickfieber kommen wenn es zum Ende zugeht.
Die Auktionen stürzen dann ab.
Das System ist also sehr schlecht geschrieben (nicht von mir, sehr groß und ca 1000 Dateien in prozedual geschriebenen PHP 4) und ich würde es gerne neu schreiben.

Wie würdet ihr daran gehen? Ich mache mir natürlich einige Gedanken da der Kunde stark PR machen möchte und die Belastung für den Server, speziell für die Datenbank, sehr sehr hoch werden.

Wie lasse ich die Zeit bei jedem gleich ablaufen?

Wie sollte die Tabelle eurer Meinung nach aussehen?

Wo ein Index gesetzt werden?

Sollte das erhöhen als Stored Procedure gespeichert werden?

Sollte man die Tabelle für jedes erhöhen nur für diesen Aufruf schließen und wieder öffnen?

Wie kann das ganze hunderte Schreib-Zugriffe in der Sekunde aushalten?

Mein Vorschlag:
auctionid endtime   coincounter lastcoinfrom
int       timestamp int         int

Primarykey auf auctionid.

Das Erhöhen wird als Stored-Procedure(SP) gespeichert.

Bei klick auf "Bieten", wird direkt ein Skript aufgerufen welches die SP aufruft.

Bei Timestmap bin ich mir btw. unsicher ob das die richtige Wahl ist.
Ich würde wenn man auf die Seite geht, die Zeit aus der Tabelle holen, die Differenz mit dem jetzigen Timestamp per JS ablaufen lassen. Bei jedem "Biete", bzw Aufruf der SP wird gecheckt ob die Zeit > der "endtime" ist. Wenn nicht, geht es nicht und die Auktion wird abgebrochen, falls doch, wird erhöht.

Mir machen vor allem die vielen Zugriffe Sorgen.

Habt ihr noch mehr Ideen?
Vielleicht auch ein paar Anregungen worauf in diesem Fall bei der KOnfiguration der DB geachtet werden sollte.

Beste Grüße,
Toprica