<?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/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>Technology Musings &#187; Service Oriented Architecture (SOA)</title>
	<atom:link href="http://www.technologymusings.com/category/softwaredesign/soa/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.technologymusings.com</link>
	<description>Thoughts about Technology and Startup&#039;s</description>
	<lastBuildDate>Thu, 19 May 2011 18:57:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Back From The Dead</title>
		<link>http://www.technologymusings.com/back-from-the-dead/</link>
		<comments>http://www.technologymusings.com/back-from-the-dead/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 16:25:00 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[Nebility]]></category>
		<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software as a Service]]></category>
		<category><![CDATA[Solution Design]]></category>
		<category><![CDATA[Technology Startups]]></category>
		<category><![CDATA[Technology Strategy]]></category>
		<category><![CDATA[CIO]]></category>
		<category><![CDATA[Technology Startup]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=225</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/back-from-the-dead/">Back From The Dead</a> </p><p>Well looking back at the last blog post I did, it's been over a year since I wrote it and I thought I would provide some insight into why the long hiatus.</p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/back-from-the-dead/">Back From The Dead</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/back-from-the-dead/">Back From The Dead</a> </p><p>Well looking back at the last blog post I did, it&#8217;s been over a year since I wrote it and I thought I would provide some insight into why the long hiatus.</p>
<p>As any of you who read my Bio here on the blog know, I had been working for IBM as Executive IT Architect for Financial Services when I wrote the last post, a role which I really enjoyed. One of the problems with the role though as it pertained to this blog was that I found myself constantly having to abandon articles out of concern about whether someone at IBM would feel it was against the official company party line. Particularly, since a number of IBM executives subscribed to this blog. Now in IBM&#8217;s defense they never gave me any grief over this blog and in fact encouraged myself and others to blog openly so this was more my choice to stop for a while in an attempt to remove any potential conflict of interest.</p>
<p>Another factor that made me stop blogging was the fact that I was already considering starting a new company and was being particularly careful about what I did or wrote during my employ, again to make sure I did not violate any potential IP agreements or other implied contracts. This is an area, if any of you read blogs from Venture Capitalists such as <a href="http://www.feld.com/wp/">Brad Feld</a>, <a href="http://www.bothsidesofthetable.com/">Mark Suster</a> or others, where many founders are not sufficiently careful and can get themselves and their new firm into trouble, before it even starts. So when combining these two issues I felt it was best to take a vacation from blogging until such time as any potential conflict of interest was removed.</p>
<p>Now is that time.</p>
<p>As of the end of September 2010, I have left IBM and started a new company with a couple of senior colleagues of mine, who will be introduced here over time.</p>
<p>The company is called <strong><a href="http://www.nebility.com">Nebility</a></strong> and it will be focused on a couple of areas:</p>
<ol>
<li><span>We will be designing both custom and shrink wrapped commercial software which we will offer as both stand alone and as Software as a Service (SaaS) offerings</span></li>
<li><span>We will be doing some consulting to other firms where it is focused on helping them design and build custom Service Oriented Architecture (SOA) based applications</span></li>
<li><span>We are developing an integrated library of enterprise caliber, prebuilt service components for a range of uses which acts as an accelerator for 1 &amp; 2 and which we are calling <strong><a href="http://www.nebility.com/enterprise-saas-solutions/software-as-a-service-sdk/">NebulaBlocks</a></strong>.</span></li>
<li><span>We are also developing some very advanced, proprietary technology which will help us do items 1, 2 and 3 and which we believe provides us with a game changing competitive advantage. So for now I will remain quiet about it <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="http://www.technologymusings.com/wp-content/uploads/2011/02/wlEmoticon-winkingsmile.png" alt="Winking smile" width="19" height="19" />.</span></li>
</ol>
<p>So, what does all of this mean for this blog? Well it means:</p>
<ol>
<li>I will be back to blogging and this time with fewer restrictions than before.</li>
<li>We will also be starting a blog on the <strong>Nebilty</strong> web site at <a href="http://www.Nebility.com">www.Nebility.com</a><strong> </strong>and will be dividing articles between the two depending on their focus. More on this to follow.</li>
<li>Some of my colleagues in this new venture will also be blogging on this site and the Nebility blog and will thus provide additional perspective reflecting our individual areas of expertise and specialization</li>
</ol>
<p><span>So you may be wondering how will the two blogs TechnologyMusings.com and the <a href="http://www.nebility.com/enterprise-solutions-done-right/">Nebility.com blog</a> be divided? While we don&#8217;t think there will be a really hard and fast rule our plan is as follows:</span></p>
<ol>
<li>TechnologyMusings.com will cover a range of topics including discussions of technologies including our experiences as we play with new technologies that we are evaluating and using for nebility.  Technology Musings will also have material on startup issues and considerations were are deliberating as we go through this startup journey.  It will also include general rants and wide ranging discussions about whatever strikes our fancy on any given day.</li>
<li>The Nebility.com blog will attempt to focus almost exclusively on business and technology discussions,  how-to type articles at both the design and implementation level (much like I have done here on this blog in the past).  On the Nebility blog we will also discuss a lot about business and technology strategy, Service Oriented Architecture (SOA), Software as a Service (SaaS) and issues and challenges in specific application verticals we are working on.  In addition we will also cover general issues and frustrations experienced by ourselves and our customers with enterprise software and other related topics.</li>
</ol>
<p><span>We will post a link to any articles which are posted on the Nebility bog, here on TechnologyMusings where appropriate, but we would encourage you to subscribe to both blogs to be sure to catch all of the articles.</span></p>
<p><span>In addition, you will notice that there is a new layout to the blog and some new features which we hope will allow you to reach us and interact with us better. </span></p>
<p><span>Well that’s about it for now.  I hope you enjoy the new articles on both blogs.</span></p>
<p><span> </span></p>
<p>As always, you can reach me through the comments, at <a href="http://www.nebility.com">Nebility</a>, on <a href="http://www.twitter.com/techmusings">Twitter</a>, <a href="http://www.linkedin.com/in/paulkmichaud">LinkedIn</a> or by using the <a href="http://www.technologymusings.com/expert-technology-advice">Ask the Experts</a> form.</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/back-from-the-dead/">Back From The Dead</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/back-from-the-dead/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consideration For The Technical Implementation of an SOA</title>
		<link>http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/</link>
		<comments>http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 20:35:42 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=152</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/">Consideration For The Technical Implementation of an SOA</a> </p><p>System architects and programmers often don't consider the performance needs of their systems ...</p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/">Consideration For The Technical Implementation of an SOA</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/">Consideration For The Technical Implementation of an SOA</a> </p><p>I had a lot of questions from people after my last post on <a title="BPM approach to SOA" href="http://www.technologymusings.com/softwaredesign/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails">BPM and SOA</a> about the layered SOA I proposed and whether it would be slow performance wise.  The answer I gave people was &#8220;It depends&#8221;.  In this post I will outline in more detail some of the considerations needed around performance when implementing an SOA or any system for that matter.</p>
<p>Firstly, I find over the last 10-15 years system architects and programmers often don&#8217;t consider the performance needs of their system enough when designing it.  The process most people follow is typically:</p>
<ol>
<li>Code the system up (or at least a prototype)</li>
<li>Run a small performance benchmark</li>
<li>Size the hardware to get the desired performance</li>
</ol>
<p>To be honest this drives me crazy as it often yields a very non-performent system and if the performance is not achieved with hardware at step 3 then its too late in most cases to do anything about it without going back and severely refactoring the code or worse yet rewriting it all together.</p>
<p>Years ago this was not the case because the hardware was too slow to assume you could easily find a big enough box to ensure you achieved your performance goals.  As a result programmers pre about 1993 thought very carefully about how they designed and implemented their code with performance front of mind before even a single function got coded.  But once the bigger SMP UNIX boxes started coming out, programmers got sloppy to the point where today most of the younger programmers (those who started commercial programming post say 1997 <img src='http://www.technologymusings.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ) I come across, have not been taught how to evaluate the effects of their technology or programming decisions, when it comes to impacting performance.</p>
<p>In the old days programmers were taught that when implementing any function or procedure to consider the Order &#8220;O&#8221; of their algorithm.  We worried about whether it was Order N, N Log N, N^2 or God forbid N^3 or worse.  If we could replace an O(N^2) algorithm with one that was O(N Log N) we did.  The same mind set should be employed today as well when writing code, but more importantly it should be employed at a higher level when deciding the language, interface types, message formats, I/O pattern, network topology and database design.</p>
<p>Let me explain:</p>
<p>Consider our Layered SOA from the last post (shown again here for reference):</p>
<p><img class="aligncenter size-full wp-image-153" title="Point Of Sale" src="http://www.technologymusings.com/wp-content/uploads/2009/09/Point-Of-Sale1.JPG" alt="Point Of Sale" width="1371" height="561" /></p>
<p>This is in principle a logical architecture which we can choose to realize in a number of ways and with a range of languages, interface protocols, hardware choices, network topologies, etc.</p>
<p>So the first thing you need to consider at a high level is whether you are designing the system for throughput, latency/response time or both.  This is important, because depending on what the system needs to achieve, you should be making potentially dramatically different technology choices.  For example, if I am building an ultra high performance stock exchange system that does 5 million transactions per second and has a response time target end to end of 100 microseconds, then certain technologies are out right off the bat They include but are not limited to:</p>
<ul>
<li>I can&#8217;t use Java or c# as the languages themselves and the implementations of the base language libraries do not lend themselves to low latency.  I could use them to achieve the high throughput but I will not get to 100 microseconds as a rule (there are some ways to get close by using Java like C, pre-compiling, ensuring no garbage collection is used, etc but its a pain)</li>
<li>I can&#8217;t build it on windows at all, because of the overhead and the slow network stack</li>
<li>I can&#8217;t use persistent queue based messaging</li>
<li>No traditional database transactions in the critical path (in fact no on disk I/O at all)</li>
<li>No XML anywhere</li>
<li>And definitely no REST or SOAP Web Service Interfaces</li>
</ul>
<p>The key is that while all of these technologies can be used in a high throughput system,  they are inherently not fast from a latency or response time perspective, so if you choose to use them for a system that needs ultra fast response times, you are dead from the word go because no amount of hardware will fix it.<br />
It is important to keep in mind the time it takes for basic operations as well so that you can roughly gauge in advance what your system will be capable of.  Here is a list of rough performance measures for common operations.  Your mileage will vary based on specifics such as hardware, compiler, database, etc but the order of magnitude &#8220;O&#8221; will be about right regardless. These are approximations based on say a 2.8 GHz Xeon. Newer Nehalems, etc will do better.  Also these are for a single thread on a single core.  Most won&#8217;t benefit from multithreading.  Also keep in mind that to an extent the lower the latency or response time of the system the higher throughput it can handle per core as CPU&#8217;s free up faster, so getting this right is important for all systems.   So here they are:</p>
<ul>
<li>Network hop from desktop to remote web server                                              50-500 milliseconds</li>
<li>Persistent Message (small) per hop                                                                       15-30 milliseconds</li>
<li>Non-Persistent Queue based messaging (small) per hop                                2-5 milliseconds</li>
<li>Database Insert (Complex)                                                                                     15-30 milliseconds</li>
<li>Database Insert (Simple)                                                                                        3-10 milliseconds</li>
<li>Database Select (Complex)                                                                                    10+ milliseconds</li>
<li>Database Select (Simple)                                                                                       500 microseconds-3 milliseconds</li>
<li>Binary Write to Traditional Disk                                                                        2-5 milliseconds</li>
<li>Binary write to SSD                                                                                                25 microseconds</li>
<li>Screen Refresh                                                                                                          10-15 milliseconds</li>
<li>Web Service Call inside a Web Server (Small Payload Java or C#)         1-5 milliseconds</li>
<li>Web Service Call using GSOAP or Systinet (C no server)                           200-400 microseconds</li>
<li>Binary RPC Call (small payload Java or C#)                                                 50-100 microseconds (local machine plus network roundtrip if remote)</li>
<li>Binary message based function call (Small, C , Infiniband)                     1-2 microseconds in shared memory space, 5-10 microseconds remote through a switch</li>
</ul>
<p>Anyhow this list is by no means exhaustive.  Response times will increase with the size of the message payload, amount of XML to serialize/deserialize, complexity of the database query, etc.  What&#8217;s important to the system designer is the order of magnitude of the performance given the non-functional targets for the system.  Knowing what is possible for a given operation or technology should shape both your design and technology selection.</p>
<p>So armed with this,  lets revisit the questions I got re the performance impact of the layered approach vs a non-layered one to see what happens.  Let assume the following:</p>
<ul>
<li>We implemented the physical architecture exactly as the Logical one is laid out with each service component on a separate machine</li>
<li>We used SOAP web services for every public function call</li>
<li>Assume 1 Gigabit Ethernet networking in the data center (worst case)</li>
</ul>
<p>So lets look at the effects of layering on the Customer Service which adds an extra layer in the proposed design.</p>
<p>Lets assume we just want to retrieve a basic customer record.  In a single layer design with one database behind the service we have the following main costs:<br />
Network Hop Application to Customer Service                                                                  200-500 microseconds<br />
Find Customer Web Service Call                                                                                            1-5 milliseconds<br />
Complex query doing a join across multiple tables for name, addresses, etc           10 milliseconds<br />
Internal Logic Code execution                                                                                                Implementation and Process dependant</p>
<p>Now lets look at the layered costs:<br />
Network Hop Application to Customer Service                                                                200-500 microseconds<br />
Find Customer Web Service Call                                                                                          1-5 milliseconds<br />
Parallel Network round trips                                                                                                200-500 microseconds<br />
Second Layer Parallel Web Service Calls                                                                          1-3 milliseconds<br />
Parallel Simple Queries                                                                                                          500usec &#8211; 3 milliseconds<br />
Internal Logic Code execution                                                                                              Implementation and Process dependant</p>
<p>And I would contend that you can do better by using a binary call for internal Component to Component calls, reducing the 1-5 milliseconds down to more like 50-100 microseconds.</p>
<p>So if you add it up,  you will see that not only did the layered approach potentially improve total end to end latency but it definitely improved throughput of the system.  You should now be scratching your head wondering how that happened.  There is at least one major assumption here and that is that each Service Component had its own independent database.  This allowed the queries in the Layered approach to happen in parallel and the queries are themselves dramatically simpler with potentially no joins, etc.  If we still have one single database,  then performance will be bottlenecked there are we won&#8217;t see as much gain.  Even then at worst, if the queries take the same 10 milliseconds, we added about 1-3 milliseconds to the total end to end time.  Depending on the amount of time spent in the implementation specific code, that&#8217;s about 10-20% slower latency worst case (and still less than the cost of a single screen refresh so a user won&#8217;t notice it unless its enough to cause the total system to queue up throughput wise) but in return we got much better throughput and much more reuse.</p>
<p>Anyhow,  the point is, when designing a system and coding it,  you really should think about these types of things before you get so far down the road that you realize you have a problem only when you&#8217;re in it up to your neck and can&#8217;t easily do anything about it.</p>
<p>Feel free to fire away with the questions here or on Twitter (<a title="@TechMusings" href="http://twitter.com/techmusings">@TechMusings</a>)</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/">Consideration For The Technical Implementation of an SOA</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/consideration-for-the-technical-implementation-of-an-soa/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Why a Business Process Modeling (BPM) Approach to SOA Usually Fails</title>
		<link>http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/</link>
		<comments>http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 13:16:39 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=143</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/">Why a Business Process Modeling (BPM) Approach to SOA Usually Fails</a> </p><p>I find that when people take a BPM centric approach to SOA, it usually ends up not delivering the goods. </p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/">Why a Business Process Modeling (BPM) Approach to SOA Usually Fails</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/">Why a Business Process Modeling (BPM) Approach to SOA Usually Fails</a> </p><p>I was having a Twitter conversation with Brenda Michelson (@bmichelson) and Todd Biske (@toddbiske) about the tight coupling in peoples minds between BPM and SOA, and why I find that when people take a BPM centric approach to SOA, it usually ends up not delivering the goods.  So today&#8217;s post is about how to properly layer your SOA to include BPM while still yielding all the flexibility and reuse that is the promise of a well done SOA.</p>
<p>For this discussion I will build on the terminology defined in the post entitled &#8220;Anatomy of a Service Oriented Architecture&#8221;.  I will also use 2 simplified application examples to illustrate some of the pitfalls.</p>
<p>So here is our base example.  Imagine that you need to build  a very simplified Point of Sale System.  It needs to be able to log people in, update customer records and perform a transaction, including updating inventory.  For the sake of argument, I will propose it should look something like this (not 100% accurate but best I could do in 20 minutes).  Sorry the pictures are a bit hard to read.  I need to change templates to get something wider.</p>
<p><img class="aligncenter size-full wp-image-144" title="Point Of Sale" src="http://www.technologymusings.com/wp-content/uploads/2009/09/Point-Of-Sale.JPG" alt="Point Of Sale" width="1148" height="561" /></p>
<p>Furthermore, I will contend that people following a BPM centric approach to SOA are usually likely to design it like this:</p>
<p><img class="aligncenter size-full wp-image-145" title="Point Of Sale-BPM" src="http://www.technologymusings.com/wp-content/uploads/2009/09/Point-Of-Sale-BPM.JPG" alt="Point Of Sale-BPM" width="869" height="461" /></p>
<p>and that too often with SOA design we see something like this (which is really bad)</p>
<p><img class="aligncenter size-full wp-image-146" title="Point Of Sale-BAD" src="http://www.technologymusings.com/wp-content/uploads/2009/09/Point-Of-Sale-BAD.JPG" alt="Point Of Sale-BAD" width="428" height="478" /></p>
<p>So lets look at these starting from the bottom one which, sad to say represents about 75+% of &#8220;SOA&#8221; implementations I tend to see.</p>
<p><strong>Point of Sale &#8211; Badly Done Case:</strong><br />
This last example is what you get when people decide they need to be SOA, but frankly have no idea how to decompose a problem or do component based design.  It is also what you get when people decide SOA means you just slap a web service interface onto a monolithic legacy app so you can call it SOA to please senior management who have heard all the buzz, and decided they just have to have an SOA by next week to save cost, etc.  This approach buys the company absolutely nothing and in fact only slows down the performance of the existing system and certainly provides no flexibility and reuse at all.</p>
<p><strong>Point of Sale BPM Centric Case:</strong><br />
In the BPM case we will have identified our main processes:</p>
<ol>
<li>Customer Lookups, etc</li>
<li>Authenticating a User</li>
<li>Processing a Transaction</li>
</ol>
<p>We would then set about to design service interfaces which align to those and they would look something like this:</p>
<p><strong>1. Customer Service:</strong></p>
<p>1.1 Create Customer<br />
1.2 Update Customer<br />
1.3 Lookup Customer<br />
<strong>2. Authentication:</strong></p>
<p>2.1 Create User<br />
2.1 Update User<br />
2.3 Delete User<br />
2.4 Login<br />
3. <strong>Transaction:</strong></p>
<p>3.1 Record Transaction<br />
3.2 Void Transaction</p>
<p>Each of those service interfaces more often than not end up being tightly coupled to a back end database which exposes stored procedures which are also tightly aligned to those process services. Its basically a client server design behind the service interfaces, and while I drew them as 3 separate databases supporting each service,  more often then not I will see no decoupling under the covers and it will be one big database.<br />
Now, in this case we have a better design (but still not good) which shows some process orientation and some componentization. This design will offer some reuse, albeit limited.  In addition this system will suffer from some data duplication (consider Paul Michaud as User and Paul Michaud as Customer.  This design would store the records twice for Paul Michaud) which is not desirable in a good SOA.</p>
<p><strong>Point of Sale &#8211; Layered Case:</strong><br />
I will contend that this design is optimal (or at least as optimal as I could draw in 20 minutes).  It provides for the same level of BPM support,  but does not require any data duplication and allows for the maximum reuse.  I am not going to go into details on how one would come up with this design in this post but I will come back to that in another post soon.</p>
<p>To prove the point, lets now consider the need to create a second application to do simple contact management.  We would ideally like to reuse our SOA and layer the new application on top of what we already built.  I will contend that for this second application only the layered design would offer any reusable components for this second application.  I will propose the following simple design for the Contact Management Application using SOA.</p>
<p><strong>Contact Management:</strong></p>
<p><img class="aligncenter size-full wp-image-147" title="Contact Management Simple" src="http://www.technologymusings.com/wp-content/uploads/2009/09/Contact-Management-Simple.JPG" alt="Contact Management Simple" width="500" height="450" /></p>
<p>Notice that we are using the party service not a Customer Service or anything else.  A contact may be a Company, Organization, Church, Personal friend, etc.  If we had only build Customer Services as in design 2 &amp; 3, which is what the BPM approach would have identified we would not have had a foundation on which to build this second application (unless that second application was very similar to the first one).</p>
<p>Anyhow,  the point is that by focusing on the process we usually fail to identify the necessary Foundation Services or the Fundamental Data Objects on which the SOA should be operating.  I will elaborate on this further in a later post.</p>
<p>As always feel free to leave comments here or on Twitter.com (@techmusings).</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/">Why a Business Process Modeling (BPM) Approach to SOA Usually Fails</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/why-a-business-process-modeling-bpm-approach-to-soa-usually-fails/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>How To Build an SOA Based, High Performance, Scalable and Reliable Twitter on Steroids</title>
		<link>http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/</link>
		<comments>http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 17:30:07 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[High Availability (HA)]]></category>
		<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=109</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/">How To Build an SOA Based, High Performance, Scalable and Reliable Twitter on Steroids</a> </p><p>Over the past few days I have been having some issues with my Twitter account.  Beyond the well known pauses in the service, outages, etc there are some less known but more annoying problems with twitter search.  It turns out that many accounts don&#8217;t show up in search at all.  Therefore, if you are one ...</p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/">How To Build an SOA Based, High Performance, Scalable and Reliable Twitter on Steroids</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/">How To Build an SOA Based, High Performance, Scalable and Reliable Twitter on Steroids</a> </p><p>Over the past few days I have been having some issues with my Twitter account.  Beyond the well known pauses in the service, outages, etc there are some less known but more annoying problems with twitter search.  It turns out that many accounts don&#8217;t show up in search at all.  Therefore, if you are one of those lucky accounts, no one other than direct followers can see your tweets and no one can find you or any of your Tweets.  This makes the accounts pretty useless.  It also turns out its been a know issue with no fix for over a year other than to create a new account and tweet with that.  Well it turns out that my account was one such account which needless to say was very annoying and cost me 2 days of my time trying to figure out a viable work around.  As a result, Twitter earned the place of honor in today&#8217;s blog.</p>
<p>Now in the defense of Evan Williams, Biz Stone and the rest of the gang at Twitter, they find themselves in the enviable position of having a hugely successful product on their hands which has no doubt outpaced their wildest growth projections over the past few years and thus put stress on their design and everything else.  I on the other hand have the advantage of 20/20 hindsight and thus in this blog we can design Twitter on Steroids from scratch using technology that was not even available when Twitter was conceived.  I know the Team at twitter is busting their butts to keep up with their phenomenal growth and my hats of to them for their success.</p>
<p>So for those who have not read my Bio, I have been designing and building ultra high performance systems for the World&#8217;s Largest Banks and Stock Exchanges for about 25 years.  Just this June a couple of colleagues of mine and I designed and ran a stock exchange prototype system capable of 4.5 million transaction per second with round trip response time as low as 15 microseconds (yes that&#8217;s microseconds for multiple network hops, I/O, parsing, matching and the whole shebang, everything the NYSE does to tell you that you just bought 100 shares of IBM).  We also showed this system can scale linearly for throughput by adding hardware, was fully fault tolerant and could do dynamic load balancing if traffic at the exchange spiked.  In this design, I will be leveraging the lessons learned over that 25 years and the technologies used for the system above.</p>
<p>So lets dive in.</p>
<p><strong>Requirements:</strong><br />
So what does our Twitter on Steroids need to do.  Here is my overly simplistic list of requirements (I am only going to deal with the big ones):</p>
<p><strong>Functional Requirements:</strong><br />
The system shall allow users to create accounts.<br />
The system must provide a means for users to submit Tweets<br />
The System must persist those Tweets<br />
Users shall be able to follow other users Tweets<br />
The system shall provide a mechanism to search Tweets</p>
<p><strong>Non-Functional Requirements:</strong><br />
The system shall be highly responsive<br />
The system shall maintain response times even under load<br />
The system shall be highly scalable<br />
The system shall be highly available with 99.999% or better uptime (its doable)</p>
<p><strong>Where Do We Start?</strong></p>
<p>First some design principles:</p>
<ul>
<li>We will use a componentized SOA design</li>
<li>The Twitter Web Site will use the same Service API that is exposed publicly</li>
<li>The System will use a Hot/Hot High Availability Model based on component replication for reliability</li>
<li>All Service Components will be implemented in a manner that ensure deterministic behaviour (Easiest way to do that, but not the only way, is to make it single threaded which is what we do for most exchange systems.  Thread context switches are expensive at speed and multithreading can result in coherency issues which Twitter seems to be suffering from based on the comments on their support site)</li>
<li>To the maximum extent possible all I/O, remote Service calls, etc will be asynchronous</li>
<li>All internal communication will be message based using multicast for efficiency</li>
</ul>
<p><strong>About the Technology</strong><br />
I don&#8217;t normally like to reference specific technologies in my blog but in this case I am going to as there are a couple which provide unique capabilities to implement this system design, and which people are probably not familiar with.  Apologies in advance for the product plug.  They are as follows:</p>
<p><strong>Websphere MQ Low Latency Messaging (LLM):</strong><br />
LLM is a unique high performance messaging product that has some purpose built capabilities specifically designed for ultra high throughput, low latency, transactional systems.  For one it&#8217;s the fastest messaging available on the market, capable of throughput in excess of 9 million Tweets per second per connection, and latency application to application across a switch as low as 3 microseconds with Infiniband Networking and about 12 microseconds with 10Gbe.<br />
More important than its speed for this type of application though is its unique high availability mechanisms.  LLM provides a unique mechanism that allows me to deliver messages to a primary and secondary Service Component at speed, while maintaining total order across all receivers.  In addition it provides unique mechanisms to perform failure detection, failover, state synchronization and component replication all at speed.  In exchange systems,  LLM has detected and failed over from a primary system to a backup in as little as 7 milliseconds, with no loss of messages or duplication and no system level down time even though a component failed.</p>
<p><strong>Datapower XM70:</strong><br />
This is an appliance that was originally designed for Web Service and Web Edge Security.  This model is specifically enabled to work with LLM above.  It will allow us to expose REST or SOAP based services and convert them to message based for internal consumption.  The XM70 can also do content based routing, parsing and transformation for us on the fly at wire speed taking load of the back end Service Components.</p>
<p><strong>XIV Storage:</strong><br />
This is a low cost storage appliance that has great throughput and reliability.  I have been able to sustain write speeds with this in excess of 5.5 Gb per second per intel box writing to it.</p>
<p>The rest we can use pretty commodity stuff.  The disk above can also be easily swapped for your preferred flavour,  this one just has great price performance.</p>
<p><strong>What Does Twitter on Steroids Look Like?</strong></p>
<p>My version of Twitter on Steroids would look like this (except I didn&#8217;t have room on the drawing to add the Account Management Service Componets or the Follower Service Components, so just imagine they are in the diagram and follow the same pattern <img src='http://www.technologymusings.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ):</p>
<div id="attachment_111" class="wp-caption aligncenter" style="width: 631px"><img class="size-full wp-image-111" title="Twitter On Steroids" src="http://www.technologymusings.com/wp-content/uploads/2009/08/TwitterOnSteroids.jpg" alt="Twitter on Steroids" width="621" height="839" />
<p class="wp-caption-text">Twitter on Steroids</p>
</div>
<p>So let&#8217;s walk through this diagram.</p>
<ol>
<li>Firstly we are using Big IP to load balance across the Web Servers and also across the Datapower appliances.  This is pretty standard Web design no surprises.  The BIG IP could also do this to a remote backup site as well if configured correctly, where we could twin this setup for failover or load balancing.  Or we could put the Instance 2&#8242;s in the second site.  It just depends on the SLA&#8217;s you are trying to meet.  The logical design and coding would not change regardless.</li>
<li>The Web Servers are making calls through the Datapower to the back end Services Components just like the external API calls.  This ensures consistent behaviour and reduces the need to test and maintain two API&#8217;s</li>
<li>Datapower is converting all REST and SOAP payload into messages on top of LLM</li>
<li>This is important.  Datapower is multicasting all messages out of the appliance using LLM&#8217;s high availability mechanisms.  It is also putting those messages on different topics based on the content of the message.  I am suggesting partitioning the incoming Tweets based on the first few letters of the Tweeter&#8217;s ID.  The first 2 letters will do to start giving us 676 topics to work with for load balancing.  We can add more topics for finer partitioning later if need be.</li>
<li>LLM is delivering the messages throughout the systems and also providing all the reliability.  It handles NAK&#8217;s and ACK&#8217;s automatically, retransmissions, etc to asssure messages get where they need to be without any additional work by the application.</li>
<li>Tweets are first picked up by the Tweet Capture Service Components.  Each partition subscribes to and handles a subset of the topics in order to provide load balancing.  It is possible to add an external system which monitors load per topic and dynamically changes the subscriptions to adjust load.  Also by partitioning, we can use multiple databases in parallel thus eliminating the databases as a bottleneck, throughput wise.</li>
<li>I/O, in the Tweet Capture Service Components, is Asynchronous providing very fast response times.  We can batch write the tweets for higher throughput and because we do compoent replication using LLM,  if the primary Instance 1 fails, Instance 2 just takes over where it left off with no loss of messages or duplication.</li>
<li>The Tweet Capture rebroadcasts (multicast) all messages to the Tweet Indexing Service Component.  These are also twinned for High Availability and Partitioned for Scalability.  The indexing component does as the name says and indexes into the tweets and stores a record in a database.  I would recommend an in memory database be used with a traditional database behind it, with bi-directional synchronization of current data between the two.  SolidDB/DB2 is one pair or possibly TimesTen/Oracle is another (but the latter pair is slower).  I/O would be batched and asynchronous again for speed.</li>
<li>When a search request comes in, it would be routed by Datapower to the Search Service Components, which would then query the Indexing Service and receive back the matching records for each key word in the search.  A fast parallel algorithm would then be used to handle any &#8220;or&#8221; or &#8220;and&#8221; statements in the search</li>
<li>These results would be returned to the caller via the datapower box as a response to the original service call.</li>
</ol>
<p><strong>So how fast would this be and how big could it scale?</strong></p>
<p>Well this is just a guess based on my experience and without ever having looked at any specific search algorithms that might be used by Twitter.  Lets assume we write everything in C behind the Datapower for speed and stability and that we use 1Gbe for networking which is the slowest at about 27 microseconds per hop.  All latencies are round trip to and from the Datapower Box.</p>
<ol>
<li>I think for Tweet Capture, we could achieve round trip latency per tweet of about 50-60 microseconds with throughput per partition somewhere in the 100,000-200,000 thousand Tweets per second range if using a fast database and some solid state disk for the database log files, etc.  Even higher if a custom binary file system is used (15,000,000+ Tweets per second which have done with stock orders with similar sized messages)</li>
<li>Similar performance is possible for the Tweet Indexing per partition to that of the Capture</li>
<li>For Tweet Search it a bit tougher to gauge, but I woudl guess it would be about 100-150 microseconds per search depending on the algorithm used.  Throughput should also be well into the 100&#8242;s of thousands per second if in mkemory databases are used.</li>
<li>Response times could be reduced by as much as 25 microseconds per network hop by using Infiniband networking instead of 1Gbe</li>
<li>From a scaling poerspective,  this should be able to scale linearly by adding hardware almost without limit (only limited by the avilable network bandwidth)</li>
</ol>
<p>Now clearly,  this is a simplified case and I am sure there are lots of design details we are missing but I think you get the idea.  A bigger, badder Twitter (or any other app for that matter) is definately possible and by using the SOA pattern, Async I/O, component replication, etc we can do this to almost anything.  So if anyone from Twitter (or any one else for that matter) wants to talk specifics or other examples feel free to leave a comment or reach me on Twitter (@techmusings) any time.</p>
<p>Sorry for picking on Twitter they just seemed like a good example given my struggles.  We all wish we had the &#8220;problems&#8221; that come with such a huge success.</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/">How To Build an SOA Based, High Performance, Scalable and Reliable Twitter on Steroids</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/how-to-build-an-soa-based-high-performance-scalable-and-reliable-twitter-on-steroids/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What&#8217;s in a Cloud (or Not)</title>
		<link>http://www.technologymusings.com/whats-in-a-cloud-or-not/</link>
		<comments>http://www.technologymusings.com/whats-in-a-cloud-or-not/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 20:17:36 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=106</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/whats-in-a-cloud-or-not/">What&#8217;s in a Cloud (or Not)</a> </p><p>I read a lot of articles on technology and it always amazes me the degree of heated debate that goes on in the blogosphere, social media and elsewhere over simple definitions.  What caught my attention today was the number of posts and comments on Twitter about what was or was not Cloud. So the question ...</p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/whats-in-a-cloud-or-not/">What&#8217;s in a Cloud (or Not)</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/whats-in-a-cloud-or-not/">What&#8217;s in a Cloud (or Not)</a> </p><p>I read a lot of articles on technology and it always amazes me the degree of heated debate that goes on in the blogosphere, social media and elsewhere over simple definitions.  What caught my attention today was the number of posts and comments on Twitter about what was or was not Cloud.</p>
<p><strong>So the question is: What is Cloud? </strong></p>
<p>The reality is there is no agreement on this point, so I offer up my own view on this matter for debate.  Feel free to flame away.</p>
<p><strong>The Paul Michaud Definition of Cloud Computing</strong><br />
Any application which can be deployed and scaled (preferably dynamically) against a, potentially globally, distributed cluster of, homogeneous or heterogeneous, compute resources is a Cloud based application.</p>
<p>So what&#8217;s my point?  The point is that almost anything is potentially Cloud based by that definition.  Let&#8217;s look at some examples that were being tossed about today on Twitter and the Blogosphere.</p>
<p>They were:</p>
<ul>
<li>JPMC&#8217;s internal server cluster</li>
<li>Google&#8217;s Cluster</li>
<li>Facebook&#8217;s Clusters</li>
</ul>
<p>James Watters in his &#8220;<a title="Not So Fast Public CLoud: Big Players Still Run Provately" href="http://siliconangle.com/ver2/2009/08/17/not-so-fast-public-cloud-big-players-still-run-privately/">Not So Fast Public Cloud: Big Players Still Run Privately</a>&#8221; contends that&#8217;s JPMC&#8217;s cluster of servers represent an internal Cloud.  James then took some heat from others claiming that a dedicated internal cluster is not Cloud.  The argument then extended to bring in Google and the argument was that it is also a dedicated internal cluster and not cloud, but that Facebooks cluster is a Cloud because they openly admitted to using Hadoop to some extent.</p>
<p>For the record, I think this whole Internal Cluster/ External Cloud debate is all nonsense.  To be honest all of the systems listed above are Cloud in my opinion.  All of them allow for dynamic deployment of processing load against a distributed cluster of compute resources.  From the perspective of the company owning the cluster, its an Internal Cloud.  Once they open it up by providing a public interface into those resources, then its a public cloud resource from the standpoint of an external user of those resources.</p>
<p>Cloud is not the sole property of our latest Web 2.0 startups.  It&#8217;s not a function of some particular piece of software that we collectively decide is &#8220;Cloud&#8221; like Hadoop.  Cloud is a design pattern and a business choice to allow us to take advantage of vast compute resources of all kinds in a more dynamic, efficient and cost effective manner, period.  Furthermore, to effectively use Cloud resources I think you ideally need to be SOA.</p>
<p>Let the Flaming begin.</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/whats-in-a-cloud-or-not/">What&#8217;s in a Cloud (or Not)</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/whats-in-a-cloud-or-not/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>An Anatomy of a Service Oriented Architecture (SOA)</title>
		<link>http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/</link>
		<comments>http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 05:33:46 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=96</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/">An Anatomy of a Service Oriented Architecture (SOA)</a> </p><p>This is the first in a series of articles on Service Oriented Architecture (SOA) that I will be doing over the coming weeks.  Given that every middleware vendor defines SOA differently and every Systems Architect seems to have their own definitions for various aspects of an SOA, I am going to use this first article ...</p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/">An Anatomy of a Service Oriented Architecture (SOA)</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/">An Anatomy of a Service Oriented Architecture (SOA)</a> </p><p>This is the first in a series of articles on Service Oriented Architecture (SOA) that I will be doing over the coming weeks.  Given that every middleware vendor defines SOA differently and every Systems Architect seems to have their own definitions for various aspects of an SOA, I am going to use this first article to present a sample of what I personally think an SOA stack should be comprised of and I will define the major components using a set of consistent terminology that I will use in the coming articles.  I will focus on the technical part of the stack and not items such as Governance (which I personally feel a lack of is one of the major causes for SOA project failure in large corporations), Infrastructure, etc.  We can discuss those in future articles.</p>
<p>So for most of you who have done some rigorous SOA, I apologize in advance for the SOA 101 Tutorial, but I am always amazed at how much people define the pieces of an SOA (or anything else architecture wise) differently, so this next section is purely to provide us with a common set of definitions on which to base further discussion.</p>
<p>Lets look at the following stack which depicts the typical application stack for a single service component.</p>
<div id="attachment_98" class="wp-caption aligncenter" style="width: 385px"><img class="size-full wp-image-98" title="A Simple SOA Stack" src="http://www.technologymusings.com/wp-content/uploads/2009/08/SOA-Stack.JPG" alt="A Simple SOA Stack" width="375" height="750" />
<p class="wp-caption-text">A Simple SOA Stack</p>
</div>
<p>So what are the main parts to this stack, and what is their role.<br />
<strong><br />
Service Component:</strong><br />
This is the true heart of the SOA (not the service interfaces which most people focus on).  The Service Component is that logical unit of code which implements the functionality to support the Service.  The Service Component exposes one or more Services.  A Service Component (at least a foundational one, which I will define shortly) is also usually associated with a data store of some kind.  This can contain data about a fundamental data type (defined below), control data, process, data, etc depending on the nature of the particular service component.</p>
<p><strong>Service:</strong><br />
The Service is a public interface which is exposed by a Service Component.  It can be exposed in a wide array of protocols and need not be just SOAP Web Services.  In fact I will argue that even 20 years ago, that good systems were designed as SOA even though we exposed Services on a socket.</p>
<p><strong>Legacy System Adapter:</strong><br />
It is my personal opinion that any time a Service Component needs to interface to a legacy system, that an Adapter Pattern should be used.  This Adapter performs a number of tasks.  Its primary function is to convert to/from data formats spoken by the legacy system and the common data formats used by the Foundational Service Components.  In order to perform the conversions, it may be necessary for an adapter to interface with many Service Components in order to perform data enrichment or break data apart into its fundamental data types.<br />
<strong><br />
Enterprise Service Bus:</strong><br />
Its common for people to use an ESB, at least on paper.  The definition of the ESB is a bit amorphous in my opinion.  Many middleware vendors will tell you that the ESB contains everything including the kitchen sink functionality wise or else it&#8217;s not an ESB.  Typically people expect the ESB to provide abstraction, dynamic content based routing, optionally process choreography, Security and a boat load of other features.  Personally, if I am going to use an ESB at all, its most likely not much more than an ultrafast messaging layer with none of these bells and whistles, but that is more a function of the fact that most of what I build needs to be ultra high performance (systems capable of millions of transactions per second with response times as low as 20 microseconds, so no room for overhead).</p>
<p><strong>Application:</strong></p>
<p>So no surprise here.  On top of it all is an Application.  An Application is going to combine the functionality which is exposed by many Service Components.  More importantly, if and only if, the SOA is done well, then many Applications can aggregate the functionality provided through the Services, by those same Service Components to meet completely different end user requirements, without change to any component, except those which need to support a specific process or function for a specific Application.  This should be the goal of any SOA.</p>
<p>Here is one more diagram to consider.</p>
<div id="attachment_99" class="wp-caption aligncenter" style="width: 610px"><img class="size-full wp-image-99" title="Layering Service Components" src="http://www.technologymusings.com/wp-content/uploads/2009/08/Composite-Component.jpg" alt="Layering Service Components" width="600" height="550" />
<p class="wp-caption-text">Layering Service Components</p>
</div>
<p>In this diagram I am going to contend that the Role Service Component and the Party Service Component are what I will call Foundational Service Components and that the Customer Service Component is a Composite Service Component.</p>
<p><strong>Foundational Service Component:</strong><br />
I am going to define this in a controversial manner.  I am going to content that a Foundational Service Component has one and only one job and that is to support all actions related to a Fundamental Data Type.  So in the case of the Party Service Component it&#8217;s job is to provide a Service interface and a supporting implementation in the Component which allows a user to Create, Read, Update and Delete Party Data.  That&#8217;s all it should do</p>
<p><strong>Fundamental Data Type:</strong><br />
A Fundamental Data Type is a basic data type, or business object which is typically common across a wide array of applications.</p>
<p><strong>Composite Service Component:</strong><br />
A Composite Service Component is a component which combines the functionality of one or more other Foundational or Composite Service Components.  It may also encapsulate additional functional and data enrichment, business process, etc. In some cases, a Composite Service Component may be purpose built to support one and only one business process or application, where it makes sense to encapsulate a piece of reusable functionality on the server side instead of in the application.</p>
<p>Well this ends our discussion of the basic Anatomy of an SOA.  For those who made it to the end without their brain dripping from their ears, I congratulate you.</p>
<p>Now that we have this common framework and terminology, the next topic will be about &#8220;The Importance of Enterprise Data Modeling for Service Oriented Architecture&#8221;, and will discuss why starting with the service definition without having identified the Fundamental Data Types or the Foundational Service Components leads to an SOA with little to no reusability.</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/">An Anatomy of a Service Oriented Architecture (SOA)</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/an-anatomy-of-a-service-oriented-architecture-soa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>High Availability Series: Series Outline</title>
		<link>http://www.technologymusings.com/high-availability-series-series-outline/</link>
		<comments>http://www.technologymusings.com/high-availability-series-series-outline/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 23:28:02 +0000</pubDate>
		<dc:creator>Paul Michaud</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[High Availability (HA)]]></category>
		<category><![CDATA[Service Oriented Architecture (SOA)]]></category>
		<category><![CDATA[Software as a Service]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.technologymusings.com/?p=69</guid>
		<description><![CDATA[<p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/high-availability-series-series-outline/">High Availability Series: Series Outline</a> </p><p>With all of the talk about reliability, or lack thereof, of SaaS and Cloud based applications, I thought I would write a series on designing applications to be Resilient and Highly Available.  The series sort of started with this post &#8220;It’s Inadequate Design That Lets Systems Fail, Not Whether They Are SaaS or Deployed in ...</p></p><p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/high-availability-series-series-outline/">High Availability Series: Series Outline</a> </p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/high-availability-series-series-outline/">High Availability Series: Series Outline</a> </p><p>With all of the talk about reliability, or lack thereof, of SaaS and Cloud based applications, I thought I would write a series on designing applications to be Resilient and Highly Available.  The series sort of started with this post &#8220;<a title="It's Inadequate Design That Lets Systems Fail, Not Whether They Are SaaS or Deployed in The CLoud" href="http://www.technologymusings.com/softwaredesign/its-inadequate-design-that-lets-systems-fail-not-whether-they-are-saas-or-deployed-in-the-cloud" target="_self">It’s Inadequate Design That Lets Systems Fail, Not Whether They Are SaaS or Deployed in The Cloud</a>&#8220;.</p>
<p>As any of you who have read my Bio are aware, I have spent most of my career designing very large, high volume and high performance applications for the World&#8217;s largest financial institutions.  In these systems High Availability and Reliability is Key, as systems I have been involved in designing carry Trillions of dollars of transactions on them each day.  Also in the Financial Markets world, and down time can cost millions of dollars per minute. We have also been center stage in the evolution of technology and design best practice when it comes to performance and reliability.  We have gone from just using a robust mainframe and assuming it stays up with hot swap hardware to high performance distributed applications handling millions of transactions per second in statefull applications (much harder to make HA than stateless Web apps), where time from failure to detection and takeover by a hot standby can be as little at 7 milliseconds.</p>
<p>The articles which will follow in this series will represent my personal opinion on how this is done.  It is by no means the only way to do it and I am sure others will clearly have other opinions.</p>
<p>Topic&#8217;s will tentatively the following:</p>
<ol>
<li><a title="The Evolution Of Reliability and High Avilability" href="http://www.technologymusings.com/softwaredesign/the-evolution-of-reliability-and-high-availability">The Evolution Of Reliability and High Availability</a></li>
<li>Guaranteeing No Loss Of Data</li>
<li>Designing For Disaster Recovery</li>
<li>Designing For Maximum Uptime In A Distributed World</li>
<li>High Availability in a High Volume Transactional Environment</li>
</ol>
<p>Other topics will be considered based on feedback, user requests or if something just pops into my head.  So if you have a particular question or topic you would like answered just ask and if it is something I feel I can write about, I will.</p>
<p>We will start in the next article in the series with a brief discussion of The Evolution Of Reliability and High Availability.</p>
<p><a href="http://www.technologymusings.com">Technology Musings - Thoughts about Technology and Startup&#039;s</a> <a href="http://www.technologymusings.com/high-availability-series-series-outline/">High Availability Series: Series Outline</a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.technologymusings.com/high-availability-series-series-outline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)

Served from: www.technologymusings.com @ 2012-02-05 02:38:20 -->
