<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>agimatec &#187; ESP</title>
	<atom:link href="http://www.agimatec.de/blog/tag/esp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agimatec.de/blog</link>
	<description>Clash of realities</description>
	<lastBuildDate>Tue, 22 Dec 2009 16:50:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Event Stream Processing: Einleitung und Beispiele zu einer Technologie, die jede Cocktailparty bereichert</title>
		<link>http://www.agimatec.de/blog/2008/05/event-stream-processing-einleitung-und-beispiele-zu-einer-technologie-die-jede-cocktailparty-bereichert/</link>
		<comments>http://www.agimatec.de/blog/2008/05/event-stream-processing-einleitung-und-beispiele-zu-einer-technologie-die-jede-cocktailparty-bereichert/#comments</comments>
		<pubDate>Thu, 22 May 2008 14:20:33 +0000</pubDate>
		<dc:creator>Fabian Crabus</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[ESP]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=124</guid>
		<description><![CDATA[Aufgabenstellung Fangen wir mit einer Aufgabenstellung an. Ziel ist es, Menschen, die bei Regenwetter an einem Regenschirmgeschäft vorbeilaufen, einen Hinweis auf&#8217;s Mobiltelefon zu schicken: &#8220;Wie wäre es mit einem Regenschirm?&#8221; (Wer reine Regenschirmgeschäfte nicht kennt. Ich auch nicht. Aber: es wird bestimmt solche spezialisierten Geschäfte geben, verdammt, ich bin letztens in einem Senfladen gewesen &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/05/istock_000005459073small.jpg"><img class="alignleft size-medium wp-image-125" style="float: left;" title="istock_000005459073small" src="http://www.agimatec.de/blog/wp-content/uploads/2008/05/istock_000005459073small.jpg" alt="" width="300" height="205" /></a></p>
<h2>Aufgabenstellung</h2>
<p>Fangen wir mit einer Aufgabenstellung an. Ziel ist es, Menschen, die bei Regenwetter an einem Regenschirmgeschäft vorbeilaufen, einen Hinweis auf&#8217;s Mobiltelefon zu schicken: &#8220;Wie wäre es mit einem Regenschirm?&#8221; (Wer reine Regenschirmgeschäfte nicht kennt. Ich auch nicht. Aber: es wird bestimmt solche spezialisierten Geschäfte geben, verdammt, ich bin letztens in einem Senfladen gewesen &#8211; man glaubt gar nicht, mit welchen Dingen man seine Zunge töten und Magenrevolutionen starten kann &#8211; uhm, nur mal am Rande)</p>
<p>Die Handys schicken ihre Geokoordinaten, Sensoren die Niederschlagsmenge. Es sollen nun aber die registrierten Nutzer des Dienstes nur dann informiert werden, wenn sie im Umkreis von 50m um das Geschäft sind und innerhalb von 5 Minuten stärkere Regenfälle gemeldet werden.</p>
<h2>Lösungsmöglichkeiten</h2>
<h3>SQL ist der Hammer</h3>
<p>&#8230;den man immer einsetzen kann. Man schreibe eine kleine Applikation, die beständig die Geokoordinaten der Nutzer in einer Tabelle speichert, die Wetterdaten in einer anderen. Sobald ein Regenevent eintrifft, prüfen wir die Daten der letzten 5 Minuten und falls auch diese Regen der nötigen Stärke aufweisen, durchsuchen wir die Geodaten nach passenden Regenschirmkandidaten.</p>
<p>Das Problem ist damit lösbar. Klar ist aber auch: je mehr Nutzer beobachtet werden müssen, je mehr Datenquellen auch hinzukommen und in Summe je komplizierter die Aufgabe ist, desto höher ist hier die Belastung der Datenbank, die Speicherauslastung und damit auch die Kosten.</p>
<h3>Alternative: Event Stream Processing</h3>
<p><span id="more-124"></span><br />
Ein ESP dreht die Welt um. Man definiert Muster/Regeln durch die Events hindurchströmen. Bleibt ein Event in einem Muster hängen, wird eine Aktion ausgelöst. Auf den ersten Blick ist ein ESP also sehr ähnlich einer RETE-Engine, einer Ruleengine wie z.B. <a href="http://jboss.org/drools">drools</a>. Doch üblicherweise kommen bei einem ESP noch zeitliche und räumliche Abfrageoptionen hinzu &#8211; die drools derzeit noch fehlen.</p>
<p>Was ist zu tun, um das oben genannte Problem mit einem ESP zu lösen? Zunächst werden Eventtypen deklariert &#8211; in diesem Fall gibt es zwei: Nutzer- und Regensensordaten.</p>
<pre class="java">public class UserEvent {
  String firstName;
  String lastName;
  String mobileNumber;
  double locationX;
  double locationY;
}

public class SensorEvent {
  double rainIntensity;
  long sensorId;
}</pre>
<p>Diese Eventtypen werden nun regelmäßig in die ESP-Engine &#8220;gepumpt&#8221;. Fein. Nur was macht das dumme Ding damit? So natürlich sich nur peinlich berührt räuspern. Was fehlt ist die Musterdefinition. Auch wenn sich ESPs voneinander unterscheiden und eine jeweils andere Syntax verwenden, so ähneln sie doch im Grunde sehr stark einer SQL-Abfrage:</p>
<pre class="java">every sensor1=SensorEvent(intensity&gt;2.0) -&gt;
  (sensor2=SensorEvent() and
     sensorId != sensor1.sensorId and intensity&gt;2.0 ) -&gt;
   sensor3=SensorEvent() and
     sensorId not in (sensor1.sensorId, sensor2.userId) and
     intensity&gt;2.0))
  ) where timer:within(5 min)</pre>
<p>Diese Regel schlägt an, wenn über einen Zeitraum von 5 Minuten (timer:within) drei Events mit einer Regenintensität größer drei eingetrudelt sind. Sobald dieses Ereignis eingetreten ist, kann eine weitere Regel aktiviert werden, die nun die Geodaten der Nutzer im Umkreis auswertet:</p>
<pre class="java">every other=UserEvent (locationX in [5 : 55],
                                    locationY in [5: 55])</pre>
<p>Das Einspielen erfolgt über eine einfache Java-Klasse:</p>
<pre class="java">public class RainMonitor {
...

public void registerUserEvent {
 locateUsers = epService.getEPAdministrator().createPattern("
             every other=UserEvent (locationX in [5 : 55],
                                                locationY in [5: 55])");

 locateUsers.addListener(new UpdateListener() {
            public void update(EventBean[] newEvents, EventBean[] oldEvents)
            {
                UserEvent other = (UserEvent) newEvents[0].get("other");
                MatchAlertBean alert = new MatchAlertBean(other.getUserMobileNumber(), other.getFirstName(), other.getLastName());
                epService.getEPRuntime().emit(alert);
            }
        });</pre>
<p>Was ist nun geschehen? Wir haben Regeln definiert und in der Engine registriert. Sobald ein Muster erkannt wurde, wird ein Listener aktiviert, der daraufhin auf die Eventdaten zugreifen kann, um eine Aktion auszulösen (in diesem Fall: das Senden einer SMS)<br />
Schön hierbei: es ist sparsam. Und flexibel. Neue Regeln können schnell definiert und zur Laufzeit eingespielt werden.</p>
<p>Schließlich muss man bedenken, dass es um Massenverarbeitung geht. Denn zumeist werden weit mehr als zwei Datenströme ausgewertet. Korrelationen zwischen Hunderten an Events sind möglich. Zigtausende Auswertungen können mit dieser Technologie durchgeführt werden. Zwar kann man es mit SQL genauso lösen oder bei geschickter Entwicklung auch in memory, jedoch: warum?</p>
<p>Weitere Informationen:</p>
<ul>
<li><a href="http://esper.codehaus.org">http://esper.codehaus.org</a> (Esper: GPL-ESP-Engine)</li>
<li><a href="http://www.progress.com/apama/index.ssp">http://www.progress.com/apama/index.ssp</a> (Apama ESP)</li>
<li><a href="http://www.agimatec.de/blog/2008/05/what-a-difference-a-p-makes-esp-vs-esb/">ESP vs. ESB</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/05/event-stream-processing-einleitung-und-beispiele-zu-einer-technologie-die-jede-cocktailparty-bereichert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What a difference a &#8216;p&#8217; makes &#8211; ESP vs. ESB</title>
		<link>http://www.agimatec.de/blog/2008/05/what-a-difference-a-p-makes-esp-vs-esb/</link>
		<comments>http://www.agimatec.de/blog/2008/05/what-a-difference-a-p-makes-esp-vs-esb/#comments</comments>
		<pubDate>Tue, 06 May 2008 16:59:33 +0000</pubDate>
		<dc:creator>Fabian Crabus</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[ESB]]></category>
		<category><![CDATA[ESP]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=100</guid>
		<description><![CDATA[Wir kümmern uns darum, viele Automaten mit einem Server zu verheiraten. Die Automaten sind meist sehr gelangweilt. Was machen Automaten, die sich langweilen? Sie reden. Plappern. Blubbern. Jedoch jede einzelne Nachricht ist wichtig. Jede Nachricht löst einen Service aus &#8211; etwas wird in der Datenbank gespeichert, eine Benachrichtigung wird ausgelöst oder eine externe Schnittstelle wird [...]]]></description>
			<content:encoded><![CDATA[<p>Wir kümmern uns darum, viele Automaten mit einem Server zu verheiraten. Die Automaten sind meist sehr gelangweilt. Wa<a href="http://www.agimatec.de/blog/wp-content/uploads/2008/05/whatadifference.png"><img class="size-medium wp-image-99 alignleft" style="float: left;" title="whatadifference" src="http://www.agimatec.de/blog/wp-content/uploads/2008/05/whatadifference.png" alt="" width="160" height="160" /></a>s machen Automaten, die sich langweilen? Sie reden. Plappern. Blubbern. Jedoch jede einzelne Nachricht ist wichtig. Jede Nachricht löst einen Service aus &#8211; etwas wird in der Datenbank gespeichert, eine Benachrichtigung wird ausgelöst oder eine externe Schnittstelle wird angesprochen. Nichts darf verloren gehen.</p>
<p>Dies lösen wir &#8211; oh, Gott, Hypeattacke &#8211; über eine SOA-Architektur mit einem Enterprise Service Bus (ESB) im Zentrum. Dieser spielt den großen Mediator zwischen Automaten, eigenen Services und externen Schnittstellen.</p>
<p>Ändert man jedoch nur einen Buchstaben, wechselt man vom ESB zu ESP, ergibt sich eine weit aus größere Veränderung: ESP steht für Event Stream Processor. ESP-Applikationen sind darauf ausgelegt, Unmengen an Nachrichten verarbeiten zu können. Allerdings zumeist nicht auf per message Basis. ESP schauen sich den Nachrichtenstrom an und erkennen im Fluß Muster. Die einzelne Nachricht ist egal, wichtig ist, die Masse an Informationen zu betrachen und Korrelationen zu erkennen. Gibt es eine Übereinstimmung, kann ein Service (oder ein ESB) angestoßen werden, der eine entsprechende Aktion auflöst.</p>
<p>Übertragen auf unseren Anwendungsfall (was hier ein wenig an den Haaren herbeigezogen ist, aber ich bin heute nur bedingt kreativ) könnte ein Beispiel lauten:</p>
<p>&#8220;Musterdefinition: wenn ein Automat nicht innerhalb von einer halben Stunde eine Nachricht schickt, dann triggere MachineOfflineStrategy&#8221;</p>
<p>Natürlich gibt es für diesen Fall bessere Lösungen, es zeigt aber einen sehr interessanten Aspekt an einem ESP auf: die Definition von &#8220;Zeit-basierenden Sichtfenstern&#8221;: man lege eine Schablone über den Nachrichtenfluss und prüfe für diesen Ausschnitt nach Musterübereinstimmungen.</p>
<p>Feine Sache. Und, uhm, ja, das &#8220;ESP vs. ESB&#8221; habe ich nur sprachklanglichen Gründen eingefügt. Genau genommen sind ESP und ESB ein hervorragendes Tandem.</p>
<p>Dazu später mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/05/what-a-difference-a-p-makes-esp-vs-esb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
