<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Octavians Nutwerk - Middleware</title>
    <link>http://nutwerk.de/</link>
    <description>&quot;Oh Nutwerk. Wo der grilbe Wakwak-Vogel zirbelt grell wie Tee-Service. Des wachen Mundes arg geschlauchter Gartenkohl, von Honigmoehnchen kandelabert, a.&quot; - Switch</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.5.3 - http://www.s9y.org/</generator>
    <pubDate>Mon, 16 Feb 2009 09:29:00 GMT</pubDate>

    <image>
        <url>http://nutwerk.de/templates/square/img/s9y_banner_small.png</url>
        <title>RSS: Octavians Nutwerk - Middleware - &quot;Oh Nutwerk. Wo der grilbe Wakwak-Vogel zirbelt grell wie Tee-Service. Des wachen Mundes arg geschlauchter Gartenkohl, von Honigmoehnchen kandelabert, a.&quot; - Switch</title>
        <link>http://nutwerk.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>peXi - Zwischenstand Prototyp</title>
    <link>http://nutwerk.de/archives/19-peXi-Zwischenstand-Prototyp.html</link>
            <category>Middleware</category>
    
    <comments>http://nutwerk.de/archives/19-peXi-Zwischenstand-Prototyp.html#comments</comments>
    <wfw:comment>http://nutwerk.de/wfwcomment.php?cid=19</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://nutwerk.de/rss.php?version=2.0&amp;type=comments&amp;cid=19</wfw:commentRss>
    

    <author>nospam@example.com (Marc Jakubowski)</author>
    <content:encoded>
    In den vergangenen Tagen habe ich mich mit der Implementierung eines ersten Prototyps beschäftigt.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Versuchsaufbau&lt;/h3&gt;&lt;br /&gt;
Das Szenario ist zunächst so trivial wie möglich, zeigt jedoch bereits an welchen Stellen Probleme auftreten werden, so dass man diese schon frühzeitig bei der Architekturüberlegung berücksichtigen kann.&lt;br /&gt;
&lt;br /&gt;
Im Prinzip sieht das Szenario wie folgt aus:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Sender schickt Message an Middleware Server&lt;br /&gt;
&lt;li&gt;Server nimmt Message entgegen und legt sie in eine Queue&lt;br /&gt;
&lt;li&gt;Engine holt Message aus Queue und schickt sie an Empfänger&lt;br /&gt;
&lt;li&gt;Empfänger nimmt Message entgegen und speichert sie im Filesystem&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
Dieser einfache Aufbau beschränkt sich also erst einmal auf die asynchrone Verarbeitung von Testnachrichten vom Sender über die Middleware bis zum Empfänger.&lt;br /&gt;
Die verwendeten Komponenten werden im Folgenden näher beschrieben:&lt;br /&gt;
 &lt;h3&gt;Komponenten&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;Sender&lt;/h4&gt;&lt;br /&gt;
Script, welches über den Browser aufgerufen werden kann und dann per Zend_Http_Client beliebig viele HTTP-Post Nachrichten an den Middleware Server sendet. Der Einfachheit halber wird lediglich der Parameter &quot;message&quot; mit dem Wert von uniqid() gesendet, also noch keine &quot;sinnvolle&quot; Nachricht.&lt;br /&gt;
Die Nachrichten werden stumpf rausgefeuert, ohne speziell auf die Antwort des Servers zu reagieren.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Server&lt;/h4&gt;&lt;br /&gt;
Script, welches vom Sender angesprochen wird und die gepostete Nachricht entgegen nimmt. Der Nachrichteninhalt wird in einer Queue gespeichert, welche eine InnoDb Tabelle mit den Feldern &quot;id&quot;, &quot;message&quot; und &quot;status&quot; ist. Bei erfolgreichem Speichern in die Queue wird ein HTTP Response Code 200 an den Sender zurückgeschickt, ansonsten ein Fehlercode.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Engine&lt;/h4&gt;&lt;br /&gt;
Die Engine ist die Hauptkomponente der Middleware und besteht aus einem langlaufenden PHP-CLI Script (per &quot;while (true) { ... }&quot;), welches kontinuierlich die Queue abfragt, ob neue, unverarbeitete Nachrichten vorhanden sind.&lt;br /&gt;
Ist dies nicht der Fall, wartet das Script 5 Sekunden vor der nächsten Abfrage.&lt;br /&gt;
&lt;br /&gt;
Sind neue Nachrichten vorhanden, wird eine Beliebige selektiert und wiederrum per Zend_Http_Client als HTTP-Post Nachricht mit den Parametern &quot;id&quot; und &quot;message&quot; an den Receiver gesendet. Je nach Response Code wird die Nachricht in der Queue als &quot;verarbeitet&quot;, &quot;fehlerhaft&quot; oder &quot;neu&quot; (zum erneuten Verarbeiten) markiert.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Receiver&lt;/h4&gt;&lt;br /&gt;
Script, welches von der Engine angesprochen wird und die gepostete Nachricht entgegen nimmt. Der Nachrichteninhalt wird in einer Textdatei im Filesystem mit dem Namen der &quot;id&quot; und Inhalt der &quot;message&quot; abgelegt. Sollte die Datei wider Erwarten bereits existieren wird ein Fehlercode zurückgesendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Analyse&lt;/h3&gt;&lt;br /&gt;
Da ich (noch) auf einem Windows Rechner entwickle, sind Aussagen über Performance nur schwer zu treffen, zunächst ging es mir um den reibungslosen Ablauf des Prozesses.&lt;br /&gt;
&lt;br /&gt;
Der lansamste Teil in diesem Versuchsaufbau ist das Versenden der Nachrichten per HTTP-Post, da für jede eingehende und ausgehende Nachricht der Middleware HTTP Verbindungen zu Scripten aufgebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
Da die Engine ein langlaufender Prozess ist, kann es passieren, dass je nach Konfiguration und Anzahl der verarbeiteten Nachrichten das Memory Limit erreicht wird.&lt;br /&gt;
&lt;br /&gt;
Um eine parallele Verarbeitung mit mehreren Prozessen zu simulieren, habe ich testweise bis zu 6 Instanzen des Engine Scripts gestartet wobei sofort das Problem von Race Conditions auftrat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Schlussfolgerungen&lt;/h3&gt;&lt;br /&gt;
Benutzung einer Unix Umgebung, um bessere Aussagen über die Performance treffen und Forking nutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Testen von anderen Methoden zur Nachrichtenübertragung, z.B. per &quot;cUrl&quot;, persistente HTTP Verbindungen und Versenden von mehreren Nachrichten auf einmal.&lt;br /&gt;
&lt;br /&gt;
Abarbeitung der Queue mit Verwendung von Transaktionen und Locking um Race Conditions zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Parallele Verarbeitung der Messages durch Prozess Forking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Weiteres Vorgehen&lt;/h3&gt;&lt;br /&gt;
Als nächstes werde ich synchrone Nachrichten implementieren, das heißt, dass die Nachrichten nicht in der Queue gespeichert werden um von der Engine abgearbeitet zu werden, sondern dass das Server selbst  die Verarbeitung auslöst, um die Antwort des Empfängers an den Sender zurückgeben zu können.&lt;br /&gt;
&lt;br /&gt;
Dazu muss der Verarbeitungsteil, der bislang fest in der Engine implementiert ist ausgelagert werden, damit dieser direkt vom Server Script aufgerufen werden kann. Dies hat außerdem den Vorteil, dass eine Umstellung der Engine auf Forking einfacher zu implementieren ist, da dann jeder nebenläufige Prozess eine eigenständige Verarbeitung auslöst.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls jemand weitere Ideen zur Optimierung hat, bitte per Kommentar mitteilen &lt;img src=&quot;http://nutwerk.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; 
    </content:encoded>

    <pubDate>Mon, 16 Feb 2009 10:29:00 +0100</pubDate>
    <guid isPermaLink="false">http://nutwerk.de/archives/19-guid.html</guid>
    
</item>
<item>
    <title>PHP Message-orientierte Middleware</title>
    <link>http://nutwerk.de/archives/18-PHP-Message-orientierte-Middleware.html</link>
            <category>Middleware</category>
    
    <comments>http://nutwerk.de/archives/18-PHP-Message-orientierte-Middleware.html#comments</comments>
    <wfw:comment>http://nutwerk.de/wfwcomment.php?cid=18</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://nutwerk.de/rss.php?version=2.0&amp;type=comments&amp;cid=18</wfw:commentRss>
    

    <author>nospam@example.com (Marc Jakubowski)</author>
    <content:encoded>
    Bei meinem früheren Arbeitgeber hatte ich die Gelegenheit Projekte mittels &lt;a href=&quot;http://help.sap.com/saphelp_nw04/helpdata/EN/0f/80243b4a66ae0ce10000000a11402f/frameset.htm&quot; title=&quot;SAP Exchange Infrastructure&quot;&gt;SAP Exchange Infrastructure&lt;/a&gt; zu realisieren. &lt;br /&gt;
Bei dem Produkt handelt es sich um eine in Java und ABAP implementierte Message-orientierte Middleware, die es ermöglicht eingehende Nachrichten der verschiedensten Formate in andere Formate zu transformieren und an beliebige Empfänger zu verteilen, also ideal zun Datenaustausch in einer heterogenen Umgebung.&lt;br /&gt;
&lt;br /&gt;
Da ich von den Möglichkeiten dieser Software ziemlich beeindruckt war, es jedoch nicht realistisch ist, sich so ein Teil zu lizensieren, schaute ich mich nach ähnlichen Lösungen um. Da gäbe es zum Beispiel &lt;a href=&quot;http://de.wikipedia.org/wiki/WebSphere&quot; title=&quot;IBM WebSphere&quot;&gt;IBM WebSphere&lt;/a&gt;, welches für den privaten Gebrauch aber ebenso ausscheidet. &lt;h3&gt;Message Queues&lt;/h3&gt;&lt;br /&gt;
Bei reinen Message Queues sind &lt;a href=&quot;http://en.wikipedia.org/wiki/Java_Message_Service&quot; title=&quot;Java Message Service&quot;&gt;JMS&lt;/a&gt; und &lt;a href=&quot;http://activemq.apache.org/&quot; title=&quot;Apache ActiveMQ&quot;&gt;Apache ActiveMQ&lt;/a&gt; als OpenSource Lösungen die verbreitetsten.&lt;br /&gt;
&lt;br /&gt;
Die Suche nach in PHP implementierten Middlewares oder Message Queues war sehr ernüchternd. Zwar gibt es zu den oben genannten und anderen Lösungen oft Bibliotheken, um mit PHP darauf zugreifen zu können, den Aufwand diese Systeme aufsetzen zu müssen erspart dies aber nicht.&lt;br /&gt;
&lt;br /&gt;
Die einzig brauchbare PHP Message Queue scheint &lt;a href=&quot;https://www.dropr.org/&quot; title=&quot;dropr&quot;&gt;dropr&lt;/a&gt; zu sein, welche bereits bei &lt;a href=&quot;http://www.jimdo.com/&quot; title=&quot;Jimdo&quot;&gt;Jimdo&lt;/a&gt; im Produktiveinsatz verwendet wird um Nachrichten zwischen global verteilten Servern auszutauschen.&lt;br /&gt;
&lt;br /&gt;
Wenn jemand weitere brauchbare Lösungen kennt, bitte einen Kommentar hinterlassen.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Das Rad neu erfinden&lt;/h3&gt;&lt;br /&gt;
Als Entwickler reizt es mich jetzt natürlich selbst in PHP eine entsprechende Middleware zu entwickeln &lt;img src=&quot;http://nutwerk.de/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Ob dies nun sinnvoll ist oder nicht, sei mal dahingestellt, von der technischen bzw archtitekturellen Seite ist es auf jeden Fall eine interessante Herausforderung.&lt;br /&gt;
Im Prinzip soll sich der Funktionsumfang an der SAP XI orientieren, wobei es wohl etwas vermessen wäre die Komplexität des Systems genau so abbilden zu können, von daher wird es eine ziemlich abgespeckte Variante werden. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Funktionalität&lt;/h3&gt;&lt;br /&gt;
Ein ausgearbeitetes Konzept gibt es noch nicht, wird es vielleicht auch nie geben, da ich es iterativ angehen werde um nach und nach den Komplexitätsgrad zu erhöhen.&lt;br /&gt;
Einen groben Überblick der zu bedenkenden Komponenten gibt es im Wiki zum Google Code Projekt &lt;a href=&quot;http://code.google.com/p/pexi&quot; title=&quot;peXi - PHP Exchange Infrastructure&quot;&gt;peXi - PHP Exchange Infrastructure&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Im Groben soll das System später einmal folgendes können:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; Synchrone/Asynchrone Verarbeitung&lt;br /&gt;
&lt;li&gt; Unterstützung vieler Nachrichtenformate/Protokolle&lt;br /&gt;
&lt;li&gt; (Zwischen-/Persistente) Speicherung in Queues&lt;br /&gt;
&lt;li&gt; Senden an beliebige Empfänger&lt;br /&gt;
&lt;li&gt; Transformation von Nachrichten in Zielformat&lt;br /&gt;
&lt;li&gt; Erstellen von Szenarien&lt;br /&gt;
&lt;li&gt; Abbildung von Systemlandschaften&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
In dem Zusammenhang gilt es natürlich auch noch folgende Themen zu beachten:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; Skalierbare Architektur&lt;br /&gt;
&lt;li&gt; Performanceoptimierung&lt;br /&gt;
&lt;li&gt; Sicherheit / Authentifizierung / Zugriffskontrolle&lt;br /&gt;
&lt;li&gt; Monitoring&lt;br /&gt;
&lt;li&gt; Usability der Konfigurationsoberfläche&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
Das reicht dann auch erstmal &lt;img src=&quot;http://nutwerk.de/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Entwicklung eines Prototyps&lt;/h3&gt;&lt;br /&gt;
Als erstes gilt es einen simplen asynchronen Prototyp zu erstellen, der aus diesen Komponenten bestehen wird:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; Sender: Sendet HTTP Messages an Server&lt;br /&gt;
&lt;li&gt; Server: Empfängt Messages und speichert diese in einer Queue&lt;br /&gt;
&lt;li&gt; Engine: Daemon, der periodisch die Queue nach neuen Messages checkt um diese an Empfänger zu schicken&lt;br /&gt;
&lt;li&gt; Empfänger: Nimmt Messages entgegen und speichert diese im Filesystem&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
Ein erster rudimentärer Test funktionierte bereits. Nun gilt es die einzelnen Komponenten Stück für Stück zu isolieren und auzubauen und eine ordentliche Architektur zu entwickeln.&lt;br /&gt;
&lt;br /&gt;
Hilfe und Ideen sind gerne willkommen &lt;img src=&quot;http://nutwerk.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; 
    </content:encoded>

    <pubDate>Fri, 13 Feb 2009 11:32:00 +0100</pubDate>
    <guid isPermaLink="false">http://nutwerk.de/archives/18-guid.html</guid>
    
</item>

</channel>
</rss>