php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.08.2010, 19:20  
Neuer Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 8
PHP-Kenntnisse:
Fortgeschritten
boehlke befindet sich auf einem aufstrebenden Ast
boehlke eine Nachricht über ICQ schicken
Standard event bus mit PHP

Hallo Entwickler!

In einem aktuellen Projekt entwickele ich eine Synchronisation zwischen zwei und vielleicht mal mehr PHP-Anwendungen.
Die Systeme sollen möglichst entkoppelt bleiben, deshalb bietet sich eine Ereignis-orientierte Architektur an: Bei einer Änderung der Daten feuert das verursachende System ein Ereignis ab, dass von interessierten Systemen verarbeitet wird. Ich denke also an ein Publish-Subscribe-System, auch "event bus" genannt.

Meine Frage an die Experten hier: Kennt ihr eine Event-Bus-Implementierung in PHP?

Danke für die Hilfe!

Beste Grüße,
André
boehlke ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.08.2010, 19:51  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.129
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Du könntest per Web-Service Requests an die zu benachrichtigenden System schicken (Push) oder die System in regelmäßigen Abständen nachfragen lassen (pull)
xm22 ist offline   Mit Zitat antworten
Alt 03.08.2010, 20:46  
Neuer Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 8
PHP-Kenntnisse:
Fortgeschritten
boehlke befindet sich auf einem aufstrebenden Ast
boehlke eine Nachricht über ICQ schicken
Standard

Danke für Dein Input!
Ich brauche ein System, das die Ereignisse speichert und verteilt. Wie diese verteilt werden, ist mir zunächst nicht so wichtig.
Beispiel:
In System 1 wird ein Benutzer angelegt. Das System erzeugt ein Ereignis "Benutzer angelegt". Dieses Ereignis soll an alle Systeme weitergeleitet werden, die sich dafür interessieren. Das macht der Event Bus.
boehlke ist offline   Mit Zitat antworten
Alt 03.08.2010, 20:56  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von boehlke Beitrag anzeigen
Ich brauche ein System, das die Ereignisse speichert und verteilt. Wie diese verteilt werden, ist mir zunächst nicht so wichtig.
Letzteres ist doch das hauptsächlich wichtige ...?

Zitat:
Beispiel:
In System 1 wird ein Benutzer angelegt. Das System erzeugt ein Ereignis "Benutzer angelegt". Dieses Ereignis soll an alle Systeme weitergeleitet werden, die sich dafür interessieren. Das macht der Event Bus.
Na also, dann ist doch wohl die „Verteilung“ der Events, die Benachrichtigung über ihr Eintreten, sehr wohl das wichtigste an der ganzen Sache.

(Das „Melden“ des Events ist ja simpel, da muss System 1 ja nur über einen Request dem Event Bus ein mal Bescheid geben.)

Zu überlegen wäre, ob der Event Bus ein dauernd laufendes Script/Programm sein muss, oder ob da „aufrufen“ beim Melden eines neuen Events reicht. Vermutlich ersteres, denn die Zustellung der Eventmeldung an alle anderen Systeme muss ja im Zweifelsfalle nicht augenblicklich klappen, ggf. reagiert eines dieser Systeme gerade nicht/ist ausgelastet, so dass die Nachricht kurze Zeit später noch mal gesendet werden muss.


Per Google finde ich auf die Schnelle zum Thema nur folgendes, Ajax/PHP Distributed Event Bus - ich weiß nicht, wie AJAX-lastig dieser Artikel ist, und was davon du auf dein System übertragen kannst - aber schau mal rein.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 04.08.2010, 08:50  
Neuer Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 8
PHP-Kenntnisse:
Fortgeschritten
boehlke befindet sich auf einem aufstrebenden Ast
boehlke eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von ChrisB Beitrag anzeigen
Zu überlegen wäre, ob der Event Bus ein dauernd laufendes Script/Programm sein muss, oder ob da „aufrufen“ beim Melden eines neuen Events reicht. Vermutlich ersteres, denn die Zustellung der Eventmeldung an alle anderen Systeme muss ja im Zweifelsfalle nicht augenblicklich klappen, ggf. reagiert eines dieser Systeme gerade nicht/ist ausgelastet, so dass die Nachricht kurze Zeit später noch mal gesendet werden muss.
Das ist eine wichtige Überlegung. Alle Ereignisse müssen mindestens so lange gespeichert werden, wie es einer interessierte Partei nicht weitergeleitet wurde. Wenn eine empfangendes System z.B. bei der Verarbeitung des Ereignisses abschmiert oder wie Du geschrieben hast ausgelastet ist, dann muss das Ereignis aufgehoben werden.

Zitat:
Zitat von ChrisB Beitrag anzeigen
Letzteres ist doch das hauptsächlich wichtige ...?

Per Google finde ich auf die Schnelle zum Thema nur folgendes, Ajax/PHP Distributed Event Bus - ich weiß nicht, wie AJAX-lastig dieser Artikel ist, und was davon du auf dein System übertragen kannst - aber schau mal rein
Ja genau, dort wird das beschrieben, was ich mir vorstelle.

Es sieht so aus, als müsste ich das selbst implementieren. Ich werde im ersten Schritt mit einem Singleton arbeiten, das die Ereignis-Verteilungslogik kapselt. Ich gehe erst einmal davon aus, dass die Systeme auf demselben Rechner liegen und dass der Event Bus beide direkt aufrufen kann.

Ich schlage folgenden Aufbau vor:

Ereignis-Erzeugung läuft etwa so ab:
PHP-Code:
require_once '.../EventBus.php';
EventBus :: getInstance()->fireEvent(new UserCreatedEvent($uid$name)); 
Ereignis-Empfang wird konfiguriert.
listeners.ini
Code:
listener1.class = .../UserCrudListener.php
listener1.eventtype0 = UserCreatedEvent
listener1.eventtype1 = UserChangedEvent
listener1.eventtype2 = UserDeletedEvent
UserCrudListener.php
PHP-Code:
class UserCrudListener implements EventListener {
  public function 
handleEvent(Event $oEvent) {
    
$oEventSource $oEvent->getSource();
    echo 
"Event fired by " $oEventSource->getID() . "\n";
    if(
$oEvent instanceof UserCreatedEvent)
      ....
  }

Der EventBus arbeitet mit serialize/unserialize, um nicht zustellbare Ereignisse zu speichern. "Zweitzustellung" ist zunächst nicht vorgesehen.

Geht das noch einfacher?

Grüße
André
boehlke ist offline   Mit Zitat antworten
Alt 04.08.2010, 11:12  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.129
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Die ini-Datei sieht etwas seltsam aus. Dreh doch die Speicherung lieber um, also etwa so (Mal xml, damit es sich einfacher abbilden lässt)
Code:
<events>
  <event id="UserCreatedEvent">
    <listeners>
      <listener class="UserCrudListener" />
    </listeners>
  </event>
</events>
Evtl. könnte/sollte man im Listener-Objekt direkt ein Callback hinterlegen, also so etwa:
Code:
<events>
  <event id="UserCreatedEvent">
    <listeners>
      <listener class="UserCrudListener" function="onCreated" />
    </listeners>
  </event>
</events>
xm22 ist offline   Mit Zitat antworten
Alt 04.08.2010, 15:16  
Neuer Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 8
PHP-Kenntnisse:
Fortgeschritten
boehlke befindet sich auf einem aufstrebenden Ast
boehlke eine Nachricht über ICQ schicken
Standard

Eine XML-Konfigurationsdatei ist in dem Fall wirklich schöner. Danke.
boehlke ist offline   Mit Zitat antworten
Alt 04.08.2010, 15:37  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Das ist eine wichtige Überlegung. Alle Ereignisse müssen mindestens so lange gespeichert werden, wie es einer interessierte Partei nicht weitergeleitet wurde. Wenn eine empfangendes System z.B. bei der Verarbeitung des Ereignisses abschmiert oder wie Du geschrieben hast ausgelastet ist, dann muss das Ereignis aufgehoben werden.
Fargt sich natürlich, wie lange man das Event vorhält. Um beim Beispiel zu bleiben:

Zitat:
In System 1 wird ein Benutzer angelegt.
Stellen wir uns ein zweites Ereignis vor:

Zitat:
In System 1 wird dieser Benutzer wieder gelöscht.
Jetzt ergibt sich bereits eine Abhängigkeit von vollständigkeit. Event 2 kann vielleicht noch ohne Wissen über 1 abgearbeitet (ignoriert) werden, aber anders herum ergibt sich schon ein ganz anderer Tenor. Auf der anderen Seite - wenn ein System lange nicht antwortet (und das ist wohl der einzige Weg, wie die Events bestätigt werden können) ergibt sich eine riesige Queue von Events, die auch noch für jeden Client separat gespeichert und zusammengestekllt werden muss.

Alles nicht so trivial.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 04.08.2010, 16:50  
Neuer Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 8
PHP-Kenntnisse:
Fortgeschritten
boehlke befindet sich auf einem aufstrebenden Ast
boehlke eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen

Jetzt ergibt sich bereits eine Abhängigkeit von vollständigkeit. Event 2 kann vielleicht noch ohne Wissen über 1 abgearbeitet (ignoriert) werden, aber anders herum ergibt sich schon ein ganz anderer Tenor. Auf der anderen Seite - wenn ein System lange nicht antwortet (und das ist wohl der einzige Weg, wie die Events bestätigt werden können) ergibt sich eine riesige Queue von Events, die auch noch für jeden Client separat gespeichert und zusammengestekllt werden muss.

Alles nicht so trivial.
Hmm, die Ereignisse müssen also in Ihrer vorgesehenen Reihenfolge verarbeitet werden. Noch ein Grund, ein fertiges System zu nehmen, das es nicht gibt.

Die Architektur ist einfach die sauberste, die mir einfällt. Lässt sich gut debuggen, erweitern und warten. Ich denke, es lohnt sich.
boehlke ist offline   Mit Zitat antworten
Alt 04.08.2010, 16:50  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Wozu soll das ganze denn dienen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] SQL UPDATE bei onclick Event! Livastyle JavaScript, Ajax und mehr 9 14.01.2010 22:28
[Erledigt] Im &lt;option&gt; ein onClick Event für Vorauswahl Felix JavaScript, Ajax und mehr 2 08.09.2009 14:53
variable mit onclick an php drombusch PHP Tipps 2009 8 30.08.2009 14:45
[Erledigt] OnClick event abbrechen Frank JavaScript, Ajax und mehr 4 25.08.2009 12:15
addEventListener mit Parameter aus Event drsoong JavaScript, Ajax und mehr 4 13.04.2009 23:02
Event: User Regestrierung in die Datenbank??? Dunkelelf9 Datenbanken 2 22.12.2008 15:49
jQuery: Parameter an onclick Event ecomeback HTML, Usability und Barrierefreiheit 1 08.04.2008 11:23
Event abfangen Ambience JavaScript, Ajax und mehr 4 30.08.2007 14:36
für jedes Event immer neuen Ordner anlegen, sinnvoll? Matthiasnet PHP Tipps 2007 3 19.05.2007 11:57
Event in Kalender ausgeben zoro PHP Tipps 2007 3 02.05.2007 13:40
Mauszeiger Position (ohne Event) cowabunga1984 HTML, Usability und Barrierefreiheit 4 04.04.2007 12:01
JS - node, onClick Event hinzufügen, MSIE Zergling-new HTML, Usability und Barrierefreiheit 3 21.07.2006 19:46
Suche PHP Event Kalender PHP Tipps 2005-2 2 28.09.2005 19:57
[Erledigt] Animiertes Gif auf Event starten HTML, Usability und Barrierefreiheit 3 12.02.2005 19:54
[Erledigt] probleme mit event datenbank Datenbanken 1 04.09.2004 00:30

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php eventbus, php event bus, eventbus php, event bus php, php event-bus, php bus, eventbus \php\, php events, $bus in php, php event system, php-event system, eventdatenbank \web service\, webservice eventdatenbank, php ajax event bus

Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum