<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Edam</title>
        <link>http://www.shanghai-software.com/blog/category/18.aspx</link>
        <description>Edam</description>
        <language>en-AU</language>
        <copyright>Ben Kloosterman</copyright>
        <generator>Subtext Version 2.1.0.5</generator>
        <item>
            <title>Can EDA SOA eventing systems be fast</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/07/10/can-eda-soa-eventing-systems-be-fast.aspx</link>
            <description>A lot of  traditional eventing systems  use C++  and are dubious about whether the Lego block style SOA can provide sufficient performance. &lt;br /&gt;
&lt;br /&gt;
Again it boils down to design &lt;br /&gt;
&lt;br /&gt;
 WCF  C# can process  over 22000 small messeges per second on an average 2 year old quad server.   http://msdn.microsoft.com/en-us/library/bb310550.aspx#wcfperform_topic4.&lt;br /&gt;
&lt;br /&gt;
This is more than sufficient for most applications especially as with eventing systems you can add servers relatively simply , the algorithms which manage  the propogation of  subscriptions and the path are far more important . ( Distributed Event-Based Systems  (Muhl , Fiege and Pietzuch) is a good book which covers the theory here .&lt;br /&gt;
&lt;br /&gt;
The other big issue often sited is latency but EDAM ( which uses &lt;a title="WCF" href="http://www.shanghai-software.com/blog/WCF" rel=""&gt;Windows Communication Foundation&lt;/a&gt; ) has sometimes achieved cross machine rates of 3ms again the design is critical here if you pass through 6 nodes each adding 20 ms  it can become  quickly unacceptable.  Often people will use all the features of SOA such as queues , transactions , encryption etc  yet wouldn't implement these on a typical C++  system  these can be killers , don't use them unless you HAVE to and since most C++ eventing systems dont you better have a good reason. . &lt;br /&gt;
&lt;br /&gt;
I would also add Network latency between companies , cities  or even countries add far more significant delays.  With human reaction being about 120ms (At best)  the small delays these services add are insignificant. &lt;br /&gt;
&lt;br /&gt;
The end result is you CAN build lego block style SOA , high speed eventing systems  with a good a design and gain all the SOA benefits .&lt;br /&gt;
&lt;br /&gt;
You could argue computer trading systems require better times but again i think the small differences you will get ( single figure ms at best ) are more than outweighed by a flexible design.  eg  instead of running the trades on the clients premises , critical trades can be uploaded to a providers machine near to the exchange this is often hard due to inflexible implementations .  A strong and flexible design means more optomization can be made more easily eg message priritization , packing multiple data messeges for efficiency etc &lt;br /&gt;
&lt;br /&gt;
Like premature code optomization  the desire to be as fast as possible does not outweigh good progamming algorithms and design.  &lt;br /&gt;
&lt;br /&gt;
Ok i said it enough a flexible and strong design is far more important than premature optomization and making things as fast as possible, &lt;img src="http://www.shanghai-software.com/blog/aggbug/44.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/07/10/can-eda-soa-eventing-systems-be-fast.aspx</guid>
            <pubDate>Fri, 10 Jul 2009 03:01:03 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/44.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/07/10/can-eda-soa-eventing-systems-be-fast.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/44.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/44.aspx</trackback:ping>
        </item>
        <item>
            <title>EDAM -What is EDAM trying to do.</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/04/05/40.aspx</link>
            <description>Just been working on EDAM ( my event driven architecture product) and wanted to note down and restate the long term goal  (in addition to being a great eventing system). &lt;br /&gt;
&lt;br /&gt;
The goal of EDAM is for people to be able to quickly add programs to the enterprise and to provide a fast event driven service to make this happen . Note i avoided the term framework  as i want this to be usable with no dll linked though we will provide one later to make it even easier. &lt;br /&gt;
&lt;br /&gt;
Remember when we used UNIX commands such as &lt;br /&gt;
&lt;br /&gt;
cat file* | tr -cs '[A-Z][a-z]' '\012' | sort | uniq -c | sort -nr | more&lt;br /&gt;
&lt;br /&gt;
these are incredibly powerful for experienced users and i wanted something similar so you could write enterprise applications and redirect them FAST.  &lt;br /&gt;
&lt;br /&gt;
What i want to do is something like &lt;br /&gt;
&lt;br /&gt;
string  ProcessOrder(Order order) { return order.ToXml())   &amp;lt;OrderService.NewOrderEvent("/orders/order[Customer=xyz]"   &amp;gt; LogEvent(Cat = "Check For Orders from customer xyz" , result;  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
string  ProcessOrder(Order order) { if ( order.Amount&amp;gt; 1000000) return order.ToXml(); else return null; )   &amp;lt;[OrderService].NewOrderEvent("/orders/order[Customer=xyz]"   &amp;gt; [LogService].Log(Cat = "Check For Big Orders from customer xyz" , result;  &amp;gt; [EmailService].Email(result , "LargeOrder receviec" ,"person who wanted to know"@nobody.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basically take the input from a specified event and send it to a dynamically  service. The code would be compiled and loaded into a DB , a dynamic host would automatically load this service and keep it running,  &lt;br /&gt;
&lt;br /&gt;
With powershell ( and UNIX) adminstrators have been using this power for a long time  ( more for reviewing data then events though )  extending it to business events is something else.  &lt;span style="font-weight: bold;"&gt;It could &lt;/span&gt;lead to much quicker small applications being developed , the above example would normally require an application to be written but with some Enterprise infrastructure things could be written really quickly,  This is not really posisble with tradition systems as DB access is normally tightly controlled ( for good reason) and there are no events to trigger things and polling would be inefficient . Note EDA does need protection against a loop &lt;br /&gt;
&lt;br /&gt;
This would be bad.&lt;br /&gt;
&lt;br /&gt;
Order ProcessOrder(Order order) { return order)   &amp;lt;OrderService.NewOrderEvent("/orders/order[Customer=xyz]"   &amp;gt; OrderService.AddOrder(result); &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Filter and Replace &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In many cases i thought the flexability of EDA can be very usefull in critical systems such as defence ,finance markets etc  , remember  in the first gulf war the Ewacs ( control planes for the whole air war)  shut down because they were overload. They had people look at the bugs and uploaded a new version the next day ,but this sort of thing can cost the lives of many people . &lt;br /&gt;
&lt;br /&gt;
Even if it is some sort of fundamental problem like the hardware cant handle the load ,with EDA i could have build a simple service that subscribed to requests from the first service and have all the systems point to the new service.   This service would consist entirely of an xpath expression which would eliminate excess data by distance or some other dependency. &lt;br /&gt;
&lt;br /&gt;
So we need to change the current event to move to a different port and put a new service which filters events to a new port. &lt;br /&gt;
 &lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Filter  and Extend&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Similarly to the  above if you had extra computers and were overloaded you could add more with no impact on the system just some reconfiguration&lt;img src="http://www.shanghai-software.com/blog/aggbug/40.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/04/05/40.aspx</guid>
            <pubDate>Sun, 05 Apr 2009 09:16:31 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/40.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/04/05/40.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/40.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/40.aspx</trackback:ping>
        </item>
        <item>
            <title>Eventing with and without Topics</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/02/21/eventing-with-and-without-topics.aspx</link>
            <description>While WS-Eventing has no support for Topics ( see last post) it is almost essential for efficient  processing of messages if you have a large amount of subscriptions. &lt;br /&gt;
&lt;br /&gt;
Consider the case of 10,000 Subscriptions for 10,000 Notification you are looking at 10^8 expensive xPath comparisons which will bring many servers down to its knees. &lt;br /&gt;
&lt;br /&gt;
With EDA we can easily solve this problem ( compare to an overloaded DB) .&lt;br /&gt;
&lt;br /&gt;
Lets say we have a Topicless share pricing feed  something like &lt;br /&gt;
&lt;br /&gt;
&amp;lt;Trades&amp;gt;&lt;br /&gt;
&amp;lt;Trade&amp;gt;&lt;br /&gt;
&amp;lt;Symbol&amp;gt;BHP&amp;lt;/Symbol&amp;gt;&lt;br /&gt;
&amp;lt;Price&amp;gt;38.12&amp;lt;/Price&amp;gt;&lt;br /&gt;
&amp;lt;Volume&amp;gt;10000&amp;lt;/Volume&amp;gt; &lt;br /&gt;
&amp;lt;Exchange&amp;gt;ASX&amp;lt;/Exchange&amp;gt;&lt;br /&gt;
&amp;lt;/Trade&amp;gt;&lt;br /&gt;
&amp;lt;/Trades&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now WS-Eventing has a really nice feature in that subscriptions can force notifications to contain a header this header can be a Topic. Even better the EndTo can be another WS-Eventing server.  With EDAm this is even easier as this subscription can be loaded in the configuration of the Notification server. &lt;br /&gt;
So we create subscriptions and organise the data  eg  by exchange then by group. &lt;br /&gt;
&lt;br /&gt;
What we want is &lt;br /&gt;
&lt;br /&gt;
ShareData&lt;br /&gt;
ShareData.Exchange.Group. Symbol. &lt;br /&gt;
&lt;br /&gt;
That way actual clients can subscribe to the specific information they need ( most likely Symbol or Group )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Main Server (where the original feed enters)  &lt;br /&gt;
Topicless (Default mode) &lt;br /&gt;
&lt;br /&gt;
2nd Server ( Runs in Must have topic and server always loads all subs from Topic) &lt;br /&gt;
Subscriptions in the config file ( or Data ) break the data down&lt;br /&gt;
&lt;br /&gt;
Subscription for Exchange add topic&lt;br /&gt;
&lt;br /&gt;
eg Xpath filter =  /Trades/Trade/Exchange="ASX"   Header in subscription&lt;br /&gt;
 &amp;lt;Topics&amp;gt; ShareData.ASX&amp;lt;/Topics&amp;gt; &lt;br /&gt;
&lt;br /&gt;
we add one subscription for each exchange &lt;br /&gt;
We add subscription for each  group and each code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
eg Xpath filter =  /Trades/Trade/Exchange/Symbol="BHP"   Header in subscription&lt;br /&gt;
 &amp;lt;Topics&amp;gt; ShareData.ASX.MetalsAndMining&amp;lt;/Topics&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We now have 2 services ( the 2nd one can become many services if the load justifies it  ( not needed for a cloud) )  and people can make a subscription based on the Topic and get just the data they require  Better yet they can make subscription based on a cheap topic filter which would be orders of magnitude faster than xPath ( and is easier for the engine to index) . . &lt;br /&gt;
&lt;br /&gt;
Lets have a look at the data , lets asume all these subscriptions are group subscriptions  ( 20  groups * 500 subscriptions)   , now each Group will have 500 Notifications . The engine now only has to process  each of those notifications for 500 subscriptions  so we have 20 * 500 * 500  = 5,000.000 operations ( a 20 fold reduction) . O ( n* m) vs  O( n * m/log(n) )  . Taking into account the difference in performance between a simple topic filter and Xpath you would be looking at 2-3 orders of magnitude improvement. which could correspond to 1 server instead of 200. &lt;br /&gt;
&lt;br /&gt;
This translates into a simpler , more responsive and more cost effective system. With EDA ( and especially EDAM ) this reconfiguration could be done with no changes in code.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/34.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/02/21/eventing-with-and-without-topics.aspx</guid>
            <pubDate>Sat, 21 Feb 2009 12:17:16 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/34.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/02/21/eventing-with-and-without-topics.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/34.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/34.aspx</trackback:ping>
        </item>
    </channel>
</rss>