[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