<?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>Gridshore &#187; performance</title>
	<atom:link href="http://www.gridshore.nl/tag/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gridshore.nl</link>
	<description>A weblog about software engineering, Architecture, Technology an other things we like.</description>
	<lastBuildDate>Tue, 13 Dec 2011 15:36:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Using Beet to monitor your (spring framework) application</title>
		<link>http://www.gridshore.nl/2009/09/01/using-beet-to-monitor-your-spring-framework-application/</link>
		<comments>http://www.gridshore.nl/2009/09/01/using-beet-to-monitor-your-spring-framework-application/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 20:07:28 +0000</pubDate>
		<dc:creator>jettro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[beet]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiling]]></category>

		<guid isPermaLink="false">http://www.gridshore.nl/?p=875</guid>
		<description><![CDATA[<p>As a programmer you are writing code. As a designer you are creating solid designs and if you are wise, the code is a good reflection of your design. My previous post was about Domain Driven Design. One of the things I want to repeat is the strong relation between the domain, the design [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gridshore.nl/wp-content/uploads/beet-logo.png" alt="beet-logo.png" border="0" width="225" height="72" align="left" />As a programmer you are writing code. As a designer you are creating solid designs and if you are wise, the code is a good reflection of your design. My previous post was about Domain Driven Design. One of the things I want to repeat is the strong relation between the domain, the design and the code. The best way to accomplish this is to combine the role of designer and implementer. That way you get the best representation of the domain in your solution.</p>
<p>Why this introduction, when I promised to write about performance and monitoring? For performance I see the same relationship. A tester creates the test plan, including the performance test. If you are lucky requirements for monitoring are available as well. Ok, I do not want to combine the role of tester and developer. Still they should both have a very good idea about what the other one does and how you can help each other. Real performance testing is hard and should not be taken to light. Monitoring however can be done on a low level during development. How often have you written log statements like: <em>This method X is executed</em>. Sometimes with a start and end time. Some of you might have used there own aspects to be non intrusive and other might have used a framework.</p>
<p>This blog post is about using a framework to do basic performance measurement and monitoring. The framework I am going to discuss is the <a href="http://beet.sourceforge.net/">Beet framework</a>.</p>
<p><cite>Beet records user behavior and performance data for your Spring-based Java application.  It can thus help you to analyze usage patterns and research production performance issues.</cite></p>
<p>Read on to learn about my experiences with the framework and why I like it to do some basic monitoring.</p>
<p><span id="more-875"></span><br />
<h3>What does it do?</h3>
<p>I am not going to enlist all features, go to the website to find out what it can do for you. Here are some of the features that I like:</p>
<ul>
<li>Very nice integration with spring framework including namespace support.</li>
<li>Manager that does logging of events using a memory and flush mechanism.</li>
<li>Easy configuration to write the logs to disk or database.</li>
<li>Use a binary format for events that is very condensed together with utilities to generate readable xml, csv or database inserts.</li>
<li>Easy http-request monitoring</li>
<li>JMX integration, switching monitoring on and off</li>
<li>Good user manual and well written and documented code.</li>
</ul>
<h3>What does it look like?</h3>
<p>I am using the code of yourscrum to experiment with Beet. <a href="http://code.google.com/p/your-scrum/source/checkout">Check out the code </a>if you want to follow a long.<a href="http://code.google.com/p/your-scrum/source/checkout"><img src="http://www.gridshore.nl/wp-content/uploads/yourscrum_logo.png" alt="yourscrum_logo.png" border="0" width="66" height="81" align="right" /></a></p>
<p>Before you can use Beet, you have to download it. Luckily it is available in a maven repository. More information about the repository and the dependency can be found on the <a href="http://beet.sourceforge.net/downloads">beet download page</a>. For my sample I only included the beet artifact. I downloaded the utils (more on those later) as a tar file. You can find the downloads here: <a href="http://sourceforge.net/projects/beet/files/">http://sourceforge.net/projects/beet/files/</a>.</p>
<p>Now we have Beet available, we should add the namespace defintion to the spring configuration and the first very basic tracking manager to track all http-requests.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
       xmlns:bt=&quot;http://www.mantis-tgi.com/schema/bt/1.1&quot;
       xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
       xsi:schemaLocation=&quot;
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
            http://www.mantis-tgi.com/schema/bt/1.1 http://www.mantis-tgi.com/schema/bt/mtgi-bt-1.1.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&quot;&gt;

    &lt;bean class=&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&quot;/&gt;
	...
    &lt;bt:manager id=&quot;defaultTrackingManager&quot;
                application=&quot;yourscrum&quot;
                register-mbeans=&quot;false&quot;
                flush-schedule=&quot;0/30 * * * * ?&quot;&gt;
        &lt;bt:xml-persister binary=&quot;true&quot; compress=&quot;true&quot; file=&quot;${log.dir}/beet-yourscrum-perf.xml&quot;/&gt;
        &lt;bt:http-requests parameters=&quot;dispatch&quot;/&gt;
    &lt;/bt:manager&gt;
	...
&lt;/beans
</pre>
<p>There are a few things to learn from this confguration. First that we are logging in a binary format and compressed. This is not handy when you are trying to read the logs at runtime. Therefore you have the option to change this. The result is a nice readable XML formatted file. Other interesting things are the http_request configuration and the flush schedule. The flush schedule is used to cache logs and send them to the file only every 30 seconds in our case.</p>
<p>If you choose for the binary format, you need to use the beet-utils to extract the data into a csv file, readable xml or database calls. There is a basic command that you can use to uncompress and transform the data.</p>
<pre>
gzcat ./beet-yourscrum-perf.bxml.gz  | java -jar /path/to/beet-utils.jar -tool csv > result.csv
</pre>
<p>The *.bxml.gz is the binary data file. Beware that the original documentation explains the use of zcat. For me on the mac I had to use the older gzcat tool. But the commands are the same. The following image shows the results in csv format.</p>
<p><a href="http://www.gridshore.nl/wp-content/uploads/Screen-shot-2009-08-30-at-09.19.53.png" rel="lightbox"><img src="/wp-content/uploads/Screen-shot-2009-08-30-at-09.19.53-150x150.png" alt="Screen shot 2009-08-30 at 09.19.53.png" border="0" width="150" height="150" align="right" /></a></p>
<p>Next up is to configure method access.</p>
<h3>Can we monitor method calls?</h3>
<p>Of course we can track method calls. Actually Beet makes it very easy for you. The manager namespace has an attribute called track-method-expression. You can provided it with any pointcut expression and you are done.</p>
<p>There are two buts when using pointcuts. But 1, you want to use one tracking manager but multiple pointcuts. One to monitor services and one to monitor controllers. Beet provides a mechanism to create separate advisors and pointcuts. There is a small bug in the 1.4.0-b3 release that prevents your from using this though. But 2, think about the way spring treats multiple configuration files. One loaded by the web context (servlet) and the other by the application context (listener). Pointcuts can not overcome these context boundaries, therefore we need multiple tracking managers at the moment.</p>
<p>The code looks like this, check thetrack-method-expression</p>
<pre class="brush: xml; title: ; notranslate">
&lt;bt:manager id=&quot;webTrackingManager&quot;
            application=&quot;yourscrum&quot;
            register-mbeans=&quot;false&quot;
            track-method-expression=&quot;execution(* org.yourscrum.web.story.*Controller.*(..))&quot;
            flush-schedule=&quot;0/30 * * * * ?&quot;&gt;
    &lt;bt:xml-persister binary=&quot;true&quot; compress=&quot;true&quot; file=&quot;${log.dir}/beet-yourscrum-web-perf.xml&quot;/&gt;
    &lt;bt:http-requests parameters=&quot;dispatch&quot;/&gt;
&lt;/bt:manager&gt;
</pre>
<h3>Are there other things to monitor?</h3>
<p>Beet does provided some other helpful beans to monitor your application. A nice one is the datasource monitor. Very easy to configure. Just add an attribute to the datasource configuration. You can look at the following code block for an example. After that there is again an image with some sample csv data.</p>
<pre class="brush: xml; title: ; notranslate">
    &lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;
          bt:tracking-manager=&quot;serviceTrackingManager&quot;&gt;

        &lt;property name=&quot;driverClassName&quot; value=&quot;${jdbc.driverclass}&quot;/&gt;
        &lt;property name=&quot;url&quot; value=&quot;${jdbc.url}&quot;/&gt;
        &lt;property name=&quot;username&quot; value=&quot;${jdbc.username}&quot;/&gt;
        &lt;property name=&quot;password&quot; value=&quot;${jdbc.password}&quot;/&gt;
    &lt;/bean&gt;
</pre>
<p><a href="http://www.gridshore.nl/wp-content/uploads/Screen-shot-2009-09-01-at-22.04.57.png" rel="lightbox"><img src="/wp-content/uploads/Screen-shot-2009-09-01-at-22.04.57-150x150.png" alt="Screen shot 2009-09-01 at 22.04.57.png" border="0" width="150" height="150" align="right" /></a></p>
<h3>What could be improved?</h3>
<p>Before I sound to negative I do like to mention that Jason responded fast to the issues I found. Still others can find them as well, let&#8217;s help Jason to fix the issues and improve the project. I think it is worth it.</p>
<ul>
<li>Problem configuring pointcuts and separate advise. The manager accepts an pointcut expression for tracking method calls. It is also possible to create you own pointcuts and combine them with existing pointcuts. That way you can combine it with transaction creation for instance. The fix does not look very hard, the issue is logged.</li>
<li>Problems logging to one file with one manager when the spring configuration is split up into multiple files and multiple contexts loaded by the servlet and the listener. To create a solution for this problem we need the pointcut option as mentioned in the previous point and preferably a separate bean for the http-request listener that is connected to the tracking manager at the moment. The issues are mentioned and a solution will be created.</li>
<li>The last point depends on your taste, to me it is a big problem. The project uses GIT for source control. I had never worked with it and needed to configure it on my machine to extract the sources from the repository. But the bigger problem is ant and ivy. Man I do not like this. I just love the maven integration in my IDE and the project setup. This project is not easy to open in a real IDE like intellij. But again, that is a matter of taste.</li>
</ul>
<h3>Conclusion</h3>
<p>I can say I am going to experiment more with this framework. It looks very promising. A few small issues need to be fixed. I am planning on using it for a bit bigger project to see how it holds up.</p>
<p>I am curious to learn from you about the frameworks that you use for performance testing and monitoring. Drop me a line or a comment.</p>
<p><br/><br />
<SCRIPT charset="utf-8" type="text/javascript" src="http://ws.amazon.com/widgets/q?ServiceVersion=20070822&#038;MarketPlace=US&#038;ID=V20070822/US/gridshore-20/8001/076b4862-1936-4847-9233-5a2c07bfc4c4"> </SCRIPT> <NOSCRIPT><A HREF="http://ws.amazon.com/widgets/q?ServiceVersion=20070822&#038;MarketPlace=US&#038;ID=V20070822%2FUS%2Fgridshore-20%2F8001%2F076b4862-1936-4847-9233-5a2c07bfc4c4&#038;Operation=NoScript">Amazon.com Widgets</A></NOSCRIPT></p>
<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http%3A%2F%2Fwww.gridshore.nl%2F2009%2F09%2F01%2Fusing-beet-to-monitor-your-spring-framework-application%2F&amp;title=Using%20Beet%20to%20monitor%20your%20%28spring%20framework%29%20application&amp;t=2' height='25' width='155' frameborder='0' scrolling='no'></iframe></div></div><div style='clear:both'></div></div><!-- Social Buttons Generated by Digg Digg plugin v4.5.3.4, 
    Author : Yong Mook Kim
    Website : http://www.diggdigg2u.com -->]]></content:encoded>
			<wfw:commentRss>http://www.gridshore.nl/2009/09/01/using-beet-to-monitor-your-spring-framework-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bring some stability to your architecture</title>
		<link>http://www.gridshore.nl/2008/10/30/bring-some-stability-to-your-architecture/</link>
		<comments>http://www.gridshore.nl/2008/10/30/bring-some-stability-to-your-architecture/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 20:44:56 +0000</pubDate>
		<dc:creator>Allard</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[stability]]></category>

		<guid isPermaLink="false">http://www.gridshore.nl/2008/10/30/bring-some-stability-to-your-architecture/</guid>
		<description><![CDATA[<p>Applications have to run in high-consequence environments. They have to serve hundreds of thousands of users 24 / 7. Our clients spend millions in hard- and software and highly depend on the revenue generated by these applications. Unnecessary outage of these application is fatal.</p> <p>Software Architects play an important role in setting up an [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gridshore.nl/wp-content/uploads/circuitbreaker.jpg" alt="circuitbreaker" hspace="5" vspace="5" width="90" height="89" align="left" />Applications have to run in high-consequence environments. They have to serve hundreds of thousands of users 24 / 7. Our clients spend millions in hard- and software and highly depend on the revenue generated by these applications. Unnecessary outage of these application is fatal.</p>
<p>Software Architects play an important role in setting up an architecture that can cope with these high demands. At the JAOO, <a href="http://www.michaelnygard.com">Michael Nygard</a>&#8216; had a talk, &#8220;<a href="http://jaoo.dk/aarhus-2008/tracks/show_track.jsp?trackOID=187">Failure comes in Flavors</a>&#8220;, that gave very good insight in the risks and opportunities of today&#8217;s application. The talk was was divided into two sessions. The first session covered the bad news: the stability threats. He discussed several situations that pose a threat to the long and happy life of an application. The second session was a happier one. It covered the patterns that should be applied to the application architecture to prevent these threats.</p>
<p>In this post, I will elaborate on some of the stability threats and pick one specific pattern to resolve them: the circuit breaker.</p>
<p><span id="more-384"></span></p>
<p><strong>Stability</strong></p>
<p>Before we go on about the stability threats, we need a common understanding about what stability is.</p>
<p>Michael Nygard defines stability as &#8220;the consistent, long-term availability of features&#8221;, and can be divided into four different qualities:</p>
<ul>
<li>Severability; instead of crashing completely, only loose the functional area&#8217;s that are struck by failure</li>
<li>Resilience; automatically recover from failures</li>
<li>Recoverability; make sure only crashed components need to be restarted, not the entire application</li>
<li>Tolerance; absorb shocks from other components instead of propagating them</li>
</ul>
<p>Note that stability doesn&#8217;t mean that nothing will ever go wrong. It just states that when something does go wrong, only the features of the applications directly related to the struck component become unavailable, and only until the component comes up again.</p>
<p><strong>Stability threats</strong></p>
<p>The life of a web application developer is interesting. We build applications that are hosted in the most hostile environment imaginable: the internet. People can travel at light speed, nearly invisible and have all the power to bring your application down, willingly or accidentally. In fact, more application crash because of accidental abuse than of hackers.</p>
<p>This brings us to the first threat: the <em><span style="text-decoration: underline;">user</span></em>. Unfortunately, the user pays for our client&#8217;s income (and ours too). We&#8217;ll have to deal with them.</p>
<p>Several aspects of the users behavior pose a threat for our application:</p>
<ul>
<li>Users don&#8217;t wait. If a page doesn&#8217;t show up quickly enough, he&#8217;ll push the link again, starting two threads to work for him, only wonderings the situation</li>
<li>Users write about cool stuff and come to your site after reading that stuff. This may cause a sudden burst of users, possibly overloading your site</li>
<li>Buyers will use all integration points, causing traffic in every little corner of your application</li>
<li>Some users aren&#8217;t actually users, but bots, and may cause unused sessions to be created for them</li>
<li>Users only visit your site when they&#8217;re awake, causing traffic surges at daytime, while your processors wait for orders at night.</li>
</ul>
<p>A threat briefly mentioned above is the <span style="text-decoration: underline;"><em>integration point</em></span>. This is the point where your application meets another. An example of this is the database or an external payment provider.</p>
<p>Integration points are dangerous for a couple of reasons:</p>
<ul>
<li>External systems typically have to be reached over a network connection, making the integration dependent of ever more components</li>
<li>Ever had the problem of a firewall dropping your packets? It&#8217;s a nice way of not being able to set up a connection without getting any feedback about why this happens.</li>
<li>Some external systems just keep you waiting. If your payment provider is busy, they&#8217;ll be happy to keep you waiting. But will your user wait? How many threads will clog up and the integration point, waiting for a response?</li>
</ul>
<p>I could go on for a long time, but these are the two threats that I want to cover in this post. If you want more, read Michael Nygard&#8217;s book &#8220;Release It&#8221;.</p>
<p><strong>Stability patterns</strong></p>
<p>Fortunately, there is a series of patterns that can be applied to increase an application stability. One of these patterns is the <span style="text-decoration: underline;"><em>circuit breaker</em></span>. You&#8217;re most likely familiar with the electrical circuit breaker. When you have an electricity leak or high power throughput, the circuit breaker will open and stop the electrical current. You&#8217;ll be in the dark, but at least your television, washing machine and music installation are saved from destruction.</p>
<p>Now, imagine your database has a hard time keeping up with your amount of requests. It will probably take longer to process each request, causing even more requests to pile up. In the end, your database server might break, taking your application with it. That is the time where we need a circuit breaker to stop the current from going to our database. I&#8217;m talking about digital current here, not electricity. Let&#8217;s keep that fans turning on the hardware!</p>
<p>A software circuit breaker should do a few things. Most important is that is should monitor each call performed on a specific backend. When a certain amount of calls fail or take too long, the circuit breaker opens, blocking the current. Each request coming in when the circuit breaker is opened will result in an immediate failure, throwing the last exception that was received from the last call. This has two positive effects: your thread returns more quickly and the load on the external system is relieved, allowing it to recover.</p>
<p>After a certain period of time, the circuit breaker will let a single request pass through to the backend. If that call fails, nothing changes. If the call succeeds, the circuit breaker will close, allowing the requests to pass through to the external system.</p>
<p>The number of use cases for a circuit breaker is most likely limited by our imagination. A nice one I could think of was to limit functionality when load becomes too high. Typically, this would be the functionality that is &#8220;nice to have&#8221;, but not essential to your application. To do this, your code would have to inspect the state of the circuit breaker when deciding which options are made available to your user. Do keep in mind though, that limiting functionality might cause your circuit breaker to sit and wait for requests which don&#8217;t come, never closing it. You&#8217;ll need another mechanism for detecting when it can be closed.</p>
<p><strong>Implementing the circuit breaker</strong></p>
<p>I&#8217;ve been playing around with a small circuit breaker implementation. You can find the code in our <a href="http://gridshore.googlecode.com/svn/trunk/StabilityPatterns/" target="_blank">code repository</a>. It&#8217;s really small, but seemed really powerful.</p>
<p>There are 2 main components in the application.</p>
<ul>
<li>The interceptor is responsible for intercepting calls to the external system and sending the requests and responses to the circuit breaker [<a title="AnnotatedMethodCircuitBreakerInterceptor.java" href="http://gridshore.googlecode.com/svn/trunk/StabilityPatterns/circuitbreaker/src/main/java/nl/gridshore/stability/circuitbreaker/AnnotatedMethodCircuitBreakerInterceptor.java" target="_blank">see code</a>]</li>
<li>The circuit breaker itself decides if requests should be sent and what should happen when responses are received [<a title="SimpleCircuitBreaker.java" href="http://gridshore.googlecode.com/svn/trunk/StabilityPatterns/circuitbreaker/src/main/java/nl/gridshore/stability/circuitbreaker/TimedSpringJmxCircuitBreaker.java" target="_blank">see code</a>]</li>
</ul>
<p>To find out if a circuit breaker is actually useful, I&#8217;ve done a few load tests. I&#8217;ve ran these tests against the same application twice. Once with circuit breaker and once without. The results are promising.</p>
<p>When activated, the circuit breaker will cause failures to append a lot faster than when there is none. This means threads are released much faster, allowing the next unfortunate user to receive the error. Of course, it doesn&#8217;t help your user much, but at least you&#8217;ll be able to tell him something is wrong instead of giving him a timeout after 30 seconds.</p>
<p>Don&#8217;t believe me? Have a look at the screen shots of the meter tests below:</p>
<p align="center"><a href="http://www.gridshore.nl/wp-content/uploads/250threads_target_throughput_50.png" target="_blank"><img src="http://www.gridshore.nl/wp-content/uploads/250threads-target-throughput-50-small.jpg" alt="250threads target throughput 50" hspace="5" vspace="5" width="225" height="137" /></a><br />
250 concurrent threads with a targeted throughput of 50 requests per second. The circuit breaker variant doesn&#8217;t have any failed calls, while the normal implementation has more than 40% failures.</p>
<p align="center"><a href="http://www.gridshore.nl/wp-content/uploads/250threads_target_throughput_100.png" target="_blank"><img src="http://www.gridshore.nl/wp-content/uploads/250threads-target-throughput-100-small.jpg" alt="250threads target throughput 100" hspace="5" vspace="5" width="225" height="137" /></a><br />
250 concurrent threads with a targeted throughput of 100 requests per second. This is where the circuit breaker variant seems to have it&#8217;s first failures.</p>
<p align="center"><a href="http://www.gridshore.nl/wp-content/uploads/1000thread_burst.png" target="_blank"><img src="http://www.gridshore.nl/wp-content/uploads/1000thread-burst-small.png" alt="1000thread burst" hspace="5" vspace="5" width="225" height="61" /></a><br />
And finally, a 1000 thread burst, just to see what happens if you spam tomcat with 1000 concurrent, continuously refreshing users. It&#8217;s 80% failure against 32% for the circuit breaker.</p>
<p><strong>Conclusion</strong></p>
<p>In this post, I&#8217;ve covered two of the stability threats that can be prevented by a correct implementation of the circuit breaker pattern. Our <a title="Gridshore SVN repository - Stability Patterns" href="http://gridshore.googlecode.com/svn/trunk/StabilityPatterns/" target="_blank">svn code repository</a> contains example code of an implementation of a circuit breaker. And finally, I&#8217;ve shown some unit test results to demonstrate the advantage of applying a circuit breaker to your architecture.</p>
<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http%3A%2F%2Fwww.gridshore.nl%2F2008%2F10%2F30%2Fbring-some-stability-to-your-architecture%2F&amp;title=Bring%20some%20stability%20to%20your%20architecture&amp;t=2' height='25' width='155' frameborder='0' scrolling='no'></iframe></div></div><div style='clear:both'></div></div><!-- Social Buttons Generated by Digg Digg plugin v4.5.3.4, 
    Author : Yong Mook Kim
    Website : http://www.diggdigg2u.com -->]]></content:encoded>
			<wfw:commentRss>http://www.gridshore.nl/2008/10/30/bring-some-stability-to-your-architecture/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>

