[Support] Ressourenschonendes Datenbank-Polling, wie?
Rainer Thieringer
hsnews at web-me.de
Fri Apr 11 12:41:13 CEST 2008
Michael Hierweck schrieb:
> Hallo allerseits,
>
> am "schönsten" wäre es vermutlich, wenn der die Einträge behandelnde
> Dienst dauerhaft laufen und benachrichtigt würde. Dies würde natürlich
> einen dauerhaft laufenden Prozess erfordern...
>
Aber es gibt leider keine Möglichkeit, dass die Datenbank mich
informiert, wenn sich in der Tabelle was tut. Es ist also immer
"Polling". Oder kann die MySQL Installation auf HS bereits Trigger?
> Andererseits, 60x24 sind auch nur 1440 Aufrufe pro Tag und wenn das
> PHP-Skript im Regelfall schnell terminiert (mit persistenter
> DB-Connection) würde ich da auch kein Problem sehen. Persistente
> Verbindungen würden natürlich FastCGI erfordern und das bieten wir
> (noch) nicht an. Friedhelm, wie siehst du das?
>
Es ist nicht CGI, der CGI Teil (in PHP) trägt nur in die Datenbank ein.
Das Lesen aus der DB macht dann ein Perl-Script.
> Rainer, nur als Tipp, weil's mir gerade einfällt: Du solltest beim
> Design deiner Anwendung berücksichtigen, dass es Situationen geben kann,
> z.B. abhängig von Last und Datenmenge, in denen der behandelnde Prozess
> ggf. mehrfach parallel läuft und Maßnahmen treffen, damit dann nicht
> etwa ein Ereignis mehrfach behandelt wird.
>
Ja, ich habe beruflich mit Echtzeit unter Linux zu tun und sollte
eigentlich nicht in dies Falle tappen :)
Die schönste Möglichkeit ist eigentlich diese:
das CGI-Script von user1 schreibt auf eine named pipe, wenn nicht nicht
vorhandenden ist, wird diese angelegt.
das perl-script von user2 liest blocking von dieser pipe. Sobald was
eingetragen wird, läuft das Programm los. Auf die Datenbank könnte dann
sogar verzichtet werden (synchroner Versand). Oder die DB wird
verwendet, um Asynchronizität (spooler) zu erzeugen.
Aber: wie stelle ich sicher, dass der Empfänger zuverlässig und immer
läuft? Ich habe schon eine Lösung, weiß aber nicht ob das nich tzu
kompliziert gelöst ist:
Cron-Job startet shell - Scipt
shell script prüft mit ps ax | grep dasprogramm ob das programm schon läuft
läuft es nicht, wird dasprogramm gestartet
läuft es, wird dasprogramm nicht wieder gestartet
dasprogramm setzt sich auf eine vereinbarte named pipe und wartet auf
Input vom CGI scipt.
... wenn ich es mir recht überlege, hört es sich eigentlich doch nicht
zu verkompliziert an. Ich glaube, so mach ich das.
Rainer
More information about the Support
mailing list