<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Clemens Vasters</title>
    <link>http://vasters.com/clemensv/</link>
    <description>Cloud Development and Alien Abductions</description>
    <language>en-us</language>
    <copyright>Clemens Vasters</copyright>
    <lastBuildDate>Fri, 04 May 2012 15:15:33 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>cvasters@guhhome.com</managingEditor>
    <webMaster>cvasters@guhhome.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/clemensv" /><feedburner:info uri="clemensv" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>47.67903</geo:lat><geo:long>-122.193409</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/clemensv" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fclemensv" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb</wfw:commentRss>
      
      <title>NHTTP</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/EDDchj9vbOs/NHTTP.aspx</link>
      <pubDate>Fri, 04 May 2012 15:15:33 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I’m toying around with very small and very constrained embedded devices right now.&#xD;
When you make millions of a small thing, every byte in code footprint and any processing&#xD;
cycle you can save saves real money. An XML parser is a big chunk of code. So is a&#xD;
JSON parser. Every HTTP stack already has a key/value pair parser for headers. We&#xD;
can use that.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
NHTTP stands for NoHyperText Transfer Protocol. Yes, I made that up. No, this is not&#xD;
an April Fool’s joke. Hear me out.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
All rules of RFC2616 apply, except for &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.2" target="_blank"&gt;section&#xD;
7.2&lt;/a&gt;, meaning there is must never an entity body on any request or reply. Instead&#xD;
we rely entirely on &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.1" target="_blank"&gt;section&#xD;
7.1&lt;/a&gt; and its extensibility rule: &#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;em&gt;The extension-header mechanism allows additional entity-header fields to be defined&#xD;
without changing the protocol, but these fields cannot be assumed to be recognizable&#xD;
by the recipient. Unrecognized header fields SHOULD be ignored by the recipient and &lt;font color="#ff0000"&gt;MUST&lt;/font&gt; be&#xD;
forwarded by transparent proxies.&lt;/em&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
All property payloads are expressed as key/value pairs that are directly mapped onto&#xD;
HTTP headers. No value can exceed 2KB in size and you can’t have more than 32 values&#xD;
per message so that we stay comfortably within common HTTP infrastructure quotas.&#xD;
To avoid collisions with existing headers and to allow for easy enumeration, each&#xD;
property key is prefixed with “P-“ &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
POST /foo HTTP/1.1 &#xD;
&lt;br&gt;&#xD;
Host: example.com &#xD;
&lt;br&gt;&#xD;
Content-Length: 0 &#xD;
&lt;br&gt;&#xD;
P-Name: “Clemens”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
HTTP/1.1 200 OK &#xD;
&lt;br&gt;&#xD;
Content-Length: 0 &#xD;
&lt;br&gt;&#xD;
P-Greeting: “Hello, Clemens”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
(The fun bit is that the Windows Azure Service Bus HTTP API for sending and receiving&#xD;
messages already supports this exact model since we map custom message properties&#xD;
to headers and the HTTP entity body to the body of broker messages and those can be&#xD;
empty)&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=EDDchj9vbOs:FDQJxlRUDLE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=EDDchj9vbOs:FDQJxlRUDLE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/EDDchj9vbOs" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,8a3fd52b-447c-4a1d-a226-6e01dcf9e3bb.aspx</comments>
      <category>Architecture</category>
      <category>Technology</category>
    <feedburner:origLink>http://vasters.com/clemensv/2012/05/04/NHTTP.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=2b9cf892-44e3-4a6c-a254-310402bae5d9</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,2b9cf892-44e3-4a6c-a254-310402bae5d9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,2b9cf892-44e3-4a6c-a254-310402bae5d9.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=2b9cf892-44e3-4a6c-a254-310402bae5d9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>&amp;ldquo;REST API&amp;rdquo; or &amp;ldquo;HTTP API&amp;rdquo;?</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,2b9cf892-44e3-4a6c-a254-310402bae5d9.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/KXYYCetm4zQ/ldquoREST+APIrdquo+Or+LdquoHTTP+APIrdquo.aspx</link>
      <pubDate>Fri, 13 Apr 2012 17:25:29 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I just wrote this email on a private mailing list and thought it may make sense to&#xD;
share it. The context of the discussion was overuse of the term “REST” in a document&#xD;
discussing an HTTP API:&#xD;
&lt;/p&gt;&#xD;
        &lt;hr&gt;&lt;/hr&gt;&#xD;
        &lt;p&gt;&#xD;
REST is a set of architectural principles. REST describes how state flows and describes&#xD;
the shape of relationships between the parties in a distributed system. HTTP is a&#xD;
protocol with a variety of stacks supporting it, and the REST principles were born&#xD;
out of developing HTTP. There could, in theory, a broad variety of protocols that&#xD;
also embody REST architecture, but  there are, in fact, very few (if any) that&#xD;
aren’t just variations of HTTP. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
“The client sends …”, “The server receives …”, “The server provides an interface for&#xD;
…” are all statements about implementation and, thus, HTTP. It commonly starts making&#xD;
talking about REST specifically when debating whether a system is actually following&#xD;
the principles according to the 5.3.3 “Data View” section in [1], since everything&#xD;
up to that point in Fielding’s dissertation you get generally for free with HTTP.  &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
[1] &lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"&gt;http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;hr&gt;&lt;/hr&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Bottom line: HTTP APIs are HTTP APIs. REST is about how things hang together. The&#xD;
terms aren’t interchangeable. In most technical discussions about interfaces or methods&#xD;
or URIs and most other implementation details, HTTP API is the right term.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=2b9cf892-44e3-4a6c-a254-310402bae5d9"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=KXYYCetm4zQ:ciLO5eRGK1s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=KXYYCetm4zQ:ciLO5eRGK1s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/KXYYCetm4zQ" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,2b9cf892-44e3-4a6c-a254-310402bae5d9.aspx</comments>
      <category>Architecture</category>
    <feedburner:origLink>http://vasters.com/clemensv/2012/04/13/ldquoREST+APIrdquo+Or+LdquoHTTP+APIrdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=88aa1fbe-083b-4859-807a-eb0cb85547d2</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,88aa1fbe-083b-4859-807a-eb0cb85547d2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,88aa1fbe-083b-4859-807a-eb0cb85547d2.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=88aa1fbe-083b-4859-807a-eb0cb85547d2</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>What is CQRS?</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,88aa1fbe-083b-4859-807a-eb0cb85547d2.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/N_9uJSPffww/What+Is+CQRS.aspx</link>
      <pubDate>Mon, 05 Mar 2012 23:00:11 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Greg &lt;a href="http://goodenoughsoftware.net/2012/03/02/cqrs/" target="_blank"&gt;says&#xD;
what it’s not&lt;/a&gt;, and since he didn’t use the opportunity to also succinctly express&#xD;
what it &lt;em&gt;is&lt;/em&gt;, I helped him out in the comments: &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;em&gt;CQRS ("Command-Query Responsibility Segregation") is a simple pattern that strictly&#xD;
segregates the responsibility of handling command input into an autonomous system&#xD;
from the responsibility of handling side-effect-free query/read access on the same&#xD;
system. Consequently, the decoupling allows for any number of homogeneous or heterogeneous&#xD;
query/read modules to be paired with a command processor and this principle presents&#xD;
a very suitable foundation for event sourcing, eventual-consistency state replication/fan-out&#xD;
and, thus, high-scale read access. In simple terms: You don’t service queries via&#xD;
the same module of a service that you process commands through. For REST heads: GET&#xD;
wires to a different thing from what PUT/POST/DELETE wire up to.&lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Martin Fowler has a nice discussion &lt;a href="http://martinfowler.com/bliki/CQRS.html" target="_blank"&gt;here&lt;/a&gt;,&#xD;
with pictures. Udi Dahan has &lt;a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/" target="_blank"&gt;another&#xD;
nice description&lt;/a&gt;, also with pictures. To say it in yet another way, the key point&#xD;
of the pattern is that the read and write paths in a system are entirely separate.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=88aa1fbe-083b-4859-807a-eb0cb85547d2"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=N_9uJSPffww:elO3Mo7Lk7I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=N_9uJSPffww:elO3Mo7Lk7I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/N_9uJSPffww" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,88aa1fbe-083b-4859-807a-eb0cb85547d2.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
    <feedburner:origLink>http://vasters.com/clemensv/2012/03/05/What+Is+CQRS.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=e8d14433-f773-4a19-91c0-138a9770a7c8</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,e8d14433-f773-4a19-91c0-138a9770a7c8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,e8d14433-f773-4a19-91c0-138a9770a7c8.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=e8d14433-f773-4a19-91c0-138a9770a7c8</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>SignalR powered by Service Bus</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,e8d14433-f773-4a19-91c0-138a9770a7c8.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/gyQoWklLFHI/SignalR+Powered+By+Service+Bus.aspx</link>
      <pubDate>Mon, 13 Feb 2012 23:04:00 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
(tl;dr &lt;a title="https://github.com/SignalR/SignalR.WindowsAzureServiceBus" href="https://github.com/SignalR/SignalR.WindowsAzureServiceBus"&gt;https://github.com/SignalR/SignalR.WindowsAzureServiceBus&lt;/a&gt;) &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Our friends over in the ASP.NET team are working on a very nice, lightweight web-browser&#xD;
eventing technology called &lt;a href="http://signalr.net/"&gt;SignalR&lt;/a&gt;. SignalR allows&#xD;
server-pushed events into the browser with a variety of transport options and a very&#xD;
simple programming model. You can get it &lt;a href="http://nuget.org/packages/SignalR"&gt;via&#xD;
NuGet&lt;/a&gt; and/or see growing and get the source of on &lt;a href="https://github.com/SignalR/SignalR"&gt;github&lt;/a&gt;.&#xD;
There is also a very active community around SignalR chatting on &lt;a href="http://jabbr.net/"&gt;Jabbr.net&lt;/a&gt;,&#xD;
a chat system whose user model is derived from IRC, but that runs – surprise – on&#xD;
top of SignalR. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For a primer, check out the piece that Scott Hanselman &lt;a href="http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx"&gt;wrote&#xD;
about SignalR&lt;/a&gt; a while back.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At the core, SignalR is a lightweight message bus that allows you to send messages&#xD;
(strings) identified by a key. Ultimately it’s a key/value bus. If you’re interested&#xD;
in messages with one or more particular keys, you walk up and ask for them by putting&#xD;
a (logical) connection into the bus – you create a subscription. And while you are&#xD;
maintaining that logical connection you get a cookie that acts as a cursor into the&#xD;
event stream keeping track of what you have an have not seen, which is particularly&#xD;
interesting for connectionless transports like long polling. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
SignalR implements this simple pub/sub pattern as a framework and that works brilliantly&#xD;
and with great density, meaning that you can pack very many concurrent notification&#xD;
channels on a single box. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What SignalR, out-of-the-box, doesn’t (or didn’t) provide yet is a way to stretch&#xD;
its message bus across multiple nodes for even higher scale and for failover safety. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
That’s where Service Bus comes in.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Last week, I built a &lt;a href="http://www.windowsazure.com/en-us/home/tour/service-bus/"&gt;Windows&#xD;
Azure Service Bus&lt;/a&gt; backplane for SignalR that allows deploying SignalR solutions&#xD;
to multiple nodes with message distribution across those nodes and ensuring proper&#xD;
ordering on a per-sender basis as well as node-to-node correctness and consistency&#xD;
for the cursor cookies. That code is Apache licensed and &lt;a href="https://github.com/SignalR/SignalR.WindowsAzureServiceBus"&gt;now&#xD;
available on github&lt;/a&gt;. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can use this backplane irrespective where you host solutions that use SignalR,&#xD;
as long as your backend host has access to a Service Bus namespace. That’s obviously&#xD;
best in one of the Windows Azure datacenters, but will work just as well anywhere&#xD;
else, albeit with a few msec more latency.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you want to try it out, here are the steps (beyond getting the code):&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
Make a small SignalR app or take one from the SignalR samples (caveat below)&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Make a Windows Azure account and a Service Bus namespace. For that, follow the same&#xD;
steps as outlined in the &lt;a href="http://www.windowsazure.com/en-us/develop/net/tutorials/multi-tier-application/"&gt;Multi-Tier&#xD;
apps tutorial&lt;/a&gt; on MSDN.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Compile the extension project and add it to your SignalR solution&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
At initialization time (global.asax, startup, etcetc), you need to reference (using)the&#xD;
SignalR.WindowsAzureServiceBus namespace and then add the following initialization&#xD;
code: &lt;font face="Consolas"&gt;AspNetHost.DependencyResolver.UseWindowsAzureServiceBus(“{namespace}“,”{account}”,&#xD;
“{key}”, "{appname}", 2);&lt;/font&gt;&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;h1&gt;&#xD;
          &lt;font face="Consolas"&gt;&#xD;
          &lt;/font&gt;&#xD;
        &lt;/h1&gt;&#xD;
        &lt;li&gt;&#xD;
Compile, run&lt;/li&gt;&#xD;
        &lt;p&gt;&#xD;
In the above example, {namespace} is the Service Bus namespace you created following&#xD;
the &lt;a href="http://www.windowsazure.com/en-us/develop/net/tutorials/multi-tier-application/"&gt;tutorial&#xD;
steps&lt;/a&gt;, {account} is likely “owner” (to boot) and {key} is the default key you&#xD;
copied from the portal. {appname} is some string, without spaces, that disambiguates&#xD;
your app from other apps on the same namespace and 2 stands for splitting the Service&#xD;
Bus traffic across 2 topics. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Most of the SignalR samples don’t quite work yet in a scale-out mode since they hold&#xD;
local, per-node state. That’s getting fixed. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you want to see SignalR and Service Bus in action right this second, you can hop&#xD;
into the Azure chat room on our &lt;a href="http://jabbr.cloudapp.net/#/rooms/azure"&gt;test&#xD;
deployment of jabbr&lt;/a&gt; that runs across 4 nodes.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=e8d14433-f773-4a19-91c0-138a9770a7c8"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=gyQoWklLFHI:HYhjtbchJkY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=gyQoWklLFHI:HYhjtbchJkY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/gyQoWklLFHI" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,e8d14433-f773-4a19-91c0-138a9770a7c8.aspx</comments>
    <feedburner:origLink>http://vasters.com/clemensv/2012/02/13/SignalR+Powered+By+Service+Bus.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=e2fc231c-78c6-4161-b126-28c843943ffa</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,e2fc231c-78c6-4161-b126-28c843943ffa.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,e2fc231c-78c6-4161-b126-28c843943ffa.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=e2fc231c-78c6-4161-b126-28c843943ffa</wfw:commentRss>
      <slash:comments>6</slash:comments>
      
      <title>Forget &amp;ldquo;Enterprise-Class Software&amp;rdquo;</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,e2fc231c-78c6-4161-b126-28c843943ffa.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/KP3DXpl1iXQ/Forget+LdquoEnterpriseClass+Softwarerdquo.aspx</link>
      <pubDate>Wed, 21 Dec 2011 20:45:39 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
The term “Enterprise-Class Software” was always a funny one since it’s been used to&#xD;
describe an amorphous class of software that’s somehow “more serious” than any other&#xD;
software – it’s “enterprise class”. But what is “enterprise class” software? What’s&#xD;
the “enterprise” that the term refers to? A 3,000 employee business? Or a 30,000 employee&#xD;
business? Can 3 people in an office do “serious” business that requires “enterprise&#xD;
class” software?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In the last few of years, I’ve seen the term slide from being merely amorphous to&#xD;
being outright poisonous and pointless. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We’re at a point where the private needs of an “enterprise”, and that includes the&#xD;
biggest ones, doesn’t represent much of an interesting frontier for software anymore,&#xD;
at least not from an architectural perspective. The industry has learned and is continuing&#xD;
to expand the knowledge on how to build systems that scale well beyond the need of&#xD;
an individual enterprise. We have learned how to deal with failure in ways that no&#xD;
longer require huge boxes with built-in triple redundancy. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The term “Enterprise Software” is poisonous because it implies a scalability ceiling&#xD;
for a solution serving a few 10,000 people that used to be ambitious, but that’s no&#xD;
longer the case. It’s also no longer the hardest class of software solutions – not&#xD;
at all.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A simple multi-player game for a mobile device that allows a quarter million or more&#xD;
players in groups of 16 to play against each other is killing the vast majority of&#xD;
“enterprise class” solutions in terms of required sophistication of its messaging&#xD;
infrastructure. It needs to scale to  an audience size that even the largest&#xD;
enterprises in the world won’t get on a system concurrently and that audience is going&#xD;
to be enormously unhappy if the infrastructure is dropping messages or is slow. Just&#xD;
search for “&lt;a href="http://www.bing.com/search?q=MW3+lag"&gt;MW3 lag&lt;/a&gt;” and you’ll&#xD;
find plenty of opinion about latency that’s louder and much more impactful on business&#xD;
than a few hundred employees lamenting about the speed of an internal website, because&#xD;
here you’ve got customers who are individually putting money on the table.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To suggest that consumer-facing scenarios are not “enterprise class” isn’t just arrogant,&#xD;
it’s also dangerous. Enterprises that don’t embrace mobile devices and start deeply&#xD;
interacting with consumers at “consumer scale” will find themselves in deep trouble.&#xD;
Software infrastructure vendors will find themselves in deep trouble if they still&#xD;
think of “enterprise scale” as a key capability or aspiration because their own customers,&#xD;
enterprises, will have to turn outward and embrace consumer scale or face the consequences.&#xD;
There’s also no reliability monopoly that “enterprise” holds in some way. When a systems&#xD;
needs to perform millions of transactions directly interacting with consumers, there’s&#xD;
no room for sweeping failures under the rug. It is actually easier to handle failures&#xD;
and provide high reliability in a tightly controlled, low-scale system than in a system&#xD;
that is the front-door of a business where each hiccup may personally upset a paying&#xD;
customer. It is also easier to shut down a system over the weekend or over a long&#xD;
holiday break than to keep it running 365/7/24. And it’s also easier to secure an&#xD;
insulated internal system than one that’s exposed to the outside world and where a&#xD;
single breach can tarnish the entire business’s reputation.   &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
“Enterprise software” is something where a single sale can generate a ton of revenue.&#xD;
But “enterprise-class” doesn’t represent anything interesting on the engineering side&#xD;
– except an outdated set of goals and a level of scalability that’s several magnitudes&#xD;
below what’s needed for an environment where more and more consumers have a personal&#xD;
computing device in their pocket and another on the coffee table. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
PS: Put “Web scale” on the same heap of useless terms. You ought to scale to your&#xD;
audience, not the web. &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=e2fc231c-78c6-4161-b126-28c843943ffa"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=KP3DXpl1iXQ:hdakAqTHg8U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=KP3DXpl1iXQ:hdakAqTHg8U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/KP3DXpl1iXQ" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,e2fc231c-78c6-4161-b126-28c843943ffa.aspx</comments>
    <feedburner:origLink>http://vasters.com/clemensv/2011/12/21/Forget+LdquoEnterpriseClass+Softwarerdquo.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=7bf6ac44-afba-42be-b7ea-3fe298310884</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,7bf6ac44-afba-42be-b7ea-3fe298310884.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,7bf6ac44-afba-42be-b7ea-3fe298310884.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=7bf6ac44-afba-42be-b7ea-3fe298310884</wfw:commentRss>
      
      <title>The Elements of Distributed Architecture</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,7bf6ac44-afba-42be-b7ea-3fe298310884.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/E5FX36-hRV4/The+Elements+Of+Distributed+Architecture.aspx</link>
      <pubDate>Tue, 20 Dec 2011 22:36:22 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I've long wanted to write an architecture book. The problem with books is that writing&#xD;
them robs you of at least half a year of your life, and that half a year is a&#xD;
very painful one. I've done it. So instead of a book, I talked to the folks at Pluralsight&#xD;
and made an on-demand video course.  &#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;a href="http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=eda"&gt;&#xD;
              &lt;em&gt;"The&#xD;
Elements of Distributed Architecture"&lt;/em&gt;&#xD;
            &lt;/a&gt;&#xD;
            &lt;em&gt; is about the foundational&#xD;
elements of distributed architecture and about the ‘physics’ that affect distributed&#xD;
software designs. The goal of this course, which is designed to be independent of&#xD;
specific languages, technologies, and products, is to provide software teams with&#xD;
a shared baseline of concepts and terminologies in the areas of information management,&#xD;
communication, presentation, processing, failure management, security, and safety.&lt;/em&gt;&#xD;
          &lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p dir="ltr"&gt;&#xD;
I think of this course as a baseline and there's plenty of runway for more&#xD;
in-depth material. If you like this one that will give me motivation to spend more&#xD;
private time (this course is not related to my Microsoft job) to create architectural&#xD;
material.  &#xD;
&lt;/p&gt;&#xD;
        &lt;p dir="ltr"&gt;&#xD;
If you don't have a Pluralsight account, &lt;a href="https://www.pluralsight-training.net/microsoft/Subscribe/Step1?isTrial=True"&gt;you&#xD;
can sign up for the free trial here&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=7bf6ac44-afba-42be-b7ea-3fe298310884"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E5FX36-hRV4:fany9RgyuUQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E5FX36-hRV4:fany9RgyuUQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/E5FX36-hRV4" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,7bf6ac44-afba-42be-b7ea-3fe298310884.aspx</comments>
      <category>Architecture</category>
    <feedburner:origLink>http://vasters.com/clemensv/2011/12/20/The+Elements+Of+Distributed+Architecture.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=45ae933a-3c7e-4863-98e9-c017673b3b55</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,45ae933a-3c7e-4863-98e9-c017673b3b55.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,45ae933a-3c7e-4863-98e9-c017673b3b55.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=45ae933a-3c7e-4863-98e9-c017673b3b55</wfw:commentRss>
      
      <title>4 Questions</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,45ae933a-3c7e-4863-98e9-c017673b3b55.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/onMBNcbddh4/4+Questions.aspx</link>
      <pubDate>Thu, 01 Dec 2011 17:38:37 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I answered 4 questions in Richard Seroter’s series of interviews with folks working&#xD;
on connect systems. See the &lt;a href="http://seroter.wordpress.com/2011/12/01/interview-series-four-questions-with-clemens-vasters/"&gt;Q&amp;amp;A&#xD;
here&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=45ae933a-3c7e-4863-98e9-c017673b3b55"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=onMBNcbddh4:tQHLn12We9E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=onMBNcbddh4:tQHLn12We9E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/onMBNcbddh4" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,45ae933a-3c7e-4863-98e9-c017673b3b55.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
    <feedburner:origLink>http://vasters.com/clemensv/2011/12/01/4+Questions.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=b2e9e279-8ab3-4126-905a-25650c57a468</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,b2e9e279-8ab3-4126-905a-25650c57a468.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,b2e9e279-8ab3-4126-905a-25650c57a468.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=b2e9e279-8ab3-4126-905a-25650c57a468</wfw:commentRss>
      
      <title>Achieving Transactional Behavior with Messaging</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,b2e9e279-8ab3-4126-905a-25650c57a468.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/QMq1ig_GCMg/Achieving+Transactional+Behavior+With+Messaging.aspx</link>
      <pubDate>Thu, 06 Oct 2011 21:10:14 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Elastic and dynamic multitenant cloud environments have characteristics that make&#xD;
traditional failure management mechanisms using coordinated 2-phase transactions a&#xD;
suboptimal choice. The common 2-phase commit protocols depend on a number of parties&#xD;
enlisted into a transaction making hard promises on the expected outcome of their&#xD;
slice a transaction. Those promises are difficult to keep in an environment where&#xD;
systems may go down at any time with their local state vanishing, where not all party&#xD;
trust each other, where significant latency may be involved, and network connectivity&#xD;
cannot be assumed to be reliable. 2-phase-commit is also not a good choice for operations&#xD;
that take significant amounts of time and span a significant amount of resources,&#xD;
because such a coordinated transaction may adversely affect the availability of said&#xD;
resources, especially in cases where the solution is a high-density multitenant solution&#xD;
where virtualized, and conceptually isolated resources are collocated on the same&#xD;
base resources. In such a case, database locks and locks on other resources to satisfy&#xD;
coordinated transaction promises may easily break the isolation model of a multitenant&#xD;
system and have one tenant affect the other.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Therefore, failure management – and this is ultimately what transactions are about&#xD;
– requires a somewhat different approach in cloud environments and other scalable&#xD;
distributed systems with similar characteristics. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To find a suitable set of alternative approaches, let’s quickly dissect what goes&#xD;
on in a distributed transaction: &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To start, two or more parties ‘enlist’ into a shared transaction scope performing&#xD;
some coordinated work that’s commonly motivated by a shared notion of a ‘job’ that &#xD;
needs to be executed. The goal of having a shared transaction scope is that the overall&#xD;
system will remain correct and consistent in both the success and the failure cases.&#xD;
Consistency in the success case is trivial. All participating parties could complete&#xD;
their slice of the job that had to be done. Consistency in the failure case is more&#xD;
interesting. If any party fails in doing their part of the job, the system will end&#xD;
up in a state that is not consistent. If you were trying to book a travel package&#xD;
and ticketing with the airline failed, you may end up with a hotel and a car, but&#xD;
no flight. In order to prevent that, a ‘classic’ distributed transaction asks the&#xD;
participants to make promises on the outcome of the transaction as the transaction&#xD;
is going on. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As all participating parties have tentatively completed but not finalized their work,&#xD;
the distributed transaction goes into a voting phase where every participant is asked&#xD;
whether it could tentatively complete its portion of the job and whether it can furthermore&#xD;
guarantee with a very high degree of certainty that it can finalize the job outcome&#xD;
and make it effective when asked to do so. Imagine a store clerk who puts an item&#xD;
on the counter that you’d like to purchase – you’ll show him your $10 and ask for&#xD;
a promise that he will hand you the item if you give him the money – and vice versa. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Finally, once all parties have made their promises and agreed that the job can be&#xD;
finalized, they are told to do so.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
There are two big interesting things to observe about the 2-phase-commit (2PC) distributed&#xD;
transaction model that I just described: First, It’s incredibly simple from a developer’s&#xD;
perspective because the transaction outcome negotiation is externalized and happens&#xD;
as ‘magic’. Second, it’s not resembling anything that happens in real life and that&#xD;
should be somewhat suspicious. You may have noticed that there was no neutral escrow&#xD;
agent present when you bought the case of beverages at the store for $10 two paragraphs&#xD;
earlier. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The grand canonical example for 2PC transactions is a bank account transfer. You debit&#xD;
one account and credit another. These two operations need to succeed or fail together&#xD;
because otherwise you are either creating or destroying money (which is illegal, by&#xD;
the way). So that’s the example that’s very commonly used to illustrate 2PC transactions.&#xD;
The catch is – that’s not how it really works, at all. Getting money from one bank&#xD;
account to another bank account is a fairly complicated affair that touches a ton&#xD;
of other accounts. More importantly, it’s not a synchronous fail-together/success-together&#xD;
scenario. Instead, principles of accounting apply (surprise!). When a transfer is&#xD;
initiated, let’s say in online banking, the transfer is recorded in form of a message&#xD;
for submission into the accounting system and the debit is recorded in the account&#xD;
as a ‘pending’ transaction that affects the displayed balance. From the user’s perspective,&#xD;
the transaction is ’done’, but factually nothing has happened, yet. Eventually, the&#xD;
accounting system will get the message and start performing the transfer, which often&#xD;
causes a cascade of operations, many of them yielding further messages, including&#xD;
booking into clearing accounts and notifying the other bank of the transfer. The principle&#xD;
here is that all progress is forward. If an operation doesn’t work for some technical&#xD;
reason it can be retried once the technical reason is resolved. If operation fails&#xD;
for a business reason, the operation can be aborted – but not by annihilating previous&#xD;
work, but by doing the inverse of previous work. If an account was credited, that&#xD;
credit is annulled with a debit of the same amount. For some types of failed transactions, &#xD;
the ‘inverse’ operation may not be fully symmetric but may result in extra actions&#xD;
like imposing penalty fees. In fact, in accounting, annihilating any work is illegal&#xD;
– ‘delete’ and ‘update’ are a great way to end up in prison. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As all the operations occur that eventually lead to the completion or failure of the&#xD;
grand complex operation that is a bank transfer, the one thing we’ll be looking to&#xD;
avoid is to be in any kind of ‘doubt’ of the state of the system. All participants&#xD;
must be able to have a great degree of confidence in their knowledge about the success&#xD;
or failure of their respective action. No shots into the dark. There’s no maybe. Succeed&#xD;
or fail. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
That said, “fail” is a funny thing is distributed systems because it happens quite&#xD;
a bit. In many cases “fail” isn’t something that a bit of patience can’t fix. Which&#xD;
means that teaching the system some patience and tenacity is probably a good idea&#xD;
instead of giving up too easily. So if an operation fails because it runs into a database&#xD;
deadlock or the database is offline or the network is down or the local machine’s&#xD;
network adapter just got electrocuted that’s all not necessarily a reason to fail&#xD;
the operation. That’s a reason to write an alert into a log and call for help for&#xD;
someone to fix the environment condition. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If we zoom into an ‘operation’ here, we might see a message that we retrieve from&#xD;
some sort of reliable queue or some other kind of message store and subsequently an&#xD;
update of system state based on message. Once the state has been successfully updated,&#xD;
which may mean that we’ve inserted a new database record, we can tell the message&#xD;
system that the message has been processed and that it can be discarded. That’s the&#xD;
happy case. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Let’s say we take the message and as the process wants to walk up the database the&#xD;
power shuts off. Click. Darkness. Not a problem. Assuming the messaging system supports&#xD;
a ‘peek/lock’ model that allows the process to first take the message and only remove&#xD;
it from the queue once processing has been completed, the message will reappear on&#xD;
the queue after the lock has expired and the operation can be retried, possibly on&#xD;
a different node. That model holds true for all failures of the operation through&#xD;
to and in the database. If the operation fails due to some transient condition (including&#xD;
the network card smoking out, see above), the message is either explicitly abandoned&#xD;
by the process or returns into the queue by ways of a lock timeout.  If the operation&#xD;
fails because something is really logically wrong, like trying to ship a product out&#xD;
of the inventory that’s factually out of stock, we’ll have to take some forward action&#xD;
to deal with that. We’ll get to that in a bit. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Assuming the operation succeeded, the next tricky waypoint is failure after success,&#xD;
meaning that the database operation succeeded, but the message subsequently can’t&#xD;
be flagged as completed and thus can’t be removed from the queue. That situation would&#xD;
potentially lead to another delivery of the message even though the job has already&#xD;
been completed and therefore would cause the job to be executed again – which is only&#xD;
a problem if the system isn’t expecting that, or, in fancier terms, if it’s not ‘idempotent’.&#xD;
If the job is updating a record to absolute values and the particular process/module/procedure&#xD;
is the only avenue to perform that update (meaning there are no competing writers&#xD;
elsewhere), doing that update again and again and again is just fine. That’s natural&#xD;
idempotency. If the job is inserting a record, the job should contain enough information,&#xD;
such as a causality or case or logical transaction identifier that allows the process&#xD;
to figure out whether the desired record has already been inserted and if that’s the&#xD;
case it should do nothing, consider its own action a duplicate and just act as if&#xD;
it succeeded. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Checkpoint: With what I said in the last two paragraphs, you can establish pretty&#xD;
good confidence about failure or success of individual operations that are driven&#xD;
by messages. You fail and retry, you fail and take forward action, or you succeed&#xD;
and take steps to avoid retrying even if the system presents the same job again. There’s&#xD;
very little room for doubt. So that’s good.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The ‘forward action’ that results from failure is often referred to as ‘compensation’,&#xD;
but that’s a bit simplistic. The forward action resulting from running into the warehouse&#xD;
with the belief that there’s still product present while the shelf is factually empty&#xD;
isn’t to back out and cancel the order (unless you’re doing a firesale of a touch&#xD;
tablet your management just killed). Instead, you notify the customer of the shipping&#xD;
delay, flag a correction of the inventory levels, and put the item on backorder. For&#xD;
the most part, pure ‘compensation’ doesn’t really exist. With every action, the system&#xD;
ends up in a consistent state. It’s just that some states are more convenient than&#xD;
others and there are some state for which the system has a good answer and some states&#xD;
for which it doesn’t. If the system ends up in a dead end street and just wants to&#xD;
sit down and cry because nobody told it what to do now, it should phone home and ask&#xD;
for human intervention. That’s fine and likely a wise strategy in weird edge cases. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Initiating the ‘forward action’ and, really, any action in a system that’s using messaging&#xD;
as its lifeline and as a backplane for failure resilience as I’m describing it here&#xD;
is not entirely without failure risk in itself. It’s possible that you want to initiate&#xD;
an action and can’t reach the messaging system or sending the message fails for some&#xD;
other reason. Here again, patience and tenacity are a good idea. If we can’t send,&#xD;
our overall operation is considered failed and we won’t flag the initiating message&#xD;
as completed. That will cause the job to show up again, but since we’ve got idempotency&#xD;
in the database that operation will again succeed (even if by playing dead) or fail&#xD;
and we will have the same outcome allowing us to retry the send. If it looks like&#xD;
we can send but sending fails sometime during the operation, there might be doubt&#xD;
about whether we sent the message. Since doubt is a problem and we shouldn’t send&#xD;
the same message twice, duplicate detection in the messaging system can help suppressing&#xD;
a duplicate so that it never shows up at the receiver. That allows the sender to confidently&#xD;
resend if it’s in doubt about success in a prior incarnation of processing the same&#xD;
message.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Checkpoint: We now also can establish pretty good confidence about initiating forward&#xD;
action or any other action in the system given if the ‘current’ action is following&#xD;
the principles described above.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So far I’ve talked about individual actions and also about chains of actions, albeit&#xD;
just in the failure case. Obviously the same applies to success cases where you want&#xD;
to do something ‘next’ once you’re done with ‘this’. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now let’s assume you want to do multiple things in parallel, like updating multiple&#xD;
stores as part of executing a single job – which gets us back to the distributed transaction&#xD;
scenario discussed earlier. What helps in these cases is if the messaging system supports&#xD;
‘topics’ that allow dropping a message (the job) into the messaging system once and&#xD;
serve the message to each participant in the composite activity via their own subscription&#xD;
on the topic. Since the messaging system is internally transactional it will guarantee&#xD;
that each message that is successfully submitted will indeed appear on each subscription&#xD;
so it ensures the distribution. With that, the failure handling story for each slice&#xD;
of the composite job turns into the same model that I’ve been explaining above. Each&#xD;
participant can be patient and tenacious when it comes to transient error conditions.&#xD;
In hard failure cases, the forward action can be a notification to the initiator that&#xD;
will then have to decide how to progress forward, including annulling or otherwise&#xD;
invoking forward actions activities that have been executed in parallel. In the aforementioned&#xD;
case of a ticketing failure that means that the ticketing module throws its hands&#xD;
up and the module responsible for booking the travel package either decides to bubble&#xD;
the case to the customer or an operator leaving the remaining reservations intact&#xD;
or to cancel the reservations for the car and the hotel that have been made in parallel.&#xD;
Should two out of three or more participants’ operations fail and each report up to&#xD;
the initiator, the initiator can either keep track of whether it already took corrective&#xD;
forward action on the third participant or, in doubt, the idempotency rule should&#xD;
avoid doing the same thing twice.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The model described here is loosely based on the notion of ‘Sagas’, which were first&#xD;
described in a 1987 ACM paper by Hector Garcia-Molina and Kenneth Salem, so this isn’t&#xD;
grand news. However, the notion of such Sagas is only now really gaining momentum&#xD;
with long-running and far distributed transactions becoming more commonplace, so it’s&#xD;
well worth to drag the model further out into the limelight and give it coverage.&#xD;
The original paper on Sagas is still assuming that the individual steps can be encapsulated&#xD;
in a regular transaction, which may not even be the case in the cloud and with infrastructures&#xD;
that don’t have inherent transaction support. The role of the messaging system with&#xD;
the capabilities mentioned above is to help compensate for the absence of that support. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
… to be continued …&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=b2e9e279-8ab3-4126-905a-25650c57a468"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QMq1ig_GCMg:QE4K8-jDQTk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QMq1ig_GCMg:QE4K8-jDQTk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/QMq1ig_GCMg" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,b2e9e279-8ab3-4126-905a-25650c57a468.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
    <feedburner:origLink>http://vasters.com/clemensv/2011/10/06/Achieving+Transactional+Behavior+With+Messaging.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=c9910112-9c07-439d-a40c-39dcf308f230</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,c9910112-9c07-439d-a40c-39dcf308f230.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,c9910112-9c07-439d-a40c-39dcf308f230.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=c9910112-9c07-439d-a40c-39dcf308f230</wfw:commentRss>
      <slash:comments>3</slash:comments>
      
      <title>The Three Kinds of Reorgs</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,c9910112-9c07-439d-a40c-39dcf308f230.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/FefgzQ0LPgI/The+Three+Kinds+Of+Reorgs.aspx</link>
      <pubDate>Fri, 30 Sep 2011 01:48:39 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Reshuffling the deck is inevitable form time to time in any big company as projects&#xD;
and strategies shift – Reorg time!&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’ve so far identified three kinds. Let me describe them with an analogy:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Picture yourself on a patch of land in the middle of nowadays Germany in the early&#xD;
1800s …&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
… you sit there, watching you potatoes grow and in the distance you see a big dust&#xD;
cloud with people and horses and wagons and weapons moving from West to East. Two&#xD;
months later, someone knocks on your door and says – in French – “I want your taxes!”&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
… you sit there, watching your potatoes grow and a big dust cloud with people and&#xD;
horses and wagons and weapons moving from West to East moves right over your field&#xD;
– and the potatoes are gone. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
… you sit there, watching your potatoes grow and a big dust cloud a big dust cloud&#xD;
with people and horses and wagons and weapons approaches from the West – and a similar&#xD;
looking one from the East (!!!) and you end up dead.&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=c9910112-9c07-439d-a40c-39dcf308f230"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=FefgzQ0LPgI:ZSab-iZm9Po:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=FefgzQ0LPgI:ZSab-iZm9Po:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/FefgzQ0LPgI" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,c9910112-9c07-439d-a40c-39dcf308f230.aspx</comments>
    <feedburner:origLink>http://vasters.com/clemensv/2011/09/30/The+Three+Kinds+Of+Reorgs.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=bb1fc000-b441-445b-8909-104bd754f60d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,bb1fc000-b441-445b-8909-104bd754f60d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,bb1fc000-b441-445b-8909-104bd754f60d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=bb1fc000-b441-445b-8909-104bd754f60d</wfw:commentRss>
      
      <title>Service Bus Relay Load Balancing&amp;ndash;The Missing Feature (But Not For Much Longer!)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,bb1fc000-b441-445b-8909-104bd754f60d.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/7ZBwu6QqZ5c/Service+Bus+Relay+Load+BalancingndashThe+Missing+Feature+But+Not+For+Much+Longer.aspx</link>
      <pubDate>Tue, 20 Sep 2011 23:54:10 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Load Balancing on the Service Bus Relay is by far our #1 most requested feature now&#xD;
that we’ve got Queues and Topics finally in production. It’s reasonable expectation&#xD;
for us deliver that capability in one of the next production updates and the good&#xD;
news is that we will. I’m not going to promise any concrete ship dates here, but it’d&#xD;
be sorely disappointing if that wouldn’t happen while the calendar still says 2011. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I just completed writing the functional spec for the feature and it’s worth communicating&#xD;
how the feature will show up, since there is a tiny chance that the behavioral change&#xD;
may affect implementations that rely on a particular exception to drive the strategy&#xD;
of how to perform failover. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The gist of the Load Balancing spec is that the required changes in your code and&#xD;
config to get load balancing are zero. With either the NetTcpRelayBinding or any of&#xD;
the HTTP bindings (WebHttpRelayBinding, etc) as well as the underlying transport binding&#xD;
elements, you’ll just open up a second (and third and fourth … up to 25) listener&#xD;
on the same name and instead of getting an AddressAlreadyInUseException as you get&#xD;
today, you’ll just get automatic load balancing. When a request for your endpoints&#xD;
shows up at Service Bus, the system will roll the dice on which of the connected listeners&#xD;
to route the request or connection/session to and perform the necessary handshake&#xD;
to make that happen.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The bottom line is that we’re effectively making the AddressAlreadyInUseException&#xD;
go away for the most part. It’ll still be thrown when the listener’s policy settings&#xD;
don’t match up, i.e. when one listener wants to have Access Control enabled and the&#xD;
other one doesn’t, but otherwise you’ll just won’t see it anymore. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The only way this way of just lighting up the feature may get anyone in trouble is&#xD;
if your application were to rely on that exception in a situation where you’ve got&#xD;
an active listener on Service Bus on one node and a ‘standby’ listener on another&#xD;
node that keeps trying to open up a listener into the same address to create a hot/warm&#xD;
cluster failover scheme &lt;em&gt;and&lt;/em&gt; if the two nodes were tripping over each other&#xD;
if they were getting traffic concurrently. That doesn’t seem too likely. If you have&#xD;
questions about this drop me a line here in the comments, by email to clemensv at&#xD;
microsoft.com or on Twitter @clemensv.  &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=bb1fc000-b441-445b-8909-104bd754f60d"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=7ZBwu6QqZ5c:2j0Z7vqWFEI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=7ZBwu6QqZ5c:2j0Z7vqWFEI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/7ZBwu6QqZ5c" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,bb1fc000-b441-445b-8909-104bd754f60d.aspx</comments>
      <category>.NET Services</category>
      <category>AppFabric</category>
      <category>Architecture</category>
    <feedburner:origLink>http://vasters.com/clemensv/2011/09/20/Service+Bus+Relay+Load+BalancingndashThe+Missing+Feature+But+Not+For+Much+Longer.aspx</feedburner:origLink></item>
  </channel>
</rss>

