<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Ben J. Christensen &#187; Architecture</title>
	<atom:link href="http://benjchristensen.com/category/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://benjchristensen.com</link>
	<description></description>
	<lastBuildDate>Fri, 25 May 2012 19:33:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='benjchristensen.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/a7bf6ab05bce6d423674b5a8bb676139?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Ben J. Christensen &#187; Architecture</title>
		<link>http://benjchristensen.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://benjchristensen.com/osd.xml" title="Ben J. Christensen" />
	<atom:link rel='hub' href='http://benjchristensen.com/?pushpress=hub'/>
		<item>
		<title>Fault Tolerance in a High Volume, Distributed System</title>
		<link>http://benjchristensen.com/2012/03/01/fault-tolerance-in-a-high-volume-distributed-system/</link>
		<comments>http://benjchristensen.com/2012/03/01/fault-tolerance-in-a-high-volume-distributed-system/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 18:45:49 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Production]]></category>
		<category><![CDATA[Production Problems]]></category>
		<category><![CDATA[distributed system]]></category>
		<category><![CDATA[fault tolerance]]></category>
		<category><![CDATA[high volume]]></category>
		<category><![CDATA[resiliency]]></category>
		<category><![CDATA[service oriented architecture]]></category>

		<guid isPermaLink="false">http://benjchristensen.com/?p=465</guid>
		<description><![CDATA[Originally posted on the Netflix Tech Blog: In an earlier post by Ben Schmaus, we shared the principles behind our circuit-breaker implementation. In that post, Ben discusses how the Netflix API interacts with dozens of systems in our service-oriented architecture, which makes the API inherently more vulnerable to any system failures or latencies underneath it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=465&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Originally posted on the <a href="http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html">Netflix Tech Blog</a>:</p>
<hr />
<p>In an <a href="http://techblog.netflix.com/2011/12/making-netflix-api-more-resilient.html">earlier post</a> by <a href="http://twitter.com/schmaus">Ben Schmaus</a>, we shared the principles behind our circuit-breaker implementation. In that post, Ben discusses how the Netflix API interacts with dozens of systems in our service-oriented architecture, which makes the API inherently more vulnerable to any system failures or latencies underneath it in the stack. The rest of this post provides a more technical deep-dive into how our API and other systems isolate failure, shed load and remain resilient to failures.</p>
<p><span style="font-size:large;font-weight:bold;">Fault Tolerance is a Requirement, Not a Feature</span></p>
<p>The Netflix API receives more than 1 billion incoming calls per day which in turn fans out to several billion outgoing calls (averaging a ratio of 1:6) to dozens of underlying subsystems with peaks of over 100k dependency requests per second.<br />
<a href="http://benjchristensen.files.wordpress.com/2012/03/dependencies1.png"><img class="aligncenter size-full wp-image-469" title="" src="http://benjchristensen.files.wordpress.com/2012/03/dependencies1.png?w=800&h=727" alt="" width="800" height="727" border="0" /></a></p>
<p>This all occurs in the cloud across thousands of EC2 instances.</p>
<p>Intermittent failure is guaranteed with this many variables, even if every dependency itself has excellent availability and uptime.</p>
<p>Without taking steps to ensure fault tolerance, 30 dependencies each with 99.99% uptime would result in 2+ hours downtime/month (<span style="font-size:x-small;">99.99%<sup>30</sup> = 99.7% uptime = 2+ hours in a month</span>).</p>
<p>When a single API dependency fails at high volume with increased latency (causing blocked request threads) it can rapidly (seconds or sub-second) saturate all available Tomcat (or other container such as Jetty) request threads and take down the entire API.</p>
<p><a href="http://benjchristensen.files.wordpress.com/2012/03/dependencies3.png"><img class="aligncenter size-full wp-image-471" title="" src="http://benjchristensen.files.wordpress.com/2012/03/dependencies3.png?w=800&h=728" alt="" width="800" height="728" /></a></p>
<p>Thus, it is a requirement of high volume, high availability applications to build fault tolerance into their architecture and not expect infrastructure to solve it for them.</p>
<p><span style="font-size:large;font-weight:bold;">Netflix DependencyCommand Implementation</span></p>
<p>The service-oriented architecture at Netflix allows each team freedom to choose the best transport protocols and formats (XML, JSON, Thrift, Protocol Buffers, etc) for their needs so these approaches may vary across services.</p>
<p>In most cases the team providing a service also distributes a Java client library.</p>
<p>Because of this, applications such as API in effect treat the underlying dependencies as 3rd party client libraries whose implementations are &#8220;black boxes&#8221;. This in turn affects how fault tolerance is achieved.</p>
<p>In light of the above architectural considerations we chose to implement a solution that uses a combination of fault tolerance approaches:</p>
<ul>
<li><span style="font-size:100%;">network timeouts and retries</span></li>
<li><span style="font-size:100%;">separate threads on per-dependency thread pools</span></li>
<li><span style="font-size:100%;">semaphores (via a </span><a style="font-size:100%;" href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html#tryAcquire()">tryAcquire</a><span style="font-size:100%;">, not a blocking call)</span></li>
<li><span style="font-size:100%;">circuit breakers</span></li>
</ul>
<p>Each of these approaches to fault-tolerance has pros and cons but when combined together provide a comprehensive protective barrier between user requests and underlying dependencies.</p>
<p><a href="http://benjchristensen.files.wordpress.com/2012/03/faulttolerancetypes.png"><img class="aligncenter size-full wp-image-477" title="" src="http://benjchristensen.files.wordpress.com/2012/03/faulttolerancetypes.png?w=800&h=610" alt="" width="800" height="610" /></a></p>
<p>The Netflix DependencyCommand implementation wraps a network-bound dependency call with a preference towards executing in a separate thread and defines fallback logic which gets executed (step 8 in flow chart below) for any failure or rejection (steps 3, 4, 5a, 6b below) regardless of which type of fault tolerance (network or thread timeout, thread pool or semaphore rejection, circuit breaker) triggered it.</p>
<p><a href="http://benjchristensen.files.wordpress.com/2012/03/dependencycommands.png"><img class="aligncenter size-full wp-image-475" title="" src="http://benjchristensen.files.wordpress.com/2012/03/dependencycommands.png?w=800&h=325" alt="" width="800" height="325" /></a></p>
<p>We decided that the benefits of isolating dependency calls into separate threads outweighs the drawbacks (in most cases). Also, since the API is progressively <a href="http://techblog.netflix.com/2011/02/redesigning-netflix-api.html">moving towards increased concurrency</a> it was a win-win to achieve both fault tolerance and performance gains through concurrency with the same solution. In other words, the overhead of separate threads is being turned into a positive in many use cases by leveraging the concurrency to execute calls in parallel and speed up delivery of the Netflix experience to users.</p>
<p>Thus, most dependency calls now route through a separate thread-pool as the following diagram illustrates:</p>
<p><a href="http://benjchristensen.files.wordpress.com/2012/03/dependencies4.png"><img class="aligncenter size-full wp-image-472" title="" src="http://benjchristensen.files.wordpress.com/2012/03/dependencies4.png?w=800&h=1086" alt="" width="800" height="1086" /></a></p>
<p>If a dependency becomes latent (the worst-case type of failure for a subsystem) it can saturate all of the threads in its own thread pool, but Tomcat request threads will timeout or be rejected immediately rather than blocking.</p>
<p><a href="http://benjchristensen.files.wordpress.com/2012/03/dependencies6.png"><img class="aligncenter size-full wp-image-474" title="" src="http://benjchristensen.files.wordpress.com/2012/03/dependencies6.png?w=800&h=324" alt="" width="800" height="324" /></a></p>
<p>In addition to the isolation benefits and concurrent execution of dependency calls we have also leveraged the separate threads to enable request collapsing (automatic batching) to increase overall efficiency and reduce user request latencies.</p>
<p>Semaphores are used instead of threads for dependency executions known to not perform network calls (such as those only doing in-memory cache lookups) since the overhead of a separate thread is too high for these types of operations.</p>
<p>We also use semaphores to protect against non-trusted fallbacks. Each DependencyCommand is able to define a fallback function (discussed more below) which is performed on the calling user thread and should not perform network calls. Instead of trusting that all implementations will correctly abide to this contract, it too is protected by a semaphore so that if an implementation is done that involves a network call and becomes latent, the fallback itself won&#8217;t be able to take down the entire app as it will be limited in how many threads it will be able to block.</p>
<p>Despite the use of separate threads with timeouts, we continue to aggressively set timeouts and retries at the network level (through interaction with client library owners, monitoring, audits etc).</p>
<p>The timeouts at the DependencyCommand threading level are the first line of defense regardless of how the underlying dependency client is configured or behaving but the network timeouts are still important otherwise highly latent network calls could fill the dependency thread-pool indefinitely.</p>
<p>The tripping of circuits kicks in when a DependencyCommand has passed a certain threshold of error (such as 50% error rate in a 10 second period) and will then reject all requests until health checks succeed.</p>
<p>This is used primarily to release the pressure on underlying systems (i.e. shed load) when they are having issues and reduce the user request latency by failing fast (or returning a fallback) when we know it is likely to fail instead of making every user request wait for the timeout to occur.</p>
<p><span style="font-size:large;font-weight:bold;">How do we respond to a user request when failure occurs?</span></p>
<p>In each of the options described above a timeout, thread-pool or semaphore rejection, or short-circuit will result in a request not retrieving the optimal response for our customers.</p>
<p>An immediate failure (&#8220;fail fast&#8221;) throws an exception which causes the app to shed load until the dependency returns to health. This is preferable to requests &#8220;piling up&#8221; as it keeps Tomcat request threads available to serve requests from healthy dependencies and enables rapid recovery once failed dependencies recover.</p>
<p>However, there are often several preferable options for providing responses in a &#8220;fallback mode&#8221; to reduce impact of failure on users. Regardless of what causes a failure and how it is intercepted (timeout, rejection, short-circuited etc) the request will always pass through the fallback logic (step 8 in flow chart above) before returning to the user to give a DependencyCommand the opportunity to do something other than &#8220;fail fast&#8221;.</p>
<p>Some approaches to fallbacks we use are, in order of their impact on the user experience:</p>
<ul>
<li><span style="font-size:100%;">Cache: Retrieve data from local or remote caches if the realtime dependency is unavailable, even if the data ends up being stale</span></li>
<li><span style="font-size:100%;">Eventual Consistency: Queue writes (such as in </span><a style="font-size:100%;" href="http://aws.amazon.com/sqs/">SQS</a><span style="font-size:100%;">) to be persisted once the dependency is available again</span></li>
<li><span style="font-size:100%;">Stubbed Data: Revert to default values when personalized options can&#8217;t be retrieved</span></li>
<li><span style="font-size:100%;">Empty Response (&#8220;Fail Silent&#8221;): Return a null or empty list which UIs can then ignore</span></li>
</ul>
<p>All of this work is to maintain maximum uptime for our users while maintaining the maximum number of features for them to enjoy the richest Netflix experience possible. As a result, our goal is to have the fallbacks deliver responses as close to what the actual dependency would deliver.</p>
<p><span style="font-size:large;font-weight:bold;">Example Use Case</span></p>
<p>Following is an example of how threads, network timeouts and retries combine:</p>
<p><a href="http://benjchristensen.files.wordpress.com/2012/03/faulttoleranceexampleconfig.png"><img class="aligncenter size-full wp-image-476" title="" src="http://benjchristensen.files.wordpress.com/2012/03/faulttoleranceexampleconfig.png?w=800&h=675" alt="" width="800" height="675" /></a></p>
<p>The above diagram shows an example configuration where the dependency has no reason to hit the 99.5th percentile and thus cuts it short at the network timeout layer and immediately retries with the expectation to get median latency most of the time, and accomplish this all within the 300ms thread timeout.</p>
<p>If the dependency has legitimate reasons to sometimes hit the 99.5th percentile (i.e. cache miss with lazy generation) then the network timeout will be set higher than it, such as at 325ms with 0 or 1 retries and the thread timeout set higher (350ms+).</p>
<p>The threadpool is sized at 10 to handle a burst of 99th percentile requests, but when everything is healthy this threadpool will typically only have 1 or 2 threads active at any given time to serve mostly 40ms median calls.</p>
<p>When configured correctly a timeout at the DependencyCommand layer should be rare, but the protection is there in case something other than network latency affects the time, or the combination of connect+read+retry+connect+read in a worst case scenario still exceeds the configured overall timeout.</p>
<p>The aggressiveness of configurations and tradeoffs in each direction are different for each dependency.</p>
<p>Configurations can be changed in realtime as needed as performance characteristics change or when problems are found all without risking the taking down of the entire app if problems or misconfigurations occur.</p>
<p><span style="font-size:large;font-weight:bold;">Conclusion</span></p>
<p>The approaches discussed in this post have had a dramatic effect on our ability to tolerate and be resilient to system, infrastructure and application level failures without impacting (or limiting impact to) user experience.</p>
<p>Despite the success of this new DependencyCommand resiliency system over the past 8 months, there is still a lot for us to do in improving our fault tolerance strategies and performance, especially as we continue to add functionality, devices, customers and international markets.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/465/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=465&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2012/03/01/fault-tolerance-in-a-high-volume-distributed-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/dependencies1.png" medium="image" />

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/dependencies3.png" medium="image" />

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/faulttolerancetypes.png" medium="image" />

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/dependencycommands.png" medium="image" />

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/dependencies4.png" medium="image" />

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/dependencies6.png" medium="image" />

		<media:content url="http://benjchristensen.files.wordpress.com/2012/03/faulttoleranceexampleconfig.png" medium="image" />
	</item>
		<item>
		<title>Technical Debt Quadrant</title>
		<link>http://benjchristensen.com/2009/10/15/technical-debt-quadrant/</link>
		<comments>http://benjchristensen.com/2009/10/15/technical-debt-quadrant/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 20:52:19 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Management & Leadership]]></category>

		<guid isPermaLink="false">http://benjchristensen.com/?p=290</guid>
		<description><![CDATA[Martin Fowler wrote a blog entry on technical debt this week that communicates the concepts of &#8220;technical debt&#8221; and classifies them very well. Some favorite portions: &#8220;A mess is a reckless debt which results in crippling interest payments or a long period of paying down the principal.&#8221; &#8220;The prudent debt to reach a release may [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=290&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Martin Fowler <a href="http://martinfowler.com/bliki/TechnicalDebtQuadrant.html">wrote a blog entry</a> on technical debt this week that communicates the concepts of &#8220;technical debt&#8221; and classifies them very well.</p>
<p><a href="http://benjchristensen.files.wordpress.com/2009/10/techdebtquadrant.png"><img class="alignnone size-full wp-image-291" title="techDebtQuadrant" src="http://benjchristensen.files.wordpress.com/2009/10/techdebtquadrant.png?w=800" alt="techDebtQuadrant"   /></a></p>
<p>Some favorite portions:</p>
<blockquote><p>&#8220;A mess is a reckless debt which results in crippling interest payments or a long period of paying down the principal.&#8221;</p></blockquote>
<blockquote><p>&#8220;The prudent debt to reach a release may not be worth paying down if the interest payments are sufficiently small &#8211; such as if it were in a rarely touched part of the code-base.&#8221;</p></blockquote>
<blockquote><p>&#8220;Not just is there a difference between prudent and reckless debt, there&#8217;s also a difference between deliberate and inadvertent debt. The prudent debt example is deliberate because the team knows they are taking on a debt, and thus puts some thought as to whether the payoff for an earlier release is greater than the costs of paying it off. A team ignorant of design practices is taking on its reckless debt without even realizing how much hock it&#8217;s getting into.&#8221;</p></blockquote>
<blockquote><p>&#8220;while you&#8217;re programming, you are learning. It&#8217;s often the case that it can take a year of programming on a project before you understand what the best design approach should have been. Perhaps one should plan projects to spend a year building a system that you throw away and rebuild, but that&#8217;s a tricky plan to sell. Instead what you find is that the moment you realize what the design should have been, you also realize that you have an inadvertent debt.&#8221;</p></blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/290/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/290/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/290/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/290/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/290/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/290/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/290/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=290&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2009/10/15/technical-debt-quadrant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>

		<media:content url="http://benjchristensen.files.wordpress.com/2009/10/techdebtquadrant.png" medium="image">
			<media:title type="html">techDebtQuadrant</media:title>
		</media:content>
	</item>
		<item>
		<title>Detail Oriented</title>
		<link>http://benjchristensen.com/2009/07/17/detail-oriented/</link>
		<comments>http://benjchristensen.com/2009/07/17/detail-oriented/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 19:08:08 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Management & Leadership]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://benjchristensen.com/?p=208</guid>
		<description><![CDATA[I&#8217;m working on a fairly significant document that covers the requirements and high-level architecture for a new system based on SOA principles to replace an aging application. The document is approaching 150 pages and beginning to approach something that properly describes the vision and needs so that business and technical folks can have a solid [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=208&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working on a fairly significant document that covers the requirements and high-level architecture for a new system based on SOA principles to replace an aging application.</p>
<p>The document is approaching 150 pages and beginning to approach something that properly describes the vision and needs so that business and technical folks can have a solid understanding of scope, requirements, priorities and how it will work (plus general direction on how it will be built).</p>
<p>It takes a lot of effort and time to sit down and not only read, but understand the scope of this system. It&#8217;s not a simple thing. As much as we try to keep it conceptually simple, there&#8217;s a lot going on and a lot of details.</p>
<p>In a few weeks I&#8217;m to sit down with a partner team to review and collaborate. My plan was to send over the detailed document for review so we could have a productive meeting to truly discuss missing requirements, strategy, execution planning etc.</p>
<p>However, I&#8217;ve been told they don&#8217;t &#8220;want&#8221; to read the detailed version &#8212; just a summary &#8212; bullet points with perhaps 10-15 pages.</p>
<p>These are senior developers and architects. Not high level business folks.</p>
<p>Attention to detail is in my opinion an absolute requirement for technical people. Decision making without details is dangerous and fairly useless.</p>
<p>My opinion is not high for people who do not care or have the attention span to be detail oriented.</p>
<p>An executive who&#8217;s not directly involved in the operations of something &#8211; a summary makes sense.</p>
<p>A team or person who is supposed to directly impact the design and delivery of something and its ongoing operations &#8211; if the details aren&#8217;t part of their focus, they don&#8217;t deserve to be involved.</p>
<p>If they don&#8217;t have the time to be detail oriented, then either they shouldn&#8217;t be working on the project, their time needs to be re-prioritized, or the project isn&#8217;t worth doing.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/208/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=208&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2009/07/17/detail-oriented/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>
	</item>
		<item>
		<title>Speed of Thought</title>
		<link>http://benjchristensen.com/2009/06/26/speed-of-thought/</link>
		<comments>http://benjchristensen.com/2009/06/26/speed-of-thought/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:29:49 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Production]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://benjchristensen.wordpress.com/?p=118</guid>
		<description><![CDATA[I&#8217;ve focused on performance for several years in my server-side and web application development &#8211; as much as I&#8217;ve been able to fit into the timelines. It has involved digging into minute details of Java and JVM tuning that rarely get explored by most java developers (from what I can tell anyways) and focusing on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=118&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve focused on performance for several years in my server-side and web application development &#8211; as much as I&#8217;ve been able to fit into the timelines. It has involved digging into minute details of Java and JVM tuning that rarely get explored by most java developers (from what I can tell anyways) and focusing on tuning the CSS, images, caching, GZIP and other settings of the front-end. It has generally paid off. Today my team operates servers processing millions of complex, dynamic, uncacheable web service transactions completing on average in around 250ms each (server side, not including network transport to client). I believe with further investment we could improve that even more.</p>
<p>I have read comments from companies such as Google and Amazon how the performance of an application can dramatically affect how much people use it. I agree. The slightest friction in searching makes me search less, or shop less, etc.</p>
<p>This past week I&#8217;ve been using the new iPhone 3GS which is at least 2x faster than the previous iPhone 2G I had. In some cases it&#8217;s 4x and 6x faster.</p>
<p>I already used the iPhone a lot. The increase in speed has further reduced the &#8220;friction&#8221; of use to the point that if I even have a thought of quickly looking something up or performing some other action, I am much more likely to do it.</p>
<p>On my last iPhone, I consciously chose to not bother at certain times because of the time it would take. Yes, I&#8217;m talking in seconds and even milliseconds here &#8212; but when it&#8217;s a &#8220;thought&#8221;, if the tool doesn&#8217;t work at the same speed, then it&#8217;s friction. Same goes for another application I use which involves looking up reference materials and documents. Before I kind of had to avoid &#8220;flipping around&#8217; while someone was referring to things. It was actually faster to use the paper documents. Now, I can keep up or be faster with my iPhone than the paper version &#8216;users&#8217;. Therefore it encourages use.</p>
<p>The new user experience of using the iPhone 3GS, so significantly improved just by the performance improvement, has reminded me as a developer and architect how critical it is to design, plan for and develop to achieve high performance. Functionality isn&#8217;t enough &#8212; we should be aiming for the &#8220;speed of thought&#8221;.</p>
<p>Interestingly, Google has just launched a new site just for &#8220;<a href="http://code.google.com/speed/">speeding up the web</a>&#8220;.</p>
<p>The following video shows &#8220;the experts&#8221; talking about how the human mind perceives changes of 100ms (one tenth of a second).</p>
<span style="text-align:center; display: block;"><a href="http://benjchristensen.com/2009/06/26/speed-of-thought/"><img src="http://img.youtube.com/vi/aXJklICrFJI/2.jpg" alt="" /></a></span>
<p>It&#8217;s my belief that this isn&#8217;t just a &#8220;nice to have&#8221; feature. If a product, service or application wants to be adopted and deemed &#8220;necessary&#8221; by its users, its performance must reduce friction as much as technically feasible to the point where it approaches or achieves &#8220;speed of thought&#8221;.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=118&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2009/06/26/speed-of-thought/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>
	</item>
		<item>
		<title>Websphere Multi-JVM jsessionid</title>
		<link>http://benjchristensen.com/2007/10/19/websphere-multi-jvm-jsessionid/</link>
		<comments>http://benjchristensen.com/2007/10/19/websphere-multi-jvm-jsessionid/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 22:30:36 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://benjchristensen.wordpress.com/2007/10/19/websphere-multi-jvm-jsessionid/</guid>
		<description><![CDATA[Works just like it should IBM Support Link Two JVMs with different contexts but the same domain now use the same jsessionid so they can talk back and forth in the same browser without jsessionid schizophrenia.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=52&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Works just like it should <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://www-1.ibm.com/support/docview.wss?rs=180&amp;context=SSEQTP&amp;dc=DB520&amp;uid=swg21210881&amp;loc=en_US&amp;cs=UTF-8&amp;lang=en&amp;rss=ct180websphere">IBM Support Link</a></p>
<p>Two JVMs with different contexts but the same domain now use the same jsessionid so they can talk back and forth in the same browser without jsessionid schizophrenia.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/benjchristensen.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/benjchristensen.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=52&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2007/10/19/websphere-multi-jvm-jsessionid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>
	</item>
		<item>
		<title>Elements of a Roadmap</title>
		<link>http://benjchristensen.com/2007/03/24/elements-of-a-roadmap/</link>
		<comments>http://benjchristensen.com/2007/03/24/elements-of-a-roadmap/#comments</comments>
		<pubDate>Sat, 24 Mar 2007 23:53:22 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Management & Leadership]]></category>

		<guid isPermaLink="false">http://benjchristensen.wordpress.com/2007/03/24/elements-of-a-roadmap/</guid>
		<description><![CDATA[I found a good list of elements for a roadmap by NickMalik Purpose of this Document &#8211; why write the doc Stakeholder Chart &#8211; whose needs are being met with the solution Signoff Chart &#8211; timestamp and id of person who signs off. High Level Platform Capabilities &#8211; the solution capabilities demanded by the business [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=35&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I found a good list of elements for a roadmap by <a href="http://blogs.msdn.com/nickmalik/archive/2007/03/12/so-what-s-in-a-roadmap-anyway.aspx" target="_blank">NickMalik</a></p>
<ul>
<li>Purpose of this Document  &#8211; why write the doc</li>
<li>Stakeholder Chart &#8211; whose needs are being met with the solution</li>
<li>Signoff Chart &#8211; timestamp and id of person who signs off.</li>
<li>High Level Platform Capabilities &#8211; the solution capabilities demanded by the business</li>
<li>Business Drivers for the Capabilities &#8211; the list of business programs or business teams that will use the system</li>
<li>Capability Demand &#8211; which business are asking for which capabilities.  An interesting grid.</li>
<li>Technical Interdependencies &#8211; what other systems rely on this solution.  What other systems does this solution rely on?</li>
<li>Enterprise Architecture Concerns &#8211; what agreements have been made with EA to get alignment of the solution to EA standards.</li>
<li>Architectural Context &#8211; one or more diagrams showing how the solution platform will evolve over time.</li>
<li>Methodology &#8211; how this document and concensus was created.  What meetings were held.  Who was in the room.  (it matters)</li>
<li>Roadmap schedule &#8211; what timelines everything thinks are reasonable for delivering the needs to different business customers</li>
<li>System Quality Attributes &#8211; what quality attributes will be stressed in each of the iterations.</li>
<li>Alternatives considered &#8211; what alternatives to this roadmap were considered and why this one was chosen.</li>
<li>Roadmap Risks &#8211; what could go wrong and who is assigned to watch for it</li>
<li>Platform Historical Narrative &#8211; previous decisions and narrative so that we can always answer the question: how did we ever get in a bind like this?</li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/benjchristensen.wordpress.com/35/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/benjchristensen.wordpress.com/35/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=35&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2007/03/24/elements-of-a-roadmap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>
	</item>
		<item>
		<title>Content Management Systems &#8212; JSR 170 and Magnolia</title>
		<link>http://benjchristensen.com/2005/11/19/content-management-systems-jsr-170-and-magnolia/</link>
		<comments>http://benjchristensen.com/2005/11/19/content-management-systems-jsr-170-and-magnolia/#comments</comments>
		<pubDate>Sat, 19 Nov 2005 21:14:00 +0000</pubDate>
		<dc:creator>Ben Christensen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://benjchristensen.wordpress.com/2005/11/19/content-management-systems-jsr-170-and-magnolia/</guid>
		<description><![CDATA[In the past week I&#8217;ve done a bunch of research on content management systems, and in particular the Java standard JSR 170. I&#8217;ve been playing with Magnolia and so far am fairly impressed with how it works &#8212; though not so impressed with the backend repository which in this case is JackRabbit, the open source [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=5&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In the past week I&#8217;ve done a bunch of research on content management systems, and in particular the Java standard JSR 170.</p>
<p>I&#8217;ve been playing with Magnolia and so far am fairly impressed with how it works &#8212; though not so impressed with the backend repository which in this case is JackRabbit, the open source reference implementation.</p>
<p>It appears though that for a fairly reasonable price I can get the Enterprise version of Magnolia that uses the commercial JSR-170 compliant repository from Day (http://www.day.com/site/en/index.html). It sounds like it should be MUCH better &#8230; and is very likely what all the big name companies use that Magnolia lists on their site. I&#8217;ve requested them to contact me but haven&#8217;t heard back yet.</p>
<p>JSR-170 definitely is sounding nice &#8230; though it seems like it still has a way to go before it fully matures as it&#8217;s quite new.</p>
<p>Also, the opensource community obviously has not had enough time to make a decent enterprise implementation, as Jackrabbit doesn&#8217;t cut it. For example &#8230; I have the system running with JackRabbit &#8230; it only support filesystem persistence right now, so I try to connect another client to it and &#8230;. it doesn&#8217;t work ( the files are locked) &#8230;. so that means it won&#8217;t work so well except for small things.</p>
<p>Also, I see no nice way of connecting remotely to the repository using the open source version of Magnolia.</p>
<p>I&#8217;ll continue researching this in the coming week.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/benjchristensen.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/benjchristensen.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/benjchristensen.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/benjchristensen.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/benjchristensen.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/benjchristensen.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/benjchristensen.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/benjchristensen.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/benjchristensen.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/benjchristensen.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=benjchristensen.com&#038;blog=859104&#038;post=5&#038;subd=benjchristensen&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://benjchristensen.com/2005/11/19/content-management-systems-jsr-170-and-magnolia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/25a69d1e333ff36b77cf01b84b764182?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">benjchristensen</media:title>
		</media:content>
	</item>
	</channel>
</rss>
