AJAX - Polling

cd_brenner

Aktives Mitglied
Hallo Community,

ich arbeite gerade an einer Community-CMS Software in PHP.

neox.ws

"Live" Content wird über die Neox-Alive-API im XML Format ausgeliefert und über JQuery eingebunden. Dieses XML Dokument enthält Daten wie Updates, Chat-Nachrichten etc. Um jetzt den Inhalt halbwegs aktuell zu halten müsste ich ihn pro Sekunde 1x aktualisieren. Bei einigen wenigen Usern sollte dies noch - performancetechnisch - kein Problem darstellen.
Was passiert aber bei 100 und mehr Benutzern, die gleichzeitig versorgt werden müssen?

Mein Ansatz:
Die JavaScript Routinen sind so ausgelegt, dass sie die Refresh-Zeit (zb. 1000ms) über die Alive-API vom Server erhalten. Somit steuert ein PHP Skript die Last und bremst, wenn sie zu hoch wird.
Rechnerisch halbiert sich die Last mit jeder Sekunde die ich an Aktualität opfere, oder?

Weiters würde mich interessieren wieviel Last (KB oder Requests??) man einem myHomePlus bzw. ManagedHosting Pro Paket von domainfactory zumuten kann.

Danke im voraus & LG aus Graz,
Neo
 
QUOTE (cd_brenner @ So 8.04.2012, 23:36) Um jetzt den Inhalt halbwegs aktuell zu halten müsste ich ihn pro Sekunde 1x aktualisieren.


Weiters würde mich interessieren wieviel Last (KB oder Requests??) man einem myHomePlus bzw. ManagedHosting Pro Paket von domainfactory zumuten kann.

Es geht doch um irgendwelche INfos die der User dann zu sehen bekommt

Die Restlaufzeit von ebay ist Sekudne, OK
aber z.B. ne Twitter TAG-Übersichttttttttttt die akuallisiert doch auch nicht Sekündlich, da hätte "Mensch" ja garkeien Chance zu lesen = die aktualität wäre fürn Mülleimer wegen DataOVERLOAD


Wieviel verkraftet der Server?

mach dir nen Logbuch mit Zeitmessung, wie lange die Requests laufen
bzw lese die Apachlogs aus (das machen Profis ... ich hab das noch nie gemacht)

Ich hab da verschiedene Dinge wo ich Daten via POST von einem System zum Anderen "bombe"
das sind schonal einige Requests in schnelelr Folge .... ob jetzt Dutzend oder Hunderte ... kann ich nicht sagen
Entscheidenter Unterschied zu Dir wäre aber
Bei mir = 1 Sender und 1 Empfänger
Bei Dir = X Sender und 1 Verarbeiter = die X Sender blockieren sich gegenseitig bei der SQL ..... da müßtest drauf achten das die SQL "nur lesen" geöffnet wird, dann blockieren sich meherer requests nich weil die Blockaden verhindern sollen das man "falsche" Daten bekommt weil Jemand gerade versucht ein UPDATE zu machen
 
QUOTE

Die Restlaufzeit von ebay ist Sekudne, OK
aber z.B. ne Twitter TAG-Übersichttttttttttt die akuallisiert doch auch nicht Sekündlich, da hätte "Mensch" ja garkeien Chance zu lesen = die aktualität wäre fürn Mülleimer wegen DataOVERLOAD




Es geht da eher mehr um Dinge wie "die aktuellste Chatnachricht im Menü anzeigen". Ich möchte eigentlich nur die Latenzzeit recht gering halten. Also im Bereich von 1 - 3 sec. Erst wenn mehr angemeldete Benutzer versorgt werden müssen steigt die Latenzzeit an, wodurch die Last sinkt.



QUOTE Bei Dir = X Sender und 1 Verarbeiter = die X Sender blockieren sich gegenseitig bei der SQL ..... da müßtest drauf achten das die SQL "nur lesen" geöffnet wird, dann blockieren sich meherer requests nich weil die Blockaden verhindern sollen das man "falsche" Daten bekommt weil Jemand gerade versucht ein UPDATE zu machen


Ist ein System wie MySQL nicht darauf ausgelegt mit recht vielen INSERTs, DELETEs, UPDATEs und SELECTs umzugehen?

Viele Grüße,
Neo
 
QUOTE (cd_brenner @ Mo 9.04.2012, 02:59)Ist ein System wie MySQL nicht darauf ausgelegt mit recht vielen INSERTs, DELETEs, UPDATEs und SELECTs umzugehen?

ich hab da mal beim stöbern im SQL-Handbuch dev.sql.com?

google.de/search?hl=de&q=sql+handbuch
dev.mysql.com/doc/refman/5.1/de/index.html

da hab ich mal was gelesen von dieser Sperre und das man SQL so öffnen kann das eben keine Sperre kommt


siehe "fopen"-Befehl .... mit "Sperre" via flock
http://www.php.net/manual/de/function.fopen.php
http://www.php.net/manual/de/function.flock.php


mein erster COunter war nur eine /counter.txt
via fopen
+ fread
+ $count++
+ fwrite
+ flose

irendwann kammen dann mal 2 Besucher in der selben 10tel Sekunde und der Zählerstand wurde zerhakt nachdem das, nach Wochen nochmal passiert ist .... 3 oder 4 mal .... hab ich diesen flock reingenommen

fopen
+ flock
+ fread
+ $count++
+ fwrite
+ f(un)lock
+ flose

Wenn man das ganz am Anfang (oder Ende) macht, dann geht es um eine 10tel (oder 1000tel) Sekunde macht man erst den fread und macht dann das ganze WebsiteDingens und ganz zum schluß erst den fwrite+flose und die Website braucht vielleicht 20 Sekunden, dann wartet der 2.Besucher keine 10tel Sekunde sondern 20Sekunden

in PHP muß man die SPerre extra "einschalten"
in SQL ist die Sperre der Normalfall, man muß also "ohne Sperre" extra einschalten


Software ist Dumm
Software weiss nicht ob Sie auf ein eventuelles UPDATE warten soll
zB.
Parkhausschalter (EIngangsschranke)
da stehen 5 in der Warteschlange stecken nacheinander ihre Karte in die Schranke und, angenommen der Zähler ist in einer Stadt viele Kilometer weit weg und die Verarbeitung braucht 5 Minuten innerhalb der 5 Minuten könnten die anderen 4 Autos reinfahren ....
... und dann meldet ein UPDATE "Parkhaus voll, die 4 dürfen icht rein"
hier muß die Schranke blockiert werden, damit die 4 nicht rein kommen wenn keine Parklätze mehr frei wären
(OK, die Schranke könnte auch eine Hilfsvariable haben und selbst "wissen" wieviele Parkplätze noch frei sind ..... )


QUOTE (cd_brenner @ Mo 9.04.2012, 02:59)Ist ein System wie MySQL nicht darauf ausgelegt mit recht vielen INSERTs, DELETEs, UPDATEs und SELECTs umzugehen?

Anderer Blickwinkel

Wir aberbeiten alle mit "normalem"(=einfachem) Transaktionsprotokol
=
UPDATE komt und wird durchgeführt
=
Da ist ein Befehlssender und ein Empfänger ......
... Sender sendet (und Empfänger macht dann quasie Feierabend) und Empfänger enpfängt und führt aus

Bei einer irokontoÜberweisung (doppeltes Transaktionsprotokol)
Sender Sendet
Empfänger enpfängt und führt aus ++++ sendet dem Sender das Befehl angekommen ist und ausgeführt wurde



ähm
beim EInfachen ist glaub schon die Rückmeldung das Befehl angekommen ist und beim doppelten wird zusätzlich nochmal vom ursprünglischen Sender bestätigt das die Bestätigung angekommen ist


=
Einfach
A 2 B .... Befehl
B 2 A .... Befehl angekommen

doppeltes Protokol
A 2 B .... Befehl
B 2 A .... Befehl angekommen
A 2 B .... OK, dann kann ich den Befehl als erledingt markieren (ähm, "dann können wir den Befehl als erledigt markieren)

ich frag mich ... was ist wenn "A 2 B .... OK, dann" von A gesendet aber von B nicht enpfangen wurde ....???? würde wahrscheinlich dazu führen das das Geld jetzt "unsichtbar" auf Konto B liegt, der Transfer ist ja abgeschlosen zumindest ist es ordnungsgemäß von Konto A verschwunden
 
QUOTE
ich frag mich ... was ist wenn "A 2 B .... OK, dann" von A gesendet aber von B nicht enpfangen wurde ....???? würde wahrscheinlich dazu führen das das Geld jetzt "unsichtbar" auf Konto B liegt, der Transfer ist ja abgeschlosen zumindest ist es ordnungsgemäß von Konto A verschwunden


dafür gibt es ja sequenznummern für die nachrichten
 
ad 800XE:

Leider verstehe ich noch nicht ganz, was du mir sagen willst.

QUOTE ich hab da mal beim stöbern im SQL-Handbuch dev.sql.com?

google.de/search?hl=de&q=sql+handbuch
dev.mysql.com/doc/refman/5.1/de/index.html

da hab ich mal was gelesen von dieser Sperre und das man SQL so öffnen kann das eben keine Sperre kommt


siehe "fopen"-Befehl .... mit "Sperre" via flock
http://www.php.net/manual/de/function.fopen.php
http://www.php.net/manual/de/function.flock.php


mein erster COunter war nur eine /counter.txt
via fopen
+ fread
+ $count++
+ fwrite
+ flose

irendwann kammen dann mal 2 Besucher in der selben 10tel Sekunde und der Zählerstand wurde zerhakt nachdem das, nach Wochen nochmal passiert ist .... 3 oder 4 mal .... hab ich diesen flock reingenommen

fopen
+ flock
+ fread
+ $count++
+ fwrite
+ f(un)lock
+ flose

Wenn man das ganz am Anfang (oder Ende) macht, dann geht es um eine 10tel (oder 1000tel) Sekunde macht man erst den fread und macht dann das ganze WebsiteDingens und ganz zum schluß erst den fwrite+flose und die Website braucht vielleicht 20 Sekunden, dann wartet der 2.Besucher keine 10tel Sekunde sondern 20Sekunden

in PHP muß man die SPerre extra "einschalten"
in SQL ist die Sperre der Normalfall, man muß also "ohne Sperre" extra einschalten


Warum eine Sperre? Bzw. wann eine Sperre?
Ich habe eine in.php, die zb. Chatnachrichten in die Datenbank speichert, und eine out.php, welche das xml Dokument erstellt.

Clientseitig wird in.php regelmäßig aufgerufen und deren Werte an die richtigen Stellen des Interfaces gesetzt.

Wo genau scheitert das System, wenn pro Sekunde 4x die XML-Datei erstellt wird und evenutell 0,25 Chatnachrichten. MySQL wird das doch wohl managen können, oder?



 
QUOTE (cd_brenner @ Mo 9.04.2012, 14:59)ad 800XE:

Leider verstehe ich noch nicht ganz, was du mir sagen willst.

Warum eine Sperre? Bzw. wann eine Sperre?

Wo genau scheitert das System, wenn pro Sekunde 4x die XML-Datei erstellt wird und evenutell 0,25 Chatnachrichten. MySQL wird das doch wohl managen können, oder?

Es darf immer nur "1" mt der Datenbank arbeiten weil DIe Datenbank nicht weis ob "1" die Daten ändern will und ein eventueller "2" dann die geänderten Daten bekommen soll (mit dieser "nur Lese" Anweisung sagt man das "2" auch die alten Daten bekommen darf bzw nicht die neuesten benötigt)
Wenn die Seitenausliefrung "angenommenerweise" 20 Sekudnen braucht

Scernario A
12:00:00 ip123_1 kommt
12:00:20 ip123_1 bekommt Seite
12:00:21 ip123_2 kommt
12:00:41 ip123_2 bekommt Seite (Er wartete 20 Sekunden)

Scernario B
12:00:00 ip123_1 kommt
12:00:15 ip123_2 kommt
12:00:20 ip123_1 bekommt Seite
12:00:40 ip123_2 bekommt Seite (Er wartete 25 Sekunden)

Scernario C
12:00:00 ip123_1 kommt
12:00:19 ip123_2 kommt
12:00:20 ip123_1 bekommt Seite
12:00:40 ip123_2 bekommt Seite(Er wartete 21 Sekunden)

Scernario D
12:00:00 ip123_1 kommt
12:00:01 ip123_2 kommt
12:00:20 ip123_1 bekommt Seite
12:00:40 ip123_2 bekommt Seite(Er wartete 39 Sekunden)

Scernario E
12:00:00 ip123_1 kommt
12:00:01 ip123_2 kommt
12:00:02 ip123_3 kommt
12:00:03 ip123_4 kommt
12:00:04 ip123_5 kommt
12:00:20 ip123_1 bekommt Seite
12:00:40 ip123_2 bekommt Seite(Er wartete 39 Sekunden)
12:01:00 ip123_3 bekommt Seite(Er wartete 58 Sekunden)
12:01:00 ip123_4 bekommt Seite(Er wartete 77 Sekunden)
12:01:00 ip123_5 bekommt Seite(Er wartete 96 Sekunden)



QUOTE (cd_brenner @ Mo 9.04.2012, 14:59)Wo genau scheitert das System, wenn pro Sekunde 4x die XML-Datei erstellt

Wenn es Scheitert, dann scheitert es daran das gewartet wird z.B. beim request von ip123_5 ob die Anderen eine Änderung speichern

QUOTE (cd_brenner @ Mo 9.04.2012, 14:59)Ich habe eine in.php, die zb. Chatnachrichten in die Datenbank speichert, und eine out.php, welche das xml Dokument erstellt.

*****eine in.php,**** da greift auf jeden fall die SPerre, wenn mehrere Zeitgleich schrieben wollen
*****und eine out.php,***** hier sind wir im "Scenario" hier wird nur gelesen, hier kann "read only" die Sperre=verzögerung verhindern

ich versuch gerade im Handbuch da was zu finden
http://dev.mysql.com/doc/refman/5.1/de/tra...l-commands.html
http://dev.mysql.com/doc/refman/5.1/de/implicit-commit.html
hier steht, das manche Befehle "default" eine Sperre machen

ähm, ist das "read only" nicht im open sondern im Schreibbefehl?
http://dev.mysql.com/doc/refman/5.1/de/lock-tables.html
Der Unterschied zwischen READ LOCAL und READ besteht darin, dass READ LOCAL bei aktiver Sperre die Ausführung von INSERT-Anweisungen (also nebenläufigen Einfügeoperationen) zulässt, sofern sie keine Konflikte auslösen.


befor ich aufhör zu suchen, hab ich gerade noch was interesantes gefunden ... "wie Speichert SQL einen varcahr(84)?"
Statische oder dynamische länge?
http://dev.mysql.com/doc/refman/5.1/de/literals.html
ei ei ei
http://dev.mysql.com/doc/refman/5.1/de/string-syntax.html
ein ..... SET Spalte = "inhalt"
kann Probleme machen
immer (in Zukunft) .... SET Spalte = 'inhalt'
 
QUOTE (PH @ Mo 9.04.2012, 11:21) dafür gibt es ja sequenznummern für die nachrichten

ein Protokol über das Gespräch ändert nix an dem Problem das das Gespräch nicht ordnungsgemäß zum Ende gekommen ist
 
Kurzum schaut das Performance-Fangseil jetzt wie folgt aus:

CODE
$refresh = (1 / (MAX_AJAX_RQSTS / $online_num)) * 1000;

if ($refresh < MIN_AJAX_LOAD)
{
$refresh = MIN_AJAX_LOAD;
}

$xml->addChild("refresh", $refresh);



Es werden einfach die maximal erlaubten AJAX-Requests pro Sekunde auf die Benutzer die online sind verteilt.
Die Weiche dient einfach dazu, dass nicht mit 250ms Frequenz aktualisiert wird, wenn wenig User online sind.

Als Beispiel: MAX_AJAX_RQSTS = 40

40 User bei 1000ms Frequenz
80 User bei 2000ms Frequenz
160 User bei 3000ms Frequenz
320 User bei 4000ms Frequenz

Das Erzeugen der Alive-API braucht ca 30 Queries:

30 Queries * 40 Requests pro Sekunde = 1200Queries / Sekunde.

Als Beispiel: MAX_AJAX_RQSTS = 10

10 User bei 1000ms Frequenz
20 User bei 2000ms Frequenz
40 User bei 3000ms Frequenz
80 User bei 4000ms Frequenz

Das Erzeugen der Alive-API braucht ca 30 Queries:

30 Queries * 10 Requests pro Sekunde = 300 Queries / Sekunde.


Ich hab jetzt nur leider keinen Plan wie viele Queries pro Sekunde ich einem managed Hosting Pro Account bei domainfactory zumuten kann.

Per eMail meinen sie, dass man das nicht so genau sagen kann, und es immer auf das Skript ankommt.

Was meint ihr dazu?

Vielen Dank,
Neo



 
Zurück
Oben