<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>SOA Patterns Book feed - Arnon Rotem-Gal-Oz</title>
    <link>http://www.rgoarchitects.com/nblog/</link>
    <description>"Making IT work" - Musings of a Holistict Architect</description>
    <language>en-us</language>
    <copyright>Arnon Rotem-Gal-Oz</copyright>
    <lastBuildDate>Thu, 30 Apr 2009 19:49:44 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>Arnon@RgoArchitects.com</managingEditor>
    <webMaster>Arnon@RgoArchitects.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/SOAPatterns" type="application/rss+xml" /><item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=89f18198-106f-41a3-9590-1690ff17cefe</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,89f18198-106f-41a3-9590-1690ff17cefe.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,89f18198-106f-41a3-9590-1690ff17cefe.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=89f18198-106f-41a3-9590-1690ff17cefe</wfw:commentRss>
      
      <title>SOA Patterns &amp;ndash; Blogjecting Watchdog</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,89f18198-106f-41a3-9590-1690ff17cefe.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/YH7RY4aDP8I/SOAPatternsNdashBlogjectingWatchdog.aspx</link>
      <pubDate>Thu, 30 Apr 2009 19:49:44 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
As I mentioned in the &lt;a href="http://www.rgoarchitects.com/nblog/2009/04/28/UpAndRunning.aspx"&gt;previous&#xD;
post&lt;/a&gt; I got a few interesting questions lately. The first from &lt;a href="http://colinjack.blogspot.com/"&gt;Colin&lt;/a&gt; regarding&#xD;
developing a customized solution for the blogjecting watchdog pattern vs. integrating/developing&#xD;
for a commercial monitoring suite (e.g. Unicenter/OpenView etc.). The second question&#xD;
I received was from &lt;a href="http://codebetter.com/blogs/dru.sellers/"&gt;Dru&lt;/a&gt; on&#xD;
running multiple versions of services (e.g. during upgrade) with active &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf"&gt;Sagas&lt;/a&gt; in&#xD;
the background. I think these questions are interesting enough to be answered as blog&#xD;
posts.Also since both these questions are related to the Blogjecting Watchdog pattern&#xD;
I thought it would be better to explain what it is actually first..&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So here it is :)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a name="_Toc163673245"&gt;Blogjecting Watchdog&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Achieving availability is a multi-layered effort. I’ve already talked about how services&#xD;
should be autonomous (see for example Active Service pattern in chapter 2) , the Blogjecting&#xD;
Watchdog pattern will take a look at another aspect of autonomy. The Blogjecting Watchdog&#xD;
pattern shows how a service can proactively try to identify faults and problems and&#xD;
to try to heal itself when it identifies these problems.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;&#xD;
            &lt;u&gt;&#xD;
              &lt;i&gt;1.1&lt;/i&gt; The Problem&lt;/u&gt;&#xD;
          &lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The Service Instance pattern (see section 3.4) for example, demonstrates a strategy&#xD;
that a service can implement to be able to cope with failure. The question is – is&#xD;
that enough? Is it enough for the service to try to cope with everything by itself?&#xD;
My answer is no, that is not enough. For one once we dealt with the failure within&#xD;
the service, the service ability to cope with the next failure would probably be diminished.&#xD;
For example if we found a failure in a server and moved to a standby server, the new&#xD;
server does not have another stand-by server to move to if another fault occurs. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Additionally, the failure might be too much for the service to be able to overcome&#xD;
it by itself. Like a switch going down - So we would have something external that&#xD;
looks after the service and could help the service (see Service Monitor pattern in&#xD;
chapter 4). &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To increase the service autonomy and to increase the overall availability of our SOA&#xD;
we need both to try to identify and repair problem and to be able to notify the world&#xD;
about the service’s current status.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The question is then:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
How can we identify and attend to problems and failures in the service and increase&#xD;
service availability?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One option is to try to infer the state of the service from the way it looks to the&#xD;
outside – yes this is as crude as it sound. You try to call the service, it doesn't&#xD;
respond you know it is down; you call the service, you expect to get a reply in 5&#xD;
seconds you get it in 10 seconds, you understand that the service is congested. This&#xD;
is not a very good option as the external behavior only gives us coarse knowledge&#xD;
on the service's state. For example, if the services has a decent fault tolerance&#xD;
solution, we wouldn't know that anything happened – but the truth is that the service&#xD;
ability to handle the next fault might not exist anymore.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Another way is to install agents on the service's servers, this will give you a much&#xD;
better picture of what happens (vs. the option above). For example, you will also&#xD;
be able to get trend information (e.g. You can watch how much disk space is left and&#xD;
alert when it is getting low). There are several problems with this solution. One&#xD;
is that you need to actively install software on the service's servers which both&#xD;
decreases the service autonomy and creates a management hassle in itself. Another&#xD;
problem is that you still only get an external view of the service behavior (you just&#xD;
gain access more information). There are situations (see for example the Mashup pattern&#xD;
in chapter 7) where not all the services are under your control and you cannot access&#xD;
their hardware.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Yet another option is to actively question the service about it state. The has one&#xD;
big advantage over the two previous options since you also get some inside information&#xD;
regarding what the service has to say about its state. This enables the service to&#xD;
communicate trends in problems that will actually make it fail. For example if the&#xD;
service does not write any information into the local disk a low disk space is not&#xD;
a problem at all, if this is the disk where the database is located it is very much&#xD;
a problem. The solution is not perfect since it is the observers responsibility to&#xD;
go after the information. If the rate at which the observer samples the service is&#xD;
not fast enough it can miss on vital information.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As I mentioned earlier we want something that will help increase the service’s autonomy&#xD;
so a better approach in this regard would be for the service to watch over itself &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;&#xD;
            &lt;u&gt;1.2 The Solution&lt;/u&gt;&#xD;
          &lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Watching over itself is also not enough as we also said we need the “world” to know&#xD;
what happening with the service, thus a combines solution is to :&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Implement the Blogjecting Watchdog pattern and have the service actively monitor its&#xD;
internal state, try to heal itself and continuously publish its state and other important&#xD;
indicators.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.rgoarchitects.com/nblog/content/binary/WindowsLiveWriter/SOAPatternsBlogjectingWatchdog_13F42/clip_image002_2.jpg"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.rgoarchitects.com/nblog/content/binary/WindowsLiveWriter/SOAPatternsBlogjectingWatchdog_13F42/clip_image002_thumb.jpg" width="584" height="467"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Figure 3.14 The blogjecting watchdog pattern. The blogjecting. The blogjecting component&#xD;
that send the reports out and and listens for requests. The watchdog component monitor&#xD;
the status of the business service, tries to heal stray components and log any failure. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The pattern revolves around a single idea – to increase the service responsibility&#xD;
by using two complementary concepts reporting and self healing. The first is the Blogjecting&#xD;
concept where the service implements the Active Service pattern (see chapter 2 for&#xD;
more details) and a component which is in charge of monitoring the service's state.&#xD;
The component publish (see the publish/Subscribe interaction pattern in chapter 6)&#xD;
also the service's state on a cyclic basis or when something meaningful occurs. It&#xD;
is important to note that the fact that the service actively publishes its state doesn't&#xD;
have to mean it cannot also respond to inquiries regarding its health (akin to living&#xD;
a comment on a blog and getting a response from the author)&#xD;
&lt;/p&gt;&#xD;
        &lt;table border="2" cellspacing="0" cellpadding="2" width="1001"&gt;&#xD;
          &lt;tbody&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="997"&gt;&#xD;
                &lt;p&gt;&#xD;
What are Blogjects&#xD;
&lt;/p&gt;&#xD;
                &lt;p&gt;&#xD;
The term Blogjects was coined by Julian Bleecker back in 2005 (Bleecker, 2005) to&#xD;
describe "edgy designed objects that report themselves, or expose their experiences&#xD;
in some fashion" or in other words Blogject == Objects that blog. Julian Bleecker's&#xD;
vision for Blogjects is wider than the one suggested here. Jonathan's vision is for&#xD;
things that participate in the Web 2.0 sense of social-web or even further than that&#xD;
– to use Julian’s words :“Forget about the Internet of Things as Web 2.0, refrigerators&#xD;
connected to grocery stores, and networked Barcaloungers. I want to know how to make&#xD;
the Internet of Things into a platform for World 2.0. How can the Internet of Things&#xD;
become a framework for creating more habitable worlds, rather than a technical framework&#xD;
for a television talking to an reading lamp?” . I highly recommend taking a look at&#xD;
the full paper “A Manifesto for Networked Objects – Cohabiting with Pigeons, Arphids&#xD;
and Aibos in the Internet of Things” (Bleecker, 2006) to get the full picture.&#xD;
&lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
          &lt;/tbody&gt;&#xD;
        &lt;/table&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The second concept that plays in the Blogjecting Watchdog pattern is the watchdog,&#xD;
The idea here is to have a component that listens in on the information gathered and&#xD;
published by the blogject component and then to acts on that information in a meaningful&#xD;
way to increase the reliability and availability of the service. The possibilities&#xD;
for implementing self-healing are endless, two simple examples for self-healing actions&#xD;
are restating failed components and cleaning temporary files. &#xD;
&lt;/p&gt;&#xD;
        &lt;table border="2" cellspacing="0" cellpadding="2" width="1006"&gt;&#xD;
          &lt;tbody&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="1002"&gt;&#xD;
                &lt;p&gt;&#xD;
Watchdogs&#xD;
&lt;/p&gt;&#xD;
                &lt;p&gt;&#xD;
Watchdog (actually watchdog timer) is a term borrowed from the embedded systems world.&#xD;
A watchdog is a hardware device that counts down to zero, and when it gets there it&#xD;
reset the device. To prevent this reset the application has to “kick the dog” before&#xD;
the timer runs out. If the application does not reset the counter it means that the&#xD;
application is hanged and the idea is that the reset would fix that. &#xD;
&lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
          &lt;/tbody&gt;&#xD;
        &lt;/table&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
How is the Blogjecting Watchdog pattern better than the other options mentioned above? &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Even if we just consider the blogjecting part of the pattern we can see several advantages&#xD;
over the other approaches. The Blogjecting Watchcdog combines the benefits of an agent&#xD;
that actively monitors the service's health with the internal knowledge of what's&#xD;
important for the service continuity and what's not. Unlike the external agents solution,&#xD;
using Blogjects, the service retains its autonomy. The autonomy is increased even&#xD;
further when you combine the self-healing features of the watchdog. Thus the end result&#xD;
is a service which is more resilient (and thus has higher availability), which lets&#xD;
the world know both its current state as well as future trends.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In one project I was working on we inherited a situation where there were interdependencies&#xD;
between executable installed on different servers (within a service) – for example&#xD;
when one process was down on server A the objects running on server B could not function&#xD;
well and other such dependencies (this isn’t the brightest design, but sometimes you&#xD;
have to compromise - in this case there was no time and budget to redesign these applications).&#xD;
What we ended up with, is something like the situation in figure 3.15 below:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.rgoarchitects.com/nblog/content/binary/WindowsLiveWriter/SOAPatternsBlogjectingWatchdog_13F42/clip_image005_2.gif"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="clip_image005" border="0" alt="clip_image005" align="right" src="http://www.rgoarchitects.com/nblog/content/binary/WindowsLiveWriter/SOAPatternsBlogjectingWatchdog_13F42/clip_image005_thumb.gif" width="627" height="554"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Figure 3.15 a sample deployment of a blogjecting watchdog. The daemons on the servers&#xD;
monitor the running components on each server. The Watchdog edge exposes the current&#xD;
the current state both through a web-services API and as SNMP traps&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The watchdog agents on each of the server nodes monitors the components. The agents&#xD;
communicate amongst themselves to examine the dependencies and actions taken. The&#xD;
watchdog Edge component provides a WSDL based endpoint where other services can query&#xD;
it for the service’s health. It also publishes SNMP traps to an external SNMP monitor&#xD;
(e.g. HP-Openview). As an implementation hint, I can suggest keeping the watchdog&#xD;
components in a separate very simple executable (preferably a daemon that runs when&#xD;
the OS loads). The simpler the component, the lower the risk it will fail in itself&#xD;
(you can of course have a backup in the form of a hardware watchdog ..). Let’s take&#xD;
a more thorough look at the technology mapping options&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a name="_Toc163673246"&gt;1.3 Technology Mapping&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Implementing Blogjecting Watchdog in an enterprise will usually pre-determine the&#xD;
protocols you will have to use for your “blog”. The IT team will most likely already&#xD;
standardize on one of the leading monitoring suites (CA-Unicenter, HP-Openview, IBM-Tivoli&#xD;
or if you are an all Microsoft shop Microsoft Operations Manager). In these cases&#xD;
you can use the SDK of the monitoring software (e.g. the Unicenter Agent SDK or MOM&#xD;
management pack developer guides). There are even 3&lt;sup&gt;rd&lt;/sup&gt; party software packages&#xD;
to help you build such agents (for example OC Systems have a Universal Agent that&#xD;
makes it easier to write agents for Unicenter).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Note, that this is not always the case though, and sometimes you do have the freedom&#xD;
to choose you protocols. Few projects I worked on chose to standardize on using web-services&#xD;
with specific messages for monitoring the health of service (so we had a specific&#xD;
endpoint for each service where these messages were supported). With the emergent&#xD;
of SOA specific tools like the ones by Amberpoint and Weblayers you will see more&#xD;
and more WS-* based monitoring.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Other ways for reporting your internal state can be to use standards like SNMP (Simple&#xD;
Network Management Protocol) or plainly the windows Event logs An interesting option,&#xD;
which will let your Blogjecting Watchdog literally blog is to use a product called&#xD;
RSSBus. Whish is an ESB implementation that uses RSS protocol for communications.&#xD;
At the time I am writing this, the product is still in beta, so I haven’t used it&#xD;
for a serious system yet. Nevertheless, it looks like an interesting direction which&#xD;
I’ll consider when it is released. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Regarding the self-healing part (watchdog), self-healing is still more prevalent in&#xD;
hardware then in software (watchdog timers, RAID, IBM , hot spare memories, hot spare&#xD;
drives etc.) in a sense any solution that builds on clustering technology also has&#xD;
some of that built-in. The virtualization trend will also help in this sense (see&#xD;
discussion on utility computing in this chapter’s summary). You can already read papers&#xD;
that talk about self-healing web services (G. Kouadri Mostéfaoui, 2006) or see some&#xD;
projects that tries to look into this problem (e.g. WS-Diamond - DIAgnosability, Monitoring&#xD;
and Diagnosis). Nevertheless, all of them are still in the research phase and if you&#xD;
want something now, you will probably need to implement something by yourself. In&#xD;
my experience, it won’t take you too much time to have a basic watchdog up and running&#xD;
, but it will take you sometime until you will have it predicting and acting as an&#xD;
advanced warning system. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a name="_Toc163673247"&gt;1.4 Quality Attribute Scenarios&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The Blogjecting Watchdog is an interesting pattern (and not just because of its odd&#xD;
name) as it can really help on the way to autonomous computing. The effect of this&#xD;
proactive approach is to increase the overall reliability of the service. A service&#xD;
which is self-healing can overcome (at least) minor problem which results in better&#xD;
availability overall. Additionally the monitoring aspects of the Blogjecting Watchdog&#xD;
also help enhance availability by notifying administrators that something is amiss&#xD;
(which will enable them to fix it). &#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;&lt;p&gt;&#xD;
Quality Attribute (level1)&#xD;
&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="204"&gt;&lt;p&gt;&#xD;
Quality Attribute (level2)&#xD;
&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="206"&gt;&lt;p&gt;&#xD;
Sample Scenario&#xD;
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;&lt;p&gt;&#xD;
Availability &#xD;
&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="204"&gt;&lt;p&gt;&#xD;
Failure detection&#xD;
&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="206"&gt;&lt;p&gt;&#xD;
Upon a failure or degraded performance, The system will alert the system admin (via&#xD;
SMS) within 3 minutes. &#xD;
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;&lt;p&gt;&#xD;
Reliability&#xD;
&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="204"&gt;&lt;p&gt;&#xD;
Increased autonomy &#xD;
&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="206"&gt;&lt;p&gt;&#xD;
During normal operations, the system will clear all its temporary resources (e.g.&#xD;
files) continuously &#xD;
&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Table 1.1 Blogjecting Watchdog pattern quality attributes scenarios. These are the&#xD;
architectural scenarios that can make us think about using the Blogjecting Watchdog&#xD;
pattern.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once we introduce a monitor and start to collect data, we can start to find new uses&#xD;
for that data, for  example we can use the information on incoming request to&#xD;
try to locate attacks on the service etc. Saved monitoring data can be used to analyze&#xD;
the service’s behavior over time, predict failures and thus increase its maintainability&#xD;
etc.&#xD;
&lt;/p&gt;&#xD;
        &lt;hr align="left" size="1" width="33%"&gt;&lt;/hr&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a name="_msocom_1"&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=89f18198-106f-41a3-9590-1690ff17cefe"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=YH7RY4aDP8I:axlNcv_CgAo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=YH7RY4aDP8I:axlNcv_CgAo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=YH7RY4aDP8I:axlNcv_CgAo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=YH7RY4aDP8I:axlNcv_CgAo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?i=YH7RY4aDP8I:axlNcv_CgAo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=YH7RY4aDP8I:axlNcv_CgAo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?i=YH7RY4aDP8I:axlNcv_CgAo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=YH7RY4aDP8I:axlNcv_CgAo:OeDfYtfaWk4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=OeDfYtfaWk4" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,89f18198-106f-41a3-9590-1690ff17cefe.aspx</comments>
      <category>Q&amp;A</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2009/04/30/SOAPatternsNdashBlogjectingWatchdog.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=39010599-d04b-4303-b560-64df4e06a269</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,39010599-d04b-4303-b560-64df4e06a269.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,39010599-d04b-4303-b560-64df4e06a269.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=39010599-d04b-4303-b560-64df4e06a269</wfw:commentRss>
      
      <title>Implementing a WCF service firewall part II of N</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,39010599-d04b-4303-b560-64df4e06a269.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/qW9d7vgeq4I/ImplementingAWCFServiceFirewallPartIIOfN.aspx</link>
      <pubDate>Fri, 06 Mar 2009 23:01:58 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
the&lt;a href="http://www.rgoarchitects.com/nblog/2009/02/22/ImplementingAWCFServiceFirewallPartIOfN.aspx"&gt; previous&#xD;
installment&lt;/a&gt; provided some context as to why I want to implement this pattern.&#xD;
This&lt;br&gt;&#xD;
installment will look at some of the implementation options. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
As I noted before, WCF provides quite a lot of extension points on the route the message&#xD;
pass from arriving on the service to the point WCF&lt;br&gt;&#xD;
calls the actual method in the service instance. Several of those extension points&#xD;
are possible candidates for the Service Firewall for instance &#xD;
&lt;br&gt;&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Contract Filter-The contract filter is responsible to route messages to the appropriate&#xD;
contract. It needs to be a subclass of a &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.messagefilter.aspx"&gt;MessageFilter&lt;/a&gt;.&#xD;
It looks that the contract filter is a good option since it intercepts the call rather&#xD;
early so it means it would probably be the fastest option. Also its name (filter..)&#xD;
implies it is a good option&lt;br&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Message Inspector - The Message inspector is responsible for looking at or modifying&#xD;
messages when they enter a service and looks like a natural candidate for the job.&#xD;
There are two kinds of Message Inspectors: Those who look at messages on the client&#xD;
side (implement the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector.aspx"&gt;IClientMessageInspector &lt;/a&gt;interface)&#xD;
and those that look at the server side (implement the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.idispatchmessageinspector.aspx"&gt;IDispatchMessageInspector&lt;/a&gt;).&#xD;
It seems that the latter is the type of inspector we need here.&lt;br&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthorizationmanager.aspx"&gt;Service&#xD;
Authorization Manager&lt;/a&gt; - responsible for evaluating policies, claims etc. of the&#xD;
client to make sure that a call is valid from the security perspective. This looks&#xD;
like it would be a good class to use for a real service firewall. It seems it won't&#xD;
be a good fit for the purpose of what we need here.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
When I need to choose  between several technical options that seem to be similar&#xD;
I usually do a POC - proof of concept.  A piece of throwaway code to get a feel&#xD;
of the different options and better understand their strengths and weaknesses (in&#xD;
the context of the solution I seek). &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
What I did was to take a class I prepared for some of the integration tests of the &lt;a href="http://www.rgoarchitects.com/nblog/ct.ashx?id=b4e1894f-962a-435d-b23b-735a6f867bf4&amp;amp;url=http%3a%2f%2fwww.rgoarchitects.com%2fnblog%2f2008%2f10%2f18%2fEventingInWCF.aspx"&gt;EventBroker&lt;/a&gt; and&#xD;
build a few extensions that interact with them. Here is some of the setup code of&#xD;
the environment:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;testServer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; Tester();&#xD;
service1 &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; ServiceHost(testServer, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; Uri(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt;.Format(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"http://localhost:{0}"&lt;/span&gt;,&#xD;
TestServerPort))); var binding &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; WebHttpBinding&#xD;
{ ReaderQuotas &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; {&#xD;
MaxArrayLength &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; 600000&#xD;
}, MaxReceivedMessageSize &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; 800000,&#xD;
MaxBufferSize &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; 800000&#xD;
}; var ep &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; service1.AddServiceEndpoint(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;typeof&lt;/span&gt;(TestingContract),&#xD;
binding, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt;.Format(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"http://localhost:{0}/S1"&lt;/span&gt;,&#xD;
TestServerPort)); ep.Behaviors.Add(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; WebHttpBehavior()); &lt;font color="#ff0000"&gt; ep.Behaviors.Add(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; InspectorBehavior());&#xD;
service1.Authorization.ServiceAuthorizationManager &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; TestAuthorizer();&lt;/font&gt; var&#xD;
cp &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; service1.AddServiceEndpoint(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;typeof&lt;/span&gt;(ImContract),&#xD;
binding, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt;.Format(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"http://localhost:{0}/Control"&lt;/span&gt;,&#xD;
TestServerPort)); cp.Behaviors.Add(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; WebHttpBehavior());&lt;/span&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The two redlines above are the ones responsible for injecting the POCs the InspectorBehavior&#xD;
is reponsible for inserting the ContractFilter and the MessageInspector and the TestAuthorizer&#xD;
is the Authorization Manager test implementation.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We also need some code to raise an event:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; SendMessage()&#xD;
{ var evnt &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; TestingEvent&#xD;
{ sagaId &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; Guid.NewGuid()&#xD;
}; moqRA.Expect(x =&amp;gt; x.GetChannel&amp;lt;TestingContract&amp;gt;(evnt.sagaId, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;)).Returns(channel1);&#xD;
moqRA.Expect(x =&amp;gt; x.GetChannel&amp;lt;TestingContract2&amp;gt;(evnt.sagaId, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;)).Returns(channel3);&#xD;
eb.BeginNewSagaEvent(evnt.sagaId, evnt); eb.CloseSaga(evnt.sagaId); }&lt;/span&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
And now we can look at the different options. The InspectorBehavior is just a helper&#xD;
class to wite the filter and/or inspector to the endpont. (The Authorization Manager&#xD;
is setup at the service level (i.e. for all endpoints))&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; InspectorBehavior&#xD;
: IEndpointBehavior { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; AddBindingParameters(ServiceEndpoint&#xD;
endpoint, BindingParameterCollection bindingParameters) { } &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; ApplyClientBehavior(ServiceEndpoint&#xD;
endpoint, ClientRuntime clientRuntime) { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;throw&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; NotImplementedException();&#xD;
} &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; ApplyDispatchBehavior(ServiceEndpoint&#xD;
endpoint, EndpointDispatcher endpointDispatcher) { var inspector &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; TestInspector();&#xD;
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); endpointDispatcher.ContractFilter &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; TestFilter(endpointDispatcher.ContractFilter);&#xD;
} &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; Validate(ServiceEndpoint&#xD;
endpoint) { } &lt;/span&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The first thing I tried was the "ContractFilter". It is actually very simple to use.&#xD;
You inherit from MessageFilter and there are two "Match" method you need to override.&#xD;
One that accepts a buffer and one that accepts a (WCF) Message. WCF calls the Match&#xD;
method which accepts a Message.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
WCF's Message class is interesting in the sense that it has a one-time touch&#xD;
feature. i.e. only one piece of code can read/copy it and the next piece of code which&#xD;
will try to do the same will fail &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So the match method you can do something like the following:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;override&lt;/span&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;bool&lt;/span&gt; Match(Message&#xD;
message) { var buffer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; message.CreateBufferedCopy(Int32.MaxValue);&#xD;
message &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; buffer.CreateMessage();&#xD;
var r &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; buffer.CreateMessage().GetReaderAtBodyContents();&#xD;
. . . }&lt;/span&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Which basically means get a buffer of the message, create one copy to preserve and&#xD;
the get another copy for internal use and work with that to parse and verify the actual&#xD;
message. Unfortunetly, this doesn't really work - the message parameter is not passed&#xD;
as ref so the original message is lost on the first line of the method and that's&#xD;
it. Note that you can access the header part of the message without problem, however&#xD;
that's not a good fit for what I am trying to do.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The next thing I looked at the MessageInspector. Again implementing it is rather simple,&#xD;
you just need to implement the IDispatchMessageInspector interface. This interface&#xD;
has two methods BeforeSendReply and AfterReceiveRequest. We'll look at the AfterReceiveRequest&#xD;
method. Again we try the message copy trick:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;ref&lt;/span&gt; Message&#xD;
request, IClientChannel channel, InstanceContext instanceContext) { var buffer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; request.CreateBufferedCopy(Int32.MaxValue);&#xD;
request &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; buffer.CreateMessage();&#xD;
var temp &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; buffer.CreateMessage().GetReaderAtBodyContents();&#xD;
. . . }&lt;/span&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
This time it works since we get the request parameter as ref. At first it seemed to&#xD;
me that while you can inspect and alter the message as your heart wishes there is&#xD;
no way to say that the message is bad. One option is to alter the message to a faulty&#xD;
message and let the application handle it - but that means too much coupling between&#xD;
infrastructure and application. Another, better, option is to throw an exception. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So using the MessageInspector is a usable option. It is very good if you want to alter&#xD;
the incoming message but throwing an exception when the message is bad is not very&#xD;
clean&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Which brings us to our third option Authorization Manager which, surprisingly  turned&#xD;
out to be the best option &#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&#xD;
            &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; TestAuthorizer&#xD;
:ServiceAuthorizationManager { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;override&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;bool&lt;/span&gt; CheckAccess(OperationContext&#xD;
operationContext, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;ref&lt;/span&gt; Message&#xD;
message) { var autorized= &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;base&lt;/span&gt;.CheckAccess(operationContext, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;ref&lt;/span&gt; message);&#xD;
var buffer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; message.CreateBufferedCopy(Int32.MaxValue);&#xD;
message &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; buffer.CreateMessage();&#xD;
var testMessage &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; buffer.CreateMessage();&#xD;
. . . &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;return&lt;/span&gt; autorized;&#xD;
} }&lt;/span&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Like the message inspector it receives the message as ref and like the filter it allows&#xD;
a single yes/no answer to decide if a message should continue or be discarded. Additionally&#xD;
it notifies the client that the message was rejected if that is what you choose to&#xD;
do (in the WebHttpBinding I used that means a 400 bad request return code)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Ok, so we've seen some of the options for implementing the Service Firewall and briefly&#xD;
went over thier different behaviors. The next part in this series will take a look&#xD;
at some of the actual implementation I did&lt;br&gt;&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=39010599-d04b-4303-b560-64df4e06a269"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=qW9d7vgeq4I:rk4k4RtrLLg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=qW9d7vgeq4I:rk4k4RtrLLg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=qW9d7vgeq4I:rk4k4RtrLLg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=qW9d7vgeq4I:rk4k4RtrLLg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?i=qW9d7vgeq4I:rk4k4RtrLLg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=qW9d7vgeq4I:rk4k4RtrLLg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?i=qW9d7vgeq4I:rk4k4RtrLLg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SOAPatterns?a=qW9d7vgeq4I:rk4k4RtrLLg:OeDfYtfaWk4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SOAPatterns?d=OeDfYtfaWk4" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,39010599-d04b-4303-b560-64df4e06a269.aspx</comments>
      <category>.NET</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>WCF</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2009/03/06/ImplementingAWCFServiceFirewallPartIIOfN.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=b4e1894f-962a-435d-b23b-735a6f867bf4</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,b4e1894f-962a-435d-b23b-735a6f867bf4.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,b4e1894f-962a-435d-b23b-735a6f867bf4.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b4e1894f-962a-435d-b23b-735a6f867bf4</wfw:commentRss>
      
      <title>Implementing a WCF service firewall part I of N</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,b4e1894f-962a-435d-b23b-735a6f867bf4.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/jmXE1ywcqEg/ImplementingAWCFServiceFirewallPartIOfN.aspx</link>
      <pubDate>Sun, 22 Feb 2009 23:01:56 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;One of the &lt;a href="http://www.soapatternsbook.com/"&gt;SOA&#xD;
patterns&lt;/a&gt; I already described is the &lt;a href="http://www.infoq.com/articles/service-firewall"&gt;Service&#xD;
Firewall&lt;/a&gt;. The idea behind the service firewall is to have an intermidiator between&#xD;
the actual service and callers and inspect in an applicative level incoming and outgoing&#xD;
messages.&lt;br&gt;&lt;div align="center"&gt;&lt;img style="max-width: 800px;" src="http://www.rgoarchitects.com/nblog/content/binary/servicefw.jpg"&gt;&lt;/img&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&#xD;
Anyway, while I documented the pattern as a security one, I am actually going to implement&#xD;
it for another purpose - a saga filter. &#xD;
&lt;br&gt;&#xD;
In our implementation of &lt;a href="http://www.rgoarchitects.com/nblog/2008/10/18/EventingInWCF.aspx"&gt;EventBroker&lt;/a&gt; I&#xD;
made the design decision to have services expose regular WCF contract. i.e. services&#xD;
can communicate with each other directly and not just via eventing. This design decision&#xD;
is there to allow both interaction with non WCF services and to allow flexibility&#xD;
for multiple message exchange pattern (where events are not the best choice).&lt;br&gt;&#xD;
Another design decision we have is that we have two types of services. Servers and&#xD;
Channels. Servers handle multiple sessions and are (relatively) heavy to write. Channels&#xD;
on the other hand are light-weight services that  are stateful and dedicated&#xD;
for a specific session. Naturally there are a lot of instances of channels to allow&#xD;
supporting multiple sessions (and there are infrastructure bits to allow allocations&#xD;
and propagate liveliness etc. but that's another story). Channels have several benefits&#xD;
like increasing the systems capabilities to cope with failure (if a channel is down&#xD;
only the session it supported fails). One of the benefits of Channels is simple coding&#xD;
model. The Channel is dedicated to a session (typically a saga) and thus it doesn't&#xD;
have to handle all the routing of messages to sagas etc. that Servers have to cope&#xD;
with. This is where the Service Firewall comes to play.&lt;br&gt;&#xD;
In order to keep channels' code simple "someone" has to make sure the channel doesn't&#xD;
get messages that are not related to the saga it is part of. Otherwise the Channel&#xD;
will have to know about its current active saga and filter messages by itself - which&#xD;
kind of misses the point.&lt;br&gt;&#xD;
Making sure other services will not send messages while not in saga etc. will only&#xD;
take us so far (you know -&lt;a href="http://www.rgoarchitects.com/nblog/2009/01/25/LatencyIsConstantNot.aspx"&gt; latencies&lt;/a&gt; and&#xD;
stuff). A service firewall will let us intercept the messages before they reach the&#xD;
service and only allow the messages related to an active saga to pass through (while&#xD;
maintaining the benefits of direct contracts)&lt;br&gt;&lt;br&gt;&#xD;
WCF has a rich extensibility model (see figure f&lt;a href="http://msdn.microsoft.com/en-us/library/ms734665.aspx"&gt;rom&#xD;
MSDN&lt;/a&gt; below). This series will show how you can use some of these extension points&#xD;
to implement a service firewall and achieve the goal depicted above.  I hope&#xD;
you'd find it interesting&lt;br&gt;&lt;img style="max-width: 800px;" src="http://i.msdn.microsoft.com/ms734665.b25778e3-d703-4295-9ac8-7008d9e7f836%28en-us,VS.90%29.gif"&gt;&lt;/img&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=b4e1894f-962a-435d-b23b-735a6f867bf4"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=hoerl8r0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=iR4zJU4K"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=UKO2dkDq"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=oeywTtG3"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=oeywTtG3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=hurthAea"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=hurthAea" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=nHYeMgp3"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,b4e1894f-962a-435d-b23b-735a6f867bf4.aspx</comments>
      <category>.NET</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>WCF</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2009/02/22/ImplementingAWCFServiceFirewallPartIOfN.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=28a3d525-a6a5-47d4-b5b6-204440dcdfd6</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,28a3d525-a6a5-47d4-b5b6-204440dcdfd6.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,28a3d525-a6a5-47d4-b5b6-204440dcdfd6.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=28a3d525-a6a5-47d4-b5b6-204440dcdfd6</wfw:commentRss>
      <slash:comments>6</slash:comments>
      
      <title>Sagas and Workflows</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,28a3d525-a6a5-47d4-b5b6-204440dcdfd6.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/DQtWcfaoe3A/SagasAndWorkflows.aspx</link>
      <pubDate>Fri, 16 Jan 2009 19:08:13 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;In a post called "&lt;a id="viewpost_ascx_TitleUrl" title="Title of this entry." class="TitleLinkStyle" href="http://ayende.com/Blog/archive/2009/01/16/rhino-service-bus-saga-and-state.aspx"&gt;Rhino&#xD;
Service Bus: Saga and State&lt;/a&gt;" &lt;a href="http://ayende.com"&gt;Ayende&lt;/a&gt; said&lt;br&gt;&lt;blockquote&gt;"In a messaging system, a saga orchestrate a set of messages. The main&#xD;
benefit of using a saga is that it allows us to manage the interaction in a stateful&#xD;
manner (easy to think and reason about) while actually working in a distributed and&#xD;
asynchronous environment."&lt;/blockquote&gt;&lt;br&gt;&#xD;
I really don't agree with this definition of a saga. The Saga provides a context for&#xD;
set of messages to allow manging an effort for distributed concensus. It does not&#xD;
"orchestrate" messages (that's what workflows are for) - you can read more on Saga's&#xD;
in an excerpt from my SOA patterns book:  &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf"&gt;Saga&#xD;
pattern&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&#xD;
Here's the comment I left on Ayende's site:&lt;br&gt;&lt;blockquote&gt;"What you describe is nice except it isn't a Saga it is more of a workflow.&#xD;
The notion of Saga which is originated from databases relates to the overall coordination&#xD;
of state between the different services - or the context for the whole business process. &#xD;
&lt;br&gt;&#xD;
In the coffee shop example you use that would be the whole "transaction" from the&#xD;
point the customer orders her coffee until she either gets it or the transaction is&#xD;
canceled (e.g. it took too long and the customer leaves or the coffee shop is out&#xD;
of milk etc.)&lt;br&gt;&#xD;
Unlike database (or distributed) transaction when/if a saga is aborted the different&#xD;
component of the system might not return to their previous state e.g. if the customer&#xD;
complains that the coffee is not good and gets her money back. the milk is not separated&#xD;
back from the coffee beans and returned to the bottle - rather the coffee cup goes&#xD;
to the trash.&lt;br&gt;&lt;br&gt;&#xD;
Workflow is one strategy a service can take to handle the long running interaction&#xD;
within a saga. In your case the BristaSaga class (which I think should be BristaWF)&#xD;
orchestrate the internal state transitions depending on the different messages that&#xD;
arrive within the saga. In your case you have a hardcoded workflow - but it is also&#xD;
possible to use a workflow engine for the job.&lt;br&gt;&lt;br&gt;&#xD;
By the way, in the above example you could also use a statemachine instead of a WF&#xD;
to manage the process "&lt;br&gt;&lt;/blockquote&gt;In another comment Kristofer asked me:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;Arnon: I'm not 100% sure of how you distinguish a Saga from a Workflow,&#xD;
could you elaborate some more on this?&lt;br&gt;&lt;br&gt;&#xD;
A Saga involves a number of underlying workflows?&lt;br&gt;&#xD;
A Saga might as well contain a number of underlying Sagas?&lt;br&gt;&lt;br&gt;&#xD;
Isn't it just a question of at what level it is initiated?&lt;br&gt;&lt;br&gt;&#xD;
If a Saga should represent the whole transaction / business process, then who should&#xD;
handle it? Couldn't it be implemented as a Saga, exactly as Ayende describes it, by&#xD;
the initiating service (in this case the ordering)?, which then also is given the&#xD;
responsibility to handle restoring the total state etc of underlying/involved services&#xD;
if the transaction is aborted? The possibility to restore state does of course depend&#xD;
on what the specific Saga is handling, some processes might not be able to "rollback"&#xD;
completely, it's rather a question of rolling back all involved parties to a known/acceptable&#xD;
state."&lt;br&gt;&lt;br&gt;&lt;/blockquote&gt;The answer is that ,again, Saga is similar to a transaction in the sense&#xD;
that it provides a shared context for an attempt to get a distributed consensus &#xD;
Unlike a transaction which insures ACID properties. Sagas are not.&lt;br&gt;&#xD;
The concept of dissipating that shared context, having each party (service) affect&#xD;
whether the saga should be aborted or successful etc. is what I call a saga.&lt;br&gt;&#xD;
When a saga is aborted the only thing the coordinator can do is pass the status to&#xD;
the participants. Each of the services is responsible to do its best effort to handle&#xD;
the abort (either by rolling back, compensation or whatever)&lt;br&gt;&lt;br&gt;&#xD;
Workflow is another thing altogether. which keeps a context between calls and means&#xD;
externalizing the decisions on the logic flow from the business logic (usually with&#xD;
a workflow engine). You can use workflows within a service (a pattern I call workflodize)&#xD;
or you can use them externally (a pattern I call orchestrated choreography e.g. BPM) &#xD;
&lt;br&gt;&#xD;
You can use either form of workflow to support the implementation of a saga but you&#xD;
can also implement sagas without workflows.&lt;br&gt;&#xD;
In our system we use an "event broker" (see &lt;a rel="nofollow external" href="http://www.rgoarchitects.com/nblog/2008/10/18/EventingInWCF.aspx" title="http://www.rgoarchitects.com/nblog/2008/10/18/EventingInWCF.aspx"&gt;www.rgoarchitects.com/.../EventingInWCF.aspx&lt;/a&gt;)&#xD;
the event broker infrastructure dissipates the saga context when you raise a saga&#xD;
event. A service that initialized a saga (by sending the first event) can choose to&#xD;
close the saga (commit) or abort it. etc. We don't currently have any workflow driven&#xD;
services (but some of them use a state machine as an alternative)&lt;br&gt;&lt;br&gt;&#xD;
(I think the term Saga does not describe Ayende's class since the "barista" is just&#xD;
on of the participants in the saga there are other participants.)&lt;br&gt;&lt;p class="scribefire-powered"&gt;&#xD;
Powered by &lt;a href="http://www.scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=28a3d525-a6a5-47d4-b5b6-204440dcdfd6"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=YdGQBpQZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ix6BUkF5"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ZzaO8iXP"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=mCRClki2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=mCRClki2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=bWXHNCH3"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=bWXHNCH3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=iZFfhsCp"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,28a3d525-a6a5-47d4-b5b6-204440dcdfd6.aspx</comments>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2009/01/16/SagasAndWorkflows.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=4e705feb-dd22-411a-9c70-ac36d9506461</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4e705feb-dd22-411a-9c70-ac36d9506461</wfw:commentRss>
      
      <title>The baker's dozen - my best posts for 2008</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/soOOuwNDUWY/TheBakersDozenMyBestPostsFor2008.aspx</link>
      <pubDate>Sat, 20 Dec 2008 22:10:06 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;The year is almost done so I'd thought&#xD;
it would be a good time for a short retrospective into what I blogged here. The 13 &#xD;
posts below are the ones  I liked best this year. Turns out these posts touch&#xD;
on a lot of different subjects: requirement, software management, agile development,&#xD;
architecture, SOA and programming. &#xD;
&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.rgoarchitects.com/nblog/2008/01/09/UseCasesVsUserStories.aspx"&gt;Use&#xD;
Cases vs. User Stories&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rgoarchitects.com/nblog/2008/02/05/TheLayeredArchitectureStyle.aspx"&gt;The&#xD;
Layered Architecture Style&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rgoarchitects.com/nblog/2008/03/30/StickyNotesVsTheComputer.aspx"&gt;Sticky&#xD;
notes vs. the computer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rgoarchitects.com/nblog/2008/04/15/SleepTightDontLetTheTestBugsBite.aspx"&gt;Sleep&#xD;
tight, don't let the test bugs bite&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/05/18/StatelessServicesTheStateIsOutThere.aspx"&gt;Stateless&#xD;
services - The state is out there&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/06/18/CodeReadabilityDocumentationVsRefactoring.aspx"&gt;Code&#xD;
readability - Documentation vs. Refactoring&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/07/12/SOASecurityReminder.aspx"&gt;SOA&#xD;
security reminder&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/08/17/WhyTheDatabaseAsAServiceIsABadIdea.aspx"&gt;Why&#xD;
the Database as a Service is a bad idea&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/08/31/ThinkHollistically.aspx"&gt;Think&#xD;
Hollistically&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/09/20/ArchitectureItIsAlwaysATradeoff.aspx"&gt;Architecture&#xD;
- It is always a tradeoff&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/10/26/ArchitectSoftSkills.aspx"&gt;Architect&#xD;
Soft Skills&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/11/16/BrokenBuildWhiteNoise.aspx"&gt;Broken&#xD;
build white noise&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/12/16/SOAAntiPatternTheKnot.aspx"&gt;SOA&#xD;
Anti-Pattern : The Knot&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=4e705feb-dd22-411a-9c70-ac36d9506461"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Wr3BEFyQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=WhBYWQLr"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=YcFtf22G"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=30LZxZcO"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=30LZxZcO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=HXeypvYQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=HXeypvYQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=kHLrRjgZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
      <category>TDD</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/12/20/TheBakersDozenMyBestPostsFor2008.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=c992cffa-0531-4774-aac6-9fec5bff782d</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,c992cffa-0531-4774-aac6-9fec5bff782d.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,c992cffa-0531-4774-aac6-9fec5bff782d.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=c992cffa-0531-4774-aac6-9fec5bff782d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>SOA Anti-Pattern : The Knot</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,c992cffa-0531-4774-aac6-9fec5bff782d.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/33W3M4FhYVM/SOAAntiPatternTheKnot.aspx</link>
      <pubDate>Tue, 16 Dec 2008 10:36:11 GMT</pubDate>
      <description>An initial draft for the Knot anti-pattern, As usual any comments are welcomed. You can also download it in &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/TheKnot.pdf"&gt;PDF
form&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;HE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
	{font-family:Times;
	panose-1:2 2 6 3 5 4 5 2 3 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536859921 -1073711039 9 0 511 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times","serif";
	mso-fareast-font-family:Times;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-language:AR-SA;}
p.body, li.body, div.body
	{mso-style-name:"\.body";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-link:"\.body Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:justify;
	text-indent:.25in;
	line-height:14.0pt;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
span.bodyChar
	{mso-style-name:"\.body Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"\.body";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Times;
	mso-fareast-font-family:Times;
	mso-hansi-font-family:Times;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:Arial;
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;p class="body"&gt;
&lt;span style=""&gt;Everything starts oh so well. Embarking on a new SOA initiative the
whole team feels as if it is pure green field development. We venture on - The first
service is designed. Hey look it got all these bells and whistles; we are even using
XML so it must be good. Then we design the second service, it turns out the first
service has to talk to the second – and vice versa. Then comes a third, it has to
talk to the other two. The forth service only talks to a couple of the previous ones.
The twelfth talks to nine of the others and the fourteenth has to contact them all
– yep our services are tangling up together into an inflexible, rigid knot&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
The above scenario might sound to you like a wacky and improbable scenario - why would
anyone in the right mind do something like that?&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Let’s
take another look, with a concrete example this time and see how the road to hell
is paved with good intentions. In Figure 10.1 below we see a vanilla ordering scenario.
An ordering service sends the order details to a stock service, where the items are
identified in the stock, marked for delivery and then sent to a delivery service which
talks to external shipping companies such as DHL, FedEx etc. 
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;img src="http://www.rgoarchitects.com/images/fig1.png" height="84" width="843"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;HE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:Times;
	panose-1:2 2 6 3 5 4 5 2 3 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536859921 -1073711039 9 0 511 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times","serif";
	mso-fareast-font-family:Times;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-language:AR-SA;}
p.body, li.body, div.body
	{mso-style-name:"\.body";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-link:"\.body Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:justify;
	text-indent:.25in;
	line-height:14.0pt;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.figure, li.figure, div.figure
	{mso-style-name:"\.figure";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:10.0pt;
	mso-pagination:none;
	mso-outline-level:1;
	font-size:8.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
span.bodyChar
	{mso-style-name:"\.body Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"\.body";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Times;
	mso-fareast-font-family:Times;
	mso-hansi-font-family:Times;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:Arial;
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;p class="figure"&gt;
Figure 10.1 a vanilla ordering scenario. An ordering service sends the order to a
stock service, which provisions the goods to a delivery service which is responsible
to send the products to the customer
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
If we think about it more we’ll see that when an item is missing from the stock we
probably have to talk to external suppliers, order the missing items and wait for
their arrival- so the whole process is not immediate. Furthermore since the process
takes time, it seems viable to cancel the process if an order is cancelled.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It
seems we have two options (see Figure 10.2) either the ordering service will ask the
two other services to cancel processing related to the order or the two services call
the ordering service before they decide what to do next.&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Naturally
the system wouldn’t stop here, we would want to introduce more services and more connections
e.g. an Accounts Payable service&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;that interacts with the
external suppliers, the stock service and the delivery&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;service(since
we also need to pay shipping companies) etc.&lt;span style=""&gt;&amp;nbsp; 
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;br&gt;
&lt;span style=""&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;img src="http://www.rgoarchitects.com/images/fig2.png" height="515" width="802"&gt;
&lt;br&gt;
&lt;span style=""&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;HE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:Times;
	panose-1:2 2 6 3 5 4 5 2 3 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536859921 -1073711039 9 0 511 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times","serif";
	mso-fareast-font-family:Times;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-language:AR-SA;}
h5
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 5 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.7in;
	text-indent:-.7in;
	mso-pagination:widow-orphan;
	mso-outline-level:5;
	mso-list:l0 level5 lfo1;
	tab-stops:list .7in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:normal;}
h6
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 6 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.8in;
	text-indent:-.8in;
	mso-pagination:widow-orphan;
	mso-outline-level:6;
	mso-list:l0 level6 lfo1;
	tab-stops:list .8in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 7 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.9in;
	text-indent:-.9in;
	mso-pagination:widow-orphan;
	mso-outline-level:7;
	mso-list:l0 level7 lfo1;
	tab-stops:list .9in;
	font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 8 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:1.0in;
	text-indent:-1.0in;
	mso-pagination:widow-orphan;
	mso-outline-level:8;
	mso-list:l0 level8 lfo1;
	tab-stops:list 1.0in;
	font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 9 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:1.1in;
	text-indent:-1.1in;
	mso-pagination:widow-orphan;
	mso-outline-level:9;
	mso-list:l0 level9 lfo1;
	tab-stops:list 1.1in;
	font-size:9.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading5Char
	{mso-style-name:"Heading 5 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 5";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
span.Heading6Char
	{mso-style-name:"Heading 6 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 6";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading7Char
	{mso-style-name:"Heading 7 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 7";
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;}
span.Heading8Char
	{mso-style-name:"Heading 8 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 8";
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading9Char
	{mso-style-name:"Heading 9 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 9";
	mso-ansi-font-size:9.0pt;
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.head1, li.head1, div.head1
	{mso-style-name:"\.head 1";
	mso-style-update:auto;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-next:Normal;
	margin-top:20.0pt;
	margin-right:0in;
	margin-bottom:12.0pt;
	margin-left:.4in;
	text-indent:-.4in;
	line-height:20.0pt;
	mso-line-height-rule:exactly;
	mso-pagination:none;
	page-break-after:avoid;
	mso-list:l0 level2 lfo1;
	tab-stops:list .4in;
	font-size:20.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.body, li.body, div.body
	{mso-style-name:"\.body";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-link:"\.body Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:justify;
	text-indent:.25in;
	line-height:14.0pt;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.head2, li.head2, div.head2
	{mso-style-name:"\.head 2";
	mso-style-update:auto;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"\.head 1";
	mso-style-next:Normal;
	margin-top:7.0pt;
	margin-right:0in;
	margin-bottom:7.0pt;
	margin-left:.5in;
	text-indent:-.5in;
	line-height:16.0pt;
	mso-line-height-rule:exactly;
	mso-pagination:none;
	page-break-after:avoid;
	mso-list:l0 level3 lfo1;
	tab-stops:list .5in;
	font-size:18.0pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.figure, li.figure, div.figure
	{mso-style-name:"\.figure";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:10.0pt;
	mso-pagination:none;
	mso-outline-level:1;
	font-size:8.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
p.Pattern, li.Pattern, div.Pattern
	{mso-style-name:"\.Pattern";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"\.body";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	text-align:justify;
	line-height:14.0pt;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;}
span.bodyChar
	{mso-style-name:"\.body Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"\.body";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Times;
	mso-fareast-font-family:Times;
	mso-hansi-font-family:Times;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:1059550132;
	mso-list-template-ids:-389639282;}
@list l0:level1
	{mso-level-text:"Chapter %1";
	mso-level-tab-stop:.3in;
	mso-level-number-position:left;
	margin-left:.3in;
	text-indent:-.3in;}
@list l0:level2
	{mso-level-style-link:"\.head 1";
	mso-level-text:"%1\.%2";
	mso-level-tab-stop:177.3pt;
	mso-level-number-position:left;
	margin-left:177.3pt;
	text-indent:-.4in;}
@list l0:level3
	{mso-level-style-link:"\.head 2";
	mso-level-text:"%1\.%2\.%3";
	mso-level-tab-stop:.5in;
	mso-level-number-position:left;
	margin-left:.5in;
	text-indent:-.5in;}
@list l0:level4
	{mso-level-text:"%1\.%2\.%3\.%4";
	mso-level-tab-stop:.6in;
	mso-level-number-position:left;
	margin-left:.6in;
	text-indent:-.6in;}
@list l0:level5
	{mso-level-style-link:"Heading 5";
	mso-level-text:"%1\.%2\.%3\.%4\.%5";
	mso-level-tab-stop:.7in;
	mso-level-number-position:left;
	margin-left:.7in;
	text-indent:-.7in;}
@list l0:level6
	{mso-level-style-link:"Heading 6";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6";
	mso-level-tab-stop:.8in;
	mso-level-number-position:left;
	margin-left:.8in;
	text-indent:-.8in;}
@list l0:level7
	{mso-level-style-link:"Heading 7";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7";
	mso-level-tab-stop:.9in;
	mso-level-number-position:left;
	margin-left:.9in;
	text-indent:-.9in;}
@list l0:level8
	{mso-level-style-link:"Heading 8";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8";
	mso-level-tab-stop:1.0in;
	mso-level-number-position:left;
	margin-left:1.0in;
	text-indent:-1.0in;}
@list l0:level9
	{mso-level-style-link:"Heading 9";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9";
	mso-level-tab-stop:1.1in;
	mso-level-number-position:left;
	margin-left:1.1in;
	text-indent:-1.1in;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times","serif";
	mso-bidi-font-family:"Times New Roman";}
&lt;/style&gt;
&lt;![endif]--&gt;
&gt;
&lt;p class="figure"&gt;
Figure 10.2 a little more realistic version of the Ordering scenario from figure 10.1.
Now we also need to handle missing items in the stock, cancelled orders and paying
external suppliers. In this scenario the services get to be more coupled. For instance
the Ordering service is now aware of the delivery service and not just the stock service.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
With each new service we draw more lines going from service to service, and with each
new service we update the services’ business logic with the new business rules as
well as knowledge of the other services’ contracts.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="head2"&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;1.1.1&lt;/span&gt;
&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;/span&gt; &lt;a name="_Toc216346978"&gt;Consequences&lt;/a&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
Well, so we get more lines going from service to service that normal isn’t it? After
all if the services won’t talk to each other they won’t be very useful? Isn’t that
the whole point of SOA?
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
Well, yes – and no. Yes it is normal for services to connect to each other.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;After
all, creating a system in an SOA is connecting services together.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;As
for the “no” part, the problem lies with the way we develop these integrations&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
you are not careful it is easy to&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;get all the integration
lines in a big, ugly mess – a knot 
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="Pattern"&gt;
A knot is an Anti-pattern where the services are tightly coupled by hardcoded point-to-point
integration and context specific interfaces 
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
For instance, what happens when we want to reuse the ordering service mentioned above?
No problem, we just call it from the new context. Alas, the knot prevents us from
reusing it without hauling in the rest of the baggage - all the other services we
defined above (the stock, delivery etc.) if the new context is not identical in it
ordering processes and matches what we already have we can’t use it. Or we can’t use
it without adding one-off interfaces where we add specific messages for the new context
and all sort of “if” statements to distinguish between the old and the new behavior.
Another option is to make this distinction in the original messages, which either
not possible or forces us to make sure the other services are still functioning. In
any event it is a big mess.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
Let’s recap. We moved to SOA to get flexibility, increase reuse/use within our systems,
prevent spaghetti point to point integration – what we see here is not flexible, hard
to maintain and basically it seems like we are back in square one and we invested
gazillions of dollars to get there.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="head2"&gt;
&lt;a name="_Toc216346979"&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;1.1.2&lt;/span&gt;
&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Causes&lt;/a&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
How did that happen?&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;How can a wonderful, open standards,
distributed, flexible SOA deteriorate to an unmanageable knot? 
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
It is tempting to dismiss the knot as the result of lack of adequate planning. If
we only planned everything in advance we wouldn’t be in this mess now. Well, besides
the point that trying to plan everything ahead of time is an anti-pattern in itself
(an organizational anti-pattern – which isn’t in the scope of this book). There’s
still a good chance you’d get to a Knot anyway since the problems are inherent in
the way business work.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
If we take a look back at the Integration Spaghetti scenario discussed in chapter
1 (depicted as figure 10.3 below), we can see that the phenomena was there as well,
when we our business processes evolve we find we need to interact with information
from other parts of the system. The flow of a business process expands to supply that
needed information or service and thus the Knot grows.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;img src="http://www.rgoarchitects.com/images/fig3.png" height="567" width="807"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;HE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:Times;
	panose-1:2 2 6 3 5 4 5 2 3 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536859921 -1073711039 9 0 511 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times","serif";
	mso-fareast-font-family:Times;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-language:AR-SA;}
h5
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 5 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.7in;
	text-indent:-.7in;
	mso-pagination:widow-orphan;
	mso-outline-level:5;
	mso-list:l0 level5 lfo1;
	tab-stops:list .7in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:normal;}
h6
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 6 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.8in;
	text-indent:-.8in;
	mso-pagination:widow-orphan;
	mso-outline-level:6;
	mso-list:l0 level6 lfo1;
	tab-stops:list .8in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 7 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.9in;
	text-indent:-.9in;
	mso-pagination:widow-orphan;
	mso-outline-level:7;
	mso-list:l0 level7 lfo1;
	tab-stops:list .9in;
	font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 8 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:1.0in;
	text-indent:-1.0in;
	mso-pagination:widow-orphan;
	mso-outline-level:8;
	mso-list:l0 level8 lfo1;
	tab-stops:list 1.0in;
	font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 9 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:1.1in;
	text-indent:-1.1in;
	mso-pagination:widow-orphan;
	mso-outline-level:9;
	mso-list:l0 level9 lfo1;
	tab-stops:list 1.1in;
	font-size:9.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading5Char
	{mso-style-name:"Heading 5 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 5";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
span.Heading6Char
	{mso-style-name:"Heading 6 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 6";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading7Char
	{mso-style-name:"Heading 7 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 7";
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;}
span.Heading8Char
	{mso-style-name:"Heading 8 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 8";
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading9Char
	{mso-style-name:"Heading 9 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 9";
	mso-ansi-font-size:9.0pt;
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.head1, li.head1, div.head1
	{mso-style-name:"\.head 1";
	mso-style-update:auto;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-next:Normal;
	margin-top:20.0pt;
	margin-right:0in;
	margin-bottom:12.0pt;
	margin-left:.4in;
	text-indent:-.4in;
	line-height:20.0pt;
	mso-line-height-rule:exactly;
	mso-pagination:none;
	page-break-after:avoid;
	mso-list:l0 level2 lfo1;
	tab-stops:list .4in;
	font-size:20.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.body, li.body, div.body
	{mso-style-name:"\.body";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-link:"\.body Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:justify;
	text-indent:.25in;
	line-height:14.0pt;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.head2, li.head2, div.head2
	{mso-style-name:"\.head 2";
	mso-style-update:auto;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"\.head 1";
	mso-style-next:Normal;
	margin-top:7.0pt;
	margin-right:0in;
	margin-bottom:7.0pt;
	margin-left:.5in;
	text-indent:-.5in;
	line-height:16.0pt;
	mso-line-height-rule:exactly;
	mso-pagination:none;
	page-break-after:avoid;
	mso-list:l0 level3 lfo1;
	tab-stops:list .5in;
	font-size:18.0pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.figure, li.figure, div.figure
	{mso-style-name:"\.figure";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:10.0pt;
	mso-pagination:none;
	mso-outline-level:1;
	font-size:8.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
span.bodyChar
	{mso-style-name:"\.body Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"\.body";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Times;
	mso-fareast-font-family:Times;
	mso-hansi-font-family:Times;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:1059550132;
	mso-list-template-ids:-389639282;}
@list l0:level1
	{mso-level-text:"Chapter %1";
	mso-level-tab-stop:.3in;
	mso-level-number-position:left;
	margin-left:.3in;
	text-indent:-.3in;}
@list l0:level2
	{mso-level-style-link:"\.head 1";
	mso-level-text:"%1\.%2";
	mso-level-tab-stop:177.3pt;
	mso-level-number-position:left;
	margin-left:177.3pt;
	text-indent:-.4in;}
@list l0:level3
	{mso-level-style-link:"\.head 2";
	mso-level-text:"%1\.%2\.%3";
	mso-level-tab-stop:.5in;
	mso-level-number-position:left;
	margin-left:.5in;
	text-indent:-.5in;}
@list l0:level4
	{mso-level-text:"%1\.%2\.%3\.%4";
	mso-level-tab-stop:.6in;
	mso-level-number-position:left;
	margin-left:.6in;
	text-indent:-.6in;}
@list l0:level5
	{mso-level-style-link:"Heading 5";
	mso-level-text:"%1\.%2\.%3\.%4\.%5";
	mso-level-tab-stop:.7in;
	mso-level-number-position:left;
	margin-left:.7in;
	text-indent:-.7in;}
@list l0:level6
	{mso-level-style-link:"Heading 6";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6";
	mso-level-tab-stop:.8in;
	mso-level-number-position:left;
	margin-left:.8in;
	text-indent:-.8in;}
@list l0:level7
	{mso-level-style-link:"Heading 7";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7";
	mso-level-tab-stop:.9in;
	mso-level-number-position:left;
	margin-left:.9in;
	text-indent:-.9in;}
@list l0:level8
	{mso-level-style-link:"Heading 8";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8";
	mso-level-tab-stop:1.0in;
	mso-level-number-position:left;
	margin-left:1.0in;
	text-indent:-1.0in;}
@list l0:level9
	{mso-level-style-link:"Heading 9";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9";
	mso-level-tab-stop:1.1in;
	mso-level-number-position:left;
	margin-left:1.1in;
	text-indent:-1.1in;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times","serif";
	mso-bidi-font-family:"Times New Roman";}
&lt;/style&gt;
&lt;![endif]--&gt;
&gt;
&lt;p class="figure"&gt;
Figure 10.3 the Knot anti-pattern is similar in both effect and origin to the spaghetti
integration in non-SOA environments
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
From the technical perspective, we have two forces working here. One is the granularity
of the services. On the one hand, Services are sized so that a business process requires
several of them to work together. On the other hand they aren’t small enough so that
they would be an end-node in the process (i.e. only other services would call the
service and it will just return a result). Note that this isn’t a bad thing in itself,
after all if each process was implemented by a single service we’d have silos not
unlike the ones we try to escape by using SOA and if we set the services too small
we’d fall into another trap (see the Nanoservices anti-pattern later in this chapter).&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The
bottom line is that while the granularity is a force that drives us toward the Knot,
there’s not a lot we can do about it without getting ourselves into worse problems.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
The second, stronger, force that pushes a system into a Knot is the business process
itself.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Since, as we mentioned above, the process flows
through the services, the services needs to be aware of the flow and then call other
services to complete the flow.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;In order for a service
to call another service it has to know about its contract and know about its endpoint.
When another business flow goes through that service we not only add the new contracts
and endpoints but also the contextual knowledge of which other services to call depending
on the process. And that’s my friends, is exactly the thing that gets us into trouble
– the services start to tie themselves to each other more and more, as we implement
more business process and more flows.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
Hey, you say, but SOA should have solved all that, surely there is something we can
do about it – or is there?
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="head2"&gt;
&lt;a name="_Toc216346980"&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;1.1.1&lt;/span&gt;
&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Refactoring&lt;/a&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
The previous section explains that most of the problem is caused by having the services’
code determine where to go next and what to do with the results of the services’ processing.
If there was only a way to somehow pry these decisions away from the services’ greedy
hands…&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;As you’d probably guessed there is such away, in
fact there are several such ways and this book lists three of them: The Workflodize
pattern (Chapter 2), Orchestrated Choreography (Chapter 7) and Inversion of Communications
(Chapter 5). Let’s take a brief look at each of these patterns and see how they help.
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
The workflodize pattern suggests adding a workflow engine inside the service to handle
both Sagas (i.e. long running operations, see chapter 5) and added flexibility. The
“added flexibility” is the card we want to play here. When we express the connections
as steps in the workflow they are not part of our services’ business logic. They are
also easier to change in a configuration-like manner both of these points are big
plusses.
&lt;/p&gt;
&lt;p class="body"&gt;
Still, a better way to solve the service to service integration problem is to use
an external orchestration engine. The idea of using the Orchestrated&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Choreography
pattern is to enable Business Process Management- or a way for the organization to
control and verify it processes are carried out as intended (you need an orchestration
engine for that but it helps…). In the context of solving or avoiding the Knot anti-pattern,
Orchestrated Choreography is better than Workflodize since it centralizes and externalizes
all the interactions between services and thus effectively removing all the problematic
code from the services themselves. Note that there’s a fine line between externalizing
flow and externalizing the logic itself (see discussion in Orchestrated Choreography
pattern, in chapter 7).
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
The third pattern we can use to refactor the Knot is Inversion of Communications.
Inversion of Communications means modeling the interactions between services as events
rather than calls. Inversion of communications is, in my opinion, the strongest countermeasure
to the knot. The two patterns mentioned above bring a lot of flexibility in routing
the messages between the services. The inversion of communications pattern also helps
the message designers remove specific contexts from the messages since when the service’s
status is raised as an event it isn’t addressed to any other service in particular.
Note that using inversion of communications doesn’t negate using&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;either
of the two other patterns mentioned above since that once the event is raised we still
need to route it to other services and using a workflow engine is a good option for
that. Another implementation option is to use an infrastructure that supports publish/subscribe
(see the pattern’s description in chapter 5 for more details.)
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
Going back to the ordering scenario we mentioned above. As I mentioned, the services
grow with needless knowledge of specific business process. So for instance, the ordering
service had to know both about the stock service and the delivery one. Refactored
with the Inversion of Communications pattern, the same Ordering service doesn’t have
to know about any of the other services. In Figure 10.4 we can now see that the Ordering
service sends two business events (new order, cancelled order) and the routing of
these messages is no longer the responsibility of the service
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body" align="left"&gt;
&lt;img src="http://www.rgoarchitects.com/images/fig4.png" height="229" width="194"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;link rel="File-List" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;
&lt;link rel="themeData" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;
&lt;link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CArnon.DC1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;HE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:Times;
	panose-1:2 2 6 3 5 4 5 2 3 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-536859921 -1073711039 9 0 511 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times","serif";
	mso-fareast-font-family:Times;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-language:AR-SA;}
h5
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 5 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.7in;
	text-indent:-.7in;
	mso-pagination:widow-orphan;
	mso-outline-level:5;
	mso-list:l0 level5 lfo1;
	tab-stops:list .7in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:normal;}
h6
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 6 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.8in;
	text-indent:-.8in;
	mso-pagination:widow-orphan;
	mso-outline-level:6;
	mso-list:l0 level6 lfo1;
	tab-stops:list .8in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 7 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:.9in;
	text-indent:-.9in;
	mso-pagination:widow-orphan;
	mso-outline-level:7;
	mso-list:l0 level7 lfo1;
	tab-stops:list .9in;
	font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 8 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:1.0in;
	text-indent:-1.0in;
	mso-pagination:widow-orphan;
	mso-outline-level:8;
	mso-list:l0 level8 lfo1;
	tab-stops:list 1.0in;
	font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"Heading 9 Char";
	mso-style-next:Normal;
	margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:3.0pt;
	margin-left:1.1in;
	text-indent:-1.1in;
	mso-pagination:widow-orphan;
	mso-outline-level:9;
	mso-list:l0 level9 lfo1;
	tab-stops:list 1.1in;
	font-size:9.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading5Char
	{mso-style-name:"Heading 5 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 5";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
span.Heading6Char
	{mso-style-name:"Heading 6 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 6";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading7Char
	{mso-style-name:"Heading 7 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 7";
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;}
span.Heading8Char
	{mso-style-name:"Heading 8 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 8";
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
span.Heading9Char
	{mso-style-name:"Heading 9 Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 9";
	mso-ansi-font-size:9.0pt;
	font-family:"Arial","sans-serif";
	mso-ascii-font-family:Arial;
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:Arial;
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.head1, li.head1, div.head1
	{mso-style-name:"\.head 1";
	mso-style-update:auto;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-next:Normal;
	margin-top:20.0pt;
	margin-right:0in;
	margin-bottom:12.0pt;
	margin-left:.4in;
	text-indent:-.4in;
	line-height:20.0pt;
	mso-line-height-rule:exactly;
	mso-pagination:none;
	page-break-after:avoid;
	mso-list:l0 level2 lfo1;
	tab-stops:list .4in;
	font-size:20.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.body, li.body, div.body
	{mso-style-name:"\.body";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-style-link:"\.body Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:justify;
	text-indent:.25in;
	line-height:14.0pt;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:11.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
p.head2, li.head2, div.head2
	{mso-style-name:"\.head 2";
	mso-style-update:auto;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"\.head 1";
	mso-style-next:Normal;
	margin-top:7.0pt;
	margin-right:0in;
	margin-bottom:7.0pt;
	margin-left:.5in;
	text-indent:-.5in;
	line-height:16.0pt;
	mso-line-height-rule:exactly;
	mso-pagination:none;
	page-break-after:avoid;
	mso-list:l0 level3 lfo1;
	tab-stops:list .5in;
	font-size:18.0pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-style:italic;
	mso-bidi-font-style:normal;}
p.figure, li.figure, div.figure
	{mso-style-name:"\.figure";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin:0in;
	margin-bottom:.0001pt;
	line-height:10.0pt;
	mso-pagination:none;
	mso-outline-level:1;
	font-size:8.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:"Arial","sans-serif";
	mso-fareast-font-family:"Times New Roman";
	mso-bidi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;
	font-weight:bold;
	mso-bidi-font-weight:normal;}
p.CALLOUT, li.CALLOUT, div.CALLOUT
	{mso-style-name:"\.CALLOUT";
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-link:"\.CALLOUT Char";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:1.0in;
	margin-bottom:.0001pt;
	text-align:justify;
	line-height:13.95pt;
	mso-line-height-rule:exactly;
	mso-pagination:widow-orphan;
	tab-stops:.25in;
	font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
span.CALLOUTChar
	{mso-style-name:"\.CALLOUT Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"\.CALLOUT";
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
span.bodyChar
	{mso-style-name:"\.body Char";
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"\.body";
	mso-ansi-font-size:11.0pt;
	font-family:"Times New Roman","serif";
	mso-ascii-font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-hansi-font-family:"Times New Roman";
	color:black;
	mso-bidi-language:AR-SA;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	mso-ascii-font-family:Times;
	mso-fareast-font-family:Times;
	mso-hansi-font-family:Times;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:1059550132;
	mso-list-template-ids:-389639282;}
@list l0:level1
	{mso-level-text:"Chapter %1";
	mso-level-tab-stop:.3in;
	mso-level-number-position:left;
	margin-left:.3in;
	text-indent:-.3in;}
@list l0:level2
	{mso-level-style-link:"\.head 1";
	mso-level-text:"%1\.%2";
	mso-level-tab-stop:177.3pt;
	mso-level-number-position:left;
	margin-left:177.3pt;
	text-indent:-.4in;}
@list l0:level3
	{mso-level-style-link:"\.head 2";
	mso-level-text:"%1\.%2\.%3";
	mso-level-tab-stop:.5in;
	mso-level-number-position:left;
	margin-left:.5in;
	text-indent:-.5in;}
@list l0:level4
	{mso-level-text:"%1\.%2\.%3\.%4";
	mso-level-tab-stop:.6in;
	mso-level-number-position:left;
	margin-left:.6in;
	text-indent:-.6in;}
@list l0:level5
	{mso-level-style-link:"Heading 5";
	mso-level-text:"%1\.%2\.%3\.%4\.%5";
	mso-level-tab-stop:.7in;
	mso-level-number-position:left;
	margin-left:.7in;
	text-indent:-.7in;}
@list l0:level6
	{mso-level-style-link:"Heading 6";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6";
	mso-level-tab-stop:.8in;
	mso-level-number-position:left;
	margin-left:.8in;
	text-indent:-.8in;}
@list l0:level7
	{mso-level-style-link:"Heading 7";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7";
	mso-level-tab-stop:.9in;
	mso-level-number-position:left;
	margin-left:.9in;
	text-indent:-.9in;}
@list l0:level8
	{mso-level-style-link:"Heading 8";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8";
	mso-level-tab-stop:1.0in;
	mso-level-number-position:left;
	margin-left:1.0in;
	text-indent:-1.0in;}
@list l0:level9
	{mso-level-style-link:"Heading 9";
	mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9";
	mso-level-tab-stop:1.1in;
	mso-level-number-position:left;
	margin-left:1.1in;
	text-indent:-1.1in;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times","serif";
	mso-bidi-font-family:"Times New Roman";}
&lt;/style&gt;
&lt;![endif]--&gt;
&gt;
&lt;p class="figure"&gt;
Figure 10.4 the Ordering service using the Inversion of Communications pattern. Now
the service doesn’t know/depend on other services directly. It is only aware of the
business events of new order and cancelled order which are relevant to the business
function that the service handled
&lt;/p&gt;
&lt;p class="figure"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;a name="_Toc216346981"&gt;Refactorings aside, one question we still need to think about
is whether there are any circumstances where having a Knot is acceptable.&lt;/a&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;span style=""&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class="head2"&gt;
&lt;span style=""&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;1.1.1&lt;/span&gt;
&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Known Exceptions&lt;/span&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
In a sense the Knot is a distributed version of an anti-pattern described by Brian
Foote and Joseph Yoder as “Big Ball of Mud” – spaghetti code where different types
of the system tied to each other in unmanageable ways. The reason for mentioning the
connection is that the reason that “Big Ball of Mud” might be considered a pattern
rather than an anti-pattern also apply here:
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
“[when] you need to deliver quality software on time on budget… focus first of feature
and functionality, then focus on architecture and performance”
&lt;/p&gt;
&lt;p class="CALLOUT"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
Starting out on a large project, such as moving an enterprise to SOA, is difficult
enough as it is. You can’t figure everything in advance; you need to deliver something
– so as Nike says “just do it”. Get something done. You do need to be prepared to
let go and redesign further down the road. In the current system I’m working on –
a visual recognition/search engine for mobile, we went with a “knot” approach for
the first release. The simplicity of the implementation, i.e. less investment in infrastructure,
ad hoc integration etc. enabled us to deliver a first working version in less than
6 months. These 6 months also helped us understand the domain we are operating in
much better and more importantly get to market with the feature the business needed
in the schedule the business wanted. We spent the next 6 month rewriting the system
in a proper way, including applying the Inversion of Communications pattern mentioned
above. 
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
To sum this up, coding the integration code into services is likely to end as a Knot.
It is acceptable to go down this path for a prototype or first version i.e. to show
quick results. However you do need to plan/make the time to refactor the solution
so you will not get stuck down the road.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p class="body"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=c992cffa-0531-4774-aac6-9fec5bff782d" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=xue0mqLX"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=NnwEMmbP"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=pI94O8Kk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=mIxsqHPd"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=mIxsqHPd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=kJ9EL5aL"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=kJ9EL5aL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=MtpOuSRY"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,c992cffa-0531-4774-aac6-9fec5bff782d.aspx</comments>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/12/16/SOAAntiPatternTheKnot.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=e1d8186d-171d-45f9-a144-639cfa98b69f</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,e1d8186d-171d-45f9-a144-639cfa98b69f.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,e1d8186d-171d-45f9-a144-639cfa98b69f.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e1d8186d-171d-45f9-a144-639cfa98b69f</wfw:commentRss>
      <slash:comments>6</slash:comments>
      
      <title>Describing Anti-Patterns</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,e1d8186d-171d-45f9-a144-639cfa98b69f.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/ytR2Rsdb00Q/DescribingAntiPatterns.aspx</link>
      <pubDate>Mon, 08 Dec 2008 22:56:12 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;I am (finally) writing some new stuff for&#xD;
my &lt;a href="http://www.soapatternsbook.com"&gt;SOA book&lt;/a&gt; - working on a few Anti-patterns&lt;br&gt;&lt;ul&gt;&lt;li&gt;&#xD;
The Knot - The distributed version of "&lt;a href="http://www.laputan.org/mud/"&gt;big ball&#xD;
of mud&lt;/a&gt;" basically point to point integration&lt;/li&gt;&lt;li&gt;&lt;span class="entry-content"&gt;NanoServices - designing/building fine grained services&#xD;
(methods != services)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="entry-content"&gt;3-tiered SOA - dressing up 3-tier architecture in SOA&#xD;
clothing (e.g.&lt;a href="http://www.rgoarchitects.com/nblog/2008/08/17/WhyTheDatabaseAsAServiceIsABadIdea.aspx"&gt; database&#xD;
as a service&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="entry-content"&gt;Whitebox Services - exposing internal structure - comes&#xD;
in two flavors exposing technology and allowing access not through contracts&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="entry-content"&gt;Transactional Integration - &lt;a href="http://www.rgoarchitects.com/nblog/2007/07/13/SOAAndCrossServiceTransactions.aspx"&gt;inter-service&#xD;
transactions&lt;/a&gt; (use &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf"&gt;Sagas &lt;/a&gt;instead)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="entry-content"&gt;RESToid- combing SOA and &lt;a href="http://www.rgoarchitects.com/Files/REST.ppt"&gt;REST &lt;/a&gt;without&#xD;
understanding the full implication of either&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
I am going to publish one of them (probably the "knot") in a few days but I thought&#xD;
I might be able to get a little feedback before that. I chose to describe anti-patterns&#xD;
in the following format:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;&#xD;
 Context - Presenting the problem (probably through an example)&lt;/li&gt;&lt;li&gt;&#xD;
 Consequences - Explaining what the problem is. i.e. what happens when the anti-pattern&#xD;
is prevalent&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
 Causes - discussion on the forces that lead to the anti-pattern&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
 Refactoring - The patterns (and/or other tips) that can be used to fix the design&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
 Known Exceptions - Are there any contexts where using the anti-pattern is acceptable &#xD;
&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
I'd be happy to hear any comment you have on the anti-patterns listed above as well&#xD;
as comments on the structure for describing them&lt;br&gt;&lt;br&gt;&#xD;
Thanks&lt;br&gt;&#xD;
Arnon&lt;br&gt;&lt;br&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=e1d8186d-171d-45f9-a144-639cfa98b69f"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=tCv9Z0iB"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=TlDZBzVM"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=kQSsINsv"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=hGnwysQR"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=hGnwysQR" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=jvxPNpob"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=jvxPNpob" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=5JRiYGVL"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,e1d8186d-171d-45f9-a144-639cfa98b69f.aspx</comments>
      <category>REST</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/12/08/DescribingAntiPatterns.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=654102d4-ca6a-43b1-bd72-5e237bb3f622</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,654102d4-ca6a-43b1-bd72-5e237bb3f622.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,654102d4-ca6a-43b1-bd72-5e237bb3f622.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=654102d4-ca6a-43b1-bd72-5e237bb3f622</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Eventing in WCF</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,654102d4-ca6a-43b1-bd72-5e237bb3f622.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/RghKXnnf-Jg/EventingInWCF.aspx</link>
      <pubDate>Sat, 18 Oct 2008 21:58:25 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;As I mentioned in a couple of previous&#xD;
posts (like "&lt;a href="2008/08/21/UsingRESTAlongOtherArchitectureStyles.aspx"&gt;Using&#xD;
REST along with other architectural &lt;/a&gt;), I've been spending the last few weeks writing&#xD;
an Event system over WCF (probably also explains posts on  WCF gotchas&lt;a href="2008/09/28/AnotherWCFGotchaCallingAnotherServiceresourceWithinACall.aspx"&gt; like&#xD;
this&lt;/a&gt;;) ). Being a communication infrastructure it is still a long way from being&#xD;
completed, but it seems to be stabilizing and I think it turned out nicely so I thought&#xD;
I'd share a few details.&lt;br&gt;&lt;br&gt;&#xD;
Let's start with the simple part - the usage.&lt;br&gt;&#xD;
The eventing is built on the idea of a bus (i.e. no centralized components) and the&#xD;
resources/services that want to use eventing have to use a library which I call EventBroker. &#xD;
There are two modes for using the EventBroker. one is "regular" events which are contexless.&#xD;
This means that consecutive events can reach different services, and there is no context&#xD;
that flows from event to event:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;bool&lt;/span&gt; raisedEvent &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; eb.RaiseEvent&amp;lt;SampleEvent&amp;gt;(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; SampleEvent());&lt;/span&gt;&lt;/pre&gt;&#xD;
The second type of events are &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf"&gt;Sagas,&lt;/a&gt; which&#xD;
represent long running interactions. Sagas does have a "best effort" guarantee to&#xD;
reach the same recipients over consecutive calls. Also you can also End sagas (sucessful&#xD;
termination), Force End Saga (successful termination by a service that didn't initiate&#xD;
the saga) and Abot Saga (unsuccessful termination): Here is how you raise a saga event.&lt;br&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;var&#xD;
evnt &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; SampleEvent&#xD;
{ data &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; somevalue};&lt;br&gt;&#xD;
var SagaId &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Guid.NewGuid();&lt;br&gt;&#xD;
eb.RaiseSagaEvent&amp;lt;SampleEvent&amp;gt;(SagaId, evnt);&lt;/span&gt;&lt;/pre&gt;&#xD;
if you use the same Saga Id, the events are handled as part of the same saga, if you&#xD;
use a Saga Id that wasn't previously defined it will initialize a new saga.&lt;br&gt;&#xD;
The eventbroker translates events to the relevant contract and dispatches the events&#xD;
over to the different subscribers. Which brings us to to the next part which I &#xD;
guess,   is also a little more interesting. How subscriptions are defined.&lt;br&gt;&lt;br&gt;&#xD;
The first thing to do is to define the event itself. &#xD;
&lt;br&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;class&lt;/span&gt; SampleClassEvent&#xD;
:ImEvent&lt;br&gt;&#xD;
{&lt;br&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt; DataMember1&#xD;
{set;get;}&lt;br&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; DataMember2&#xD;
{ set; get;}&lt;br&gt;&#xD;
}&lt;/span&gt;&lt;/pre&gt;&#xD;
There aren't any real constraints on the event, except that it has to "implement"&#xD;
the ImEvent interface. Which is really an empty interface but it marks the event as&#xD;
one for the event broker.&lt;br&gt;&#xD;
Then you have to define an interface for handling the event. The event broker, builds&#xD;
on the idea of convention rather than configuration (an idea popularized by the rails&#xD;
framework) so it is easier to generate the interface (something I do with a resharper&#xD;
template)&lt;br&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt; [ServiceContract]&lt;br&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;interface&lt;/span&gt; IHandleSampleClass&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
[OperationContract]&lt;br&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; SampleClass(SampleClassEvent&#xD;
eventOccured);&lt;br&gt;&lt;br&gt;&#xD;
}&lt;/span&gt;&lt;/pre&gt;&#xD;
The convention is that the interface will have a IHandle prefix followed by the name&#xD;
of the event. It will hold a single operation named like the event (without the Event&#xD;
suffix) and will recieve a single parameter which is the event data. Currently &#xD;
events do return a value (int) but I am thinking about changing it to void and have&#xD;
everything marked as OneWay for added performance&lt;br&gt;&lt;br&gt;&#xD;
Now, when we create a service which needs to handle events it will do that by specifing&#xD;
which events it handles. E.g. &#xD;
&lt;br&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt; [ServiceContract]&lt;br&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;interface&lt;/span&gt; ImSampelResource&#xD;
: ImContract, IHandleSampleClass, IHandleSomeOtherThing&lt;br&gt;&#xD;
 {&lt;br&gt;&#xD;
}&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
So each contract declares all its subscriptions (by a list of IHandleXXX). It should&#xD;
also include the ImContract interface which holds all the service operation used by&#xD;
the eventbroker (e.g. ending sagas etc.). &#xD;
&lt;br&gt;&#xD;
Services that want to raise events should inherit from a ControlEdge class (base class &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/EdgeComponent.pdf"&gt;Edge&#xD;
component&lt;/a&gt; that delegates control events to the event broker)&lt;br&gt;&lt;br&gt;&#xD;
There's still the question of how does the event broker knows where to find other&#xD;
services. There are several ways this can be done (e.g. a service repository) but&#xD;
since we have  blogjecting watchdogs in place anyway, we use them to propagate&#xD;
liveliness (and location ) of services.&lt;br&gt;&lt;br&gt;&#xD;
This sums up this post. It is basically just a little context for several planned&#xD;
posts where I hope to talk about some of the challenges, alternatives and design decisions&#xD;
that led me to the current design. Meanwhile, I'd also be happy to hear any comments,&#xD;
ideas or reactions you may have&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=654102d4-ca6a-43b1-bd72-5e237bb3f622"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Zv20SaC1"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=M4lg9IBN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ZUIrdzrW"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Mc37CyqX"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=Mc37CyqX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=rj9VELv0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=rj9VELv0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=TVKdiXQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,654102d4-ca6a-43b1-bd72-5e237bb3f622.aspx</comments>
      <category>.NET</category>
      <category>Design</category>
      <category>OO</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
      <category>WCF</category>
      <category>xsights</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/10/18/EventingInWCF.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=5852ab2d-55c1-4c19-b961-ff7babbc2e0f</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5852ab2d-55c1-4c19-b961-ff7babbc2e0f</wfw:commentRss>
      
      <title>Evolving Architectures - Architecture Retrospective</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/44pR3D0lDJs/EvolvingArchitecturesArchitectureRetrospective.aspx</link>
      <pubDate>Tue, 12 Aug 2008 21:40:21 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Retrospectives, every "agile" team does&#xD;
retrospectives.What are retrospectives anyway?&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;A retrospective is a meeting where the team takes a look and inspect the&#xD;
past, in order to adapt and improve the future.&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;&#xD;
Agile or not, our team does a retrospective at the end of each iteration (every two&#xD;
weeks in our case). We try to look at what worked, what didn't , how we are meeting&#xD;
our goals etc, how is the product going etc.. These meetings provide a lot of value&#xD;
for steering us at the right direction. &#xD;
&lt;br&gt;&#xD;
On going retrospectives that look at the near past allows for suppleness and change&#xD;
adaptation and they are very powerful at that - However it is sometimes worthwhile&#xD;
to reflect over longer periods of time.&lt;br&gt;&lt;br&gt;&#xD;
One area where longer perspective is important is the architecture of the project. &lt;a href="http://www.rgoarchitects.com/nblog/2007/05/13/EvolvingArchitectures.aspx"&gt;Evolving&#xD;
an architecture&lt;/a&gt; you run the risk of accepting wrong decisions - mostly because&#xD;
architectural decisions have long term implications, while YAGNI, time constraints&#xD;
and life in general drive you toward short term gains.&lt;br&gt;&lt;br&gt;&#xD;
Again, taking an example from my current project, working towards &lt;a href="http://www.xsights.com/"&gt;the&#xD;
first release&lt;/a&gt;, we took a few major decisions during the development e.g.&lt;br&gt;&lt;ul&gt;&lt;li&gt;&#xD;
federated resource management - Taking into consideration the &lt;a href="http://www.rgoarchitects.com/Files/fallacies.pdf"&gt;fallacies&#xD;
of distributed computing&lt;/a&gt; we decided that we'd have local resource managers that&#xD;
will take care of resource utilization and allocation. The resource managers will&#xD;
have a hierarchy where they'd communicate with each other to gain the "bigger picture"&lt;/li&gt;&lt;li&gt;&#xD;
Introduce Parallel Pipelines - handle image understanding by dividing the work between&#xD;
specialized components. &#xD;
&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
RESTful control channel - to use a "lingua franca" between all component types so&#xD;
that we can easily integrate across platforms and languages&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
local failure handling - resources and components handle failure by themselves&lt;/li&gt;&lt;li&gt;&#xD;
Communication technology (WCF in our case) is isolated from the business logic by&#xD;
an Edge Component&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
etc.&lt;/li&gt;&lt;/ul&gt;&#xD;
Once we finished delivering the first release. We took a few "days off" to consider&#xD;
what we've done thus far. updated our quality attribute list per our knowledge working&#xD;
with the system and looking at some customer scenarios. studies the things we liked/didn't&#xD;
like in the design and architecture of the working system. and revised a few of our&#xD;
decisions for instance&lt;br&gt;&lt;ul&gt;&lt;li&gt;&#xD;
We found that rushing to a working system we introduced some excess coupling to a&#xD;
specific technological solution (for video rendering). We initiated a few proof of&#xD;
concepts and found out how to both isolate the technology from the rest of the system&#xD;
as well as allow more technology choices.&lt;/li&gt;&lt;li&gt;&#xD;
We found that the some of the data flows were not as clean as we thought they'd be&#xD;
- adding new features caused more resource interactions than we thought when we partitioned&#xD;
the resources. We redefined some of the resource roles to get less message clutter&#xD;
(and higher cohesion)&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
The federated resource management works well, but introduce needless latency in session&#xD;
initiation. We now opted for introduce "Active services" which are more autonomous.&lt;/li&gt;&lt;li&gt;&#xD;
Add a blogjecting Watchdog in addition to local failure handling to both increase&#xD;
the chances of failure identification and recovery as well as get a better picture&#xD;
in a centralized Service Monitor.&lt;/li&gt;&lt;li&gt;&#xD;
RESTful control channel worked well and will continue for later release&lt;/li&gt;&lt;li&gt;&#xD;
Some of the scale issues will be handled by introducing "Virtual Endpoints" while&#xD;
some would continue to use autonoumous endpoint creation and liveliness dissemination&#xD;
(hopefully learning from &lt;a href="http://status.aws.amazon.com/s3-20080720.html"&gt;the&#xD;
mistakes of others&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&#xD;
etc.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
The result of these and the other decisions we've maid is a rework plan that will&#xD;
(hopefully anyway) make our overall solution better.&lt;br&gt;&#xD;
What we see is that we evolved our architecture as we went forward. While all the&#xD;
the decisions we made seemed right at the time we took them, only through reviewing&#xD;
them in a wider perspective (architecture retrospective) we identified the decisions&#xD;
that we need to change and the ones that we have to enhance. The insight you gain&#xD;
after working on a project for awhile are much better than the initial thoughts you&#xD;
have or the understanding you master in the initial interations. &#xD;
&lt;br&gt;&#xD;
I think it is essential to review the architecture once you've gained more experience&#xD;
with the realities of the system you write (vs. the precieved realities you have on&#xD;
the get go)&lt;br&gt;&lt;br&gt;&#xD;
By the way if you work with a waterfall approach your situation is worse. Since in&#xD;
this case you take your decisions before you write any code so, you don't even have&#xD;
the benefit of POCs, and working code to enhance your insights&lt;br&gt;&lt;br&gt;&lt;br&gt;&#xD;
PS&lt;br&gt;&#xD;
if you have the MEAP version of &lt;a href="http://www.rgoarchitects.com/SOAPatterns/"&gt;SOA&#xD;
Patterns&lt;/a&gt; you can read more on the patterns I've mentioned here: Active service&#xD;
in chapter 2, blogjecting watchdog in chapter3, Service Monitor in chapter 4, Parallel&#xD;
Pipelines in chapter 3, Edge Component in chapter 2&lt;br&gt;&lt;br&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=5852ab2d-55c1-4c19-b961-ff7babbc2e0f"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=eWIo3ZLd"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=LRTSqw6v"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=JN43I60N"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=D3TRNMwm"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=D3TRNMwm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=8mCAQold"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=8mCAQold" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=08Z5yyj9"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
      <category>REST</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/08/12/EvolvingArchitecturesArchitectureRetrospective.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=d20255f3-0209-4ed8-8892-668c2a23018b</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,d20255f3-0209-4ed8-8892-668c2a23018b.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,d20255f3-0209-4ed8-8892-668c2a23018b.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d20255f3-0209-4ed8-8892-668c2a23018b</wfw:commentRss>
      
      <title>SOA Patterns chapter 2 for free download</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,d20255f3-0209-4ed8-8892-668c2a23018b.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/y9k0eaGD4QI/SOAPatternsChapter2ForFreeDownload.aspx</link>
      <pubDate>Tue, 29 Jul 2008 07:59:26 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;a href="http://www.dzone.com/links/index.html"&gt;DZone&lt;/a&gt; recently&#xD;
published an interview with me on my  &lt;a href="http://www.soapatternsbook.com"&gt;SOA&#xD;
Pattterns book&lt;/a&gt;. Along &lt;a href="http://java.dzone.com/articles/interview-with-arnon-rotem-gal"&gt;with&#xD;
the interview&lt;/a&gt; you can also download chapter 2 of the book (I think you need to&#xD;
be a DZone member to actually download it). &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
Chapter 2 includes  the &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/EdgeComponent.pdf"&gt;Edge&#xD;
Component&lt;/a&gt; , Service Host , Active Service , Transactional Service and the Workflodize&#xD;
patterns. Additional downloads related to the book include&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.manning.com/rotem/rotem_meapch1.pdf"&gt;Chapter 1&lt;/a&gt; which you can&#xD;
downlaod directly from &lt;a href="http://www.manning.com/"&gt;Manning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&#xD;
The &lt;a href="http://www.infoq.com/articles/service-firewall"&gt;Service Firewall Pattern&lt;/a&gt; which&#xD;
I published on InfoQ&lt;/li&gt;&lt;li&gt;&#xD;
The &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf"&gt;Saga Pattern&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&#xD;
The &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/GridableService.pdf"&gt;Gridable&#xD;
Service&lt;/a&gt; Pattern&lt;/li&gt;&lt;/ul&gt;&#xD;
Lastly, you can ownload the &lt;a href="http://www.rgoarchitects.com/files/archsoa.pdf"&gt;first&#xD;
version of chapter 1&lt;/a&gt;, which I mention in the interview and the &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns.pdf"&gt;slides&#xD;
of a presentation on few of the patterns&lt;/a&gt; from Dr. Dobb's Architecture and Design&#xD;
World last year&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=d20255f3-0209-4ed8-8892-668c2a23018b"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=DXlrUqhx"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=WK0jWAvf"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=i3CodIlD"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=g21ZXlVs"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=g21ZXlVs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ctvBG3C0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=ctvBG3C0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=AcQbXu3H"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,d20255f3-0209-4ed8-8892-668c2a23018b.aspx</comments>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/07/29/SOAPatternsChapter2ForFreeDownload.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=608024a7-eb47-4a20-9620-fd18dad51e11</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,608024a7-eb47-4a20-9620-fd18dad51e11.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,608024a7-eb47-4a20-9620-fd18dad51e11.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=608024a7-eb47-4a20-9620-fd18dad51e11</wfw:commentRss>
      
      <title>SOA Patterns can save you time, money</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,608024a7-eb47-4a20-9620-fd18dad51e11.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/9sIr80JiehQ/SOAPatternsCanSaveYouTimeMoney.aspx</link>
      <pubDate>Mon, 05 May 2008 18:59:27 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;IT Business Edge &lt;a href="http://www.itbusinessedge.com/item/?ci=39799"&gt;published&#xD;
a short Q&amp;amp;A with me on SOA patterns&lt;/a&gt; - you may want to check it out :)&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=608024a7-eb47-4a20-9620-fd18dad51e11"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=gZNjVt6G"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=rVcH0E5F"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=2zKdsgJD"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=5smqzoNx"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=5smqzoNx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=VvXEmOzM"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=VvXEmOzM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=pG40eCfs"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,608024a7-eb47-4a20-9620-fd18dad51e11.aspx</comments>
      <category>SOA</category>
      <category>SOA Patterns</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/05/05/SOAPatternsCanSaveYouTimeMoney.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=5e701a82-8497-43ee-b7f9-d3cb1491c147</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,5e701a82-8497-43ee-b7f9-d3cb1491c147.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,5e701a82-8497-43ee-b7f9-d3cb1491c147.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5e701a82-8497-43ee-b7f9-d3cb1491c147</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>SOA - Between philosophy and concrete answers</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,5e701a82-8497-43ee-b7f9-d3cb1491c147.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/PA2O59KbImQ/SOABetweenPhilosophyAndConcreteAnswers.aspx</link>
      <pubDate>Fri, 11 Apr 2008 19:34:26 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Someone calling himself r r left the following&#xD;
comment on &lt;a href="2008/03/22/DefiningSOAPartIVPipesAndFilters.aspx"&gt;part IV&lt;/a&gt; of&#xD;
my &lt;a href="2007/11/24/DefiningSOAPartI.aspx"&gt;series &lt;/a&gt;of posts on SOA definition:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;"I keep trying to read this series on SOA unfortunately suffers from the&#xD;
same disease as the rest of literature on the subject. stays general to a comfortable&#xD;
level so it can't really be applied anywhere, tends to complicate things where is&#xD;
not clear if it's needed, and encourages philosophical debate on what ultimately is&#xD;
a business (and so concrete) requirement. Meanwhile the serious (IMO) issues stay&#xD;
untouched - how does one actually approach an integration project with functionality,&#xD;
performance and security in mind. Which should be the standards used (considering&#xD;
the tens of standards on WS out there). How granular should the WS be (I'm done with&#xD;
answers like "not too much, but enough", or "well, depends on your project"). "&lt;br&gt;&lt;/blockquote&gt;Before I talk a little about the "serious issues" mentioned above - I&#xD;
want to point out that the point of this series of post, as stated in the first post&#xD;
is to take a formal / semi-academic look at SOA. I started these posts as a reaction&#xD;
to a comment that Pete Lacey &lt;a href="2007/10/05/WhatIsThatSOAThingyAgain.aspx"&gt;left&#xD;
on my blog&lt;/a&gt; stating that my view of SOA (as published in "&lt;a href="../Files/SOADefined.pdf"&gt;What&#xD;
is SOA anyway?&lt;/a&gt;") does not demonstrate that SOA is an  architectural style.&#xD;
I don't pretense that this is some fully thought out academic dissertation or anything&#xD;
but I do try to look at the architectural roots of SOA.&lt;br&gt;&lt;br&gt;&#xD;
That said let's take a look at the more interesting parts of this comment. First,&#xD;
the thing that bothers me about this reaction is (what seems to me as) the quest for&#xD;
final and concrete recipes. For instance consider the comment on service granularity &#xD;
&lt;br&gt;&lt;blockquote&gt;"How granular should the WS be (I'm done with answers like "not too much,&#xD;
but enough", or "well, depends on your project"")&lt;br&gt;&lt;/blockquote&gt;The problems is - it does depend! and if you forgive me taking another&#xD;
philosophical detour, if you try to provide a hard definition for a service granularity&#xD;
you get  something like the &lt;a href="http://en.wikipedia.org/wiki/Sorites_paradox"&gt;heap&#xD;
paradox&lt;/a&gt; - When you remove individual grains  from a heap of sand is it still&#xD;
a heap when one grain remains. So while it is obvious that hiding a complete system&#xD;
as a single service is wrong and that exposing every little object as a service is&#xD;
wrong (even though for some inexplicable reason &lt;a href="http://udidahan.weblogs.us/2007/12/29/wcf-everywhere-not-on-my-watch/"&gt;Juval&#xD;
lowy seems to thing that the latter is good practice&lt;/a&gt;) it isn't really obvious&#xD;
when you get too granular.&lt;br&gt;&lt;br&gt;&#xD;
Nevertheless it is not a pure guess either. You can use some guidelines and measure&#xD;
them against your specific project/system/enterprise needs. Personally The set of&#xD;
guidelines I use is based on the &lt;a href="../Files/fallacies.pdf"&gt;fallacies of distributed&#xD;
computing&lt;/a&gt; :&lt;br&gt;&lt;ol&gt;&lt;li&gt;&#xD;
 The network is reliable&lt;/li&gt;&lt;li&gt;&#xD;
 Latency is zero&lt;/li&gt;&lt;li&gt;&#xD;
 Bandwidth is infinite&lt;/li&gt;&lt;li&gt;&#xD;
 The network is secure&lt;/li&gt;&lt;li&gt;&#xD;
 Topology doesn't change&lt;/li&gt;&lt;li&gt;&#xD;
 There is one administrator&lt;/li&gt;&lt;li&gt;&#xD;
 Transport cost is zero&lt;/li&gt;&lt;li&gt;&#xD;
 The network is homogeneous&lt;/li&gt;&lt;/ol&gt;&#xD;
Since a service edge is boundary which may (usually is ) be accessed remotely you&#xD;
need to think about the incoming and outgoing interactions of the service within the&#xD;
fallacies stated above. if the proper behavior of the service depends on one of the&#xD;
above there's probably something wrong.&lt;br&gt;&lt;br&gt;&#xD;
Regarding the other questions (how do you approach a real system), well, if you pardon&#xD;
me for banging my own drum, that's exactly why I started to write my experience on&#xD;
these matters as patterns. for instance if we look at the &lt;a href="../Files/SOAPatterns/Saga.pdf"&gt;saga &lt;/a&gt;pattern&#xD;
(one of the patters I published online). you'd see that it is talking about achieving&#xD;
distributed consensus in a transaction-like manner. I talk about the problems of using&#xD;
distributed transaction etc., offer an architectural solution (the saga ) and then&#xD;
discuss relevant technology issues (e.g. WS-BusinessActivity ) as well as its implication&#xD;
from quality attributes perspectives (Integrity and reliability). Nevertheless even&#xD;
these patterns aren't an end-all solution. different circumstances require different&#xD;
solutions&lt;br&gt;&#xD;
Both my previous job and my current one involves building a scalable solution on-top&#xD;
of algorithmic engines. In my previous job I  managed the construction of a biometric&#xD;
solution that allows using multiple biometrics. In my current job I manage the development&#xD;
of  a mobile visual search solution . Again, while on the surface both needs&#xD;
to get some data, run a few  algorithms and produce an answer. These systems&#xD;
have very different quality attributes. On the first system we had to handle very&#xD;
large databases, hundreds of queries, an emphasis on modifiability and security, the&#xD;
current one needs millions of queries, almost no database, low latencies and emphasis&#xD;
on usability.  These differences result in radically different solutions, with&#xD;
different services, different interactions , use of different patterns etc. There's&#xD;
no "one right answer" (tm) &#xD;
&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=5e701a82-8497-43ee-b7f9-d3cb1491c147"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=vJtAWXt4"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ekVxAE8p"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=1AbL9pZj"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=PpHC4kaN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=PpHC4kaN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=WkeCMy4O"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=WkeCMy4O" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=6jVynpWy"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,5e701a82-8497-43ee-b7f9-d3cb1491c147.aspx</comments>
      <category>PaperLnx</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/04/11/SOABetweenPhilosophyAndConcreteAnswers.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=6cef66c2-23cf-4fc6-b9b4-3c401cac94a4</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,6cef66c2-23cf-4fc6-b9b4-3c401cac94a4.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,6cef66c2-23cf-4fc6-b9b4-3c401cac94a4.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6cef66c2-23cf-4fc6-b9b4-3c401cac94a4</wfw:commentRss>
      
      <title>Defining SOA - Part IV - Pipes and Filters</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,6cef66c2-23cf-4fc6-b9b4-3c401cac94a4.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/bs2q9G30i20/DefiningSOAPartIVPipesAndFilters.aspx</link>
      <pubDate>Sat, 22 Mar 2008 20:38:00 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;This post is part of &lt;a href="2007/11/24/DefiningSOAPartI.aspx"&gt;a&#xD;
series of posts&lt;/a&gt; trying to define SOA as an architectural style. In the previous&#xD;
post I talked about &lt;a href="2008/01/26/DefiningSOAPartIIILayeredSystem.aspx"&gt;SOA&#xD;
and the Layered architecture style&lt;/a&gt; (which generated a couple of follow-ups - one&#xD;
on l&lt;a href="2008/02/05/TheLayeredArchitectureStyle.aspx"&gt;ayered architecture in general&lt;/a&gt;,&#xD;
one on &lt;a href="2008/02/23/LayersAndSOA.aspx"&gt;its importance for SOA &lt;/a&gt;and on on &lt;a href="2008/03/06/LayersTiersTidbit.aspx"&gt;layers&#xD;
in enterprise architecture vs. solution architecture&lt;/a&gt;)&lt;br&gt;&lt;br&gt;&#xD;
The next architectural style SOA builds on is Pipes and Filters, Unlike Layers and&#xD;
Client/server which I described in previous installments, Pipes and Filter is not&#xD;
also a base style for REST. This basically, this style is where SOA and REST begin&#xD;
to diverge.&lt;br&gt;&#xD;
The pipes and filters architectural style defines two types of components - yep you've&#xD;
guessed it, Pipes and Filters.&lt;br&gt;&lt;blockquote&gt;&lt;div align="left"&gt;Filters -  are independent processing steps they are constrained&#xD;
to be autonomous of each other and not share state, control thread etc. &#xD;
&lt;br&gt;&#xD;
Pipes - are interconnecting channels&lt;br&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div align="left"&gt;&lt;br&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.rgoarchitects.com/nblog/content/binary/pipesfilters.jpg" border="0"&gt;&lt;/img&gt;&lt;br&gt;&#xD;
Each filter exposes a relatively simple interface where it can receive  messages&#xD;
on an inbound pipe, process tthem and produce  messages on outbound pipes. The&#xD;
idea behind this is to allow easy composability thus allowing greater usage (also&#xD;
known as "reuse" - I'll discuss the difference in another post). Systems are composed&#xD;
of several filters working together, filters can be replaced with newer version (provided&#xD;
they keep the same interface) etc.&lt;br&gt;&#xD;
On the downside the overall latency is increased , since to accomplish a task you&#xD;
have to move from filter to filter.&lt;br&gt;&lt;br&gt;&#xD;
The pipes and filters style brings to SOA things like the autonomy of services, the&#xD;
sense of explicit boundaries. For instance, this is the basis for why you wouldn't&#xD;
want to do distributed transactions across service boundaries, &lt;a href="2007/07/13/SOAAndCrossServiceTransactions.aspx"&gt;which&#xD;
I blogged about several times before.&lt;/a&gt;&lt;br&gt;&lt;br&gt;&#xD;
The pipes part of the "pipes and filters" also means that the wiring can be taken&#xD;
care of outside of the services themselves and that you can control them externally,&#xD;
this works well with ithe use of middleware (service bus). Additionally Fielding (you&#xD;
know, the REST guy) &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/net_arch_styles.htm#sec_3_2"&gt;also&#xD;
mentions that &lt;/a&gt;&lt;br&gt;&lt;blockquote&gt;"One aspect of PF styles that is rarely mentioned is that there is an&#xD;
implied "invisible hand" that arranges the configuration of filters in order to establish&#xD;
the overall application. A network of filters is typically arranged just prior to&#xD;
each activation, allowing the application to specify the configuration of filter components&#xD;
based on the task at hand and the nature of the data streams (configurability). This&#xD;
controller function is considered a separate operational phase of the system, and&#xD;
hence a separate architecture, even though one cannot exist without the other."&lt;br&gt;&lt;/blockquote&gt; Which is the harbinger of the orchestration/choreography aspects of&#xD;
SOA.&lt;br&gt;&lt;br&gt;&#xD;
So as you see, pipes and filters is one of the important pilars of SOA, in the next&#xD;
part (unless I'll have to clarify things about this post) I'll talk about the last&#xD;
architectural style SOA builds upon "Distributed Agents".&lt;br&gt;&lt;br&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=6cef66c2-23cf-4fc6-b9b4-3c401cac94a4"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=1XhPUUxz"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=k5yzM8LH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=TfyTvuV2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=cxO9c9vT"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=cxO9c9vT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=AspGsmQN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=AspGsmQN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=IrXiqofx"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,6cef66c2-23cf-4fc6-b9b4-3c401cac94a4.aspx</comments>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/03/22/DefiningSOAPartIVPipesAndFilters.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=fc91ebdb-8ffe-4c85-8187-01873ee66b92</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,fc91ebdb-8ffe-4c85-8187-01873ee66b92.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,fc91ebdb-8ffe-4c85-8187-01873ee66b92.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=fc91ebdb-8ffe-4c85-8187-01873ee66b92</wfw:commentRss>
      
      <title>SOA Patterns Book  – Status Update</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,fc91ebdb-8ffe-4c85-8187-01873ee66b92.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/K8OfouQnlN8/SOAPatternsBookStatusUpdate.aspx</link>
      <pubDate>Tue, 04 Mar 2008 22:40:09 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Great news. Two of my friends and fellow &lt;a href="http://www.dobbscodetalk.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=103&amp;amp;Itemid=85"&gt;DDJ&#xD;
bloggers&lt;/a&gt;, &lt;a href="http://www.ericbruno.com/"&gt;Eric Bruno&lt;/a&gt; and &lt;a href="http://udidahan.weblogs.us/"&gt;Udi&#xD;
Dahan&lt;/a&gt; have agreed to join my (now ours) &lt;a href="http://www.soapatternsbook.com/"&gt;SOA&#xD;
Patterns book&lt;/a&gt; which will be &lt;a href="http://www.manning.com/rotem/"&gt;published&#xD;
by Manning&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&#xD;
Both Udi and Eric are competent and experienced architects who have experience designing&#xD;
SOAs . On the technology side -  Udi (“The software simplest”) specializes in&#xD;
.NET development e.g. his &lt;a href="http://www.nservicebus.com/"&gt;nServiceBus&lt;/a&gt; framework&#xD;
– which is a very good example for an endpoint-ware ServiceBus (vs. middleware ServiceBuses&#xD;
which is what most ESBs do).And  Eric, on the other hand, is a Java and C++ expert&#xD;
. Eric is the author of &lt;a href="http://www.amazon.com/dp/1584504188"&gt;Java Messaging&lt;/a&gt; (one&#xD;
of the best books on JMS and web services ) and has also has a lot of experience in&#xD;
Financial systems. Together, the three of us bring a lot of real-life experience of&#xD;
building large and complicated system into this project.&lt;br&gt;&lt;br&gt;&#xD;
The current game plan is for Eric to focus on the SOA pitfalls (“anti-patterns”) part&#xD;
of the book, Udi to provide a “putting-it-all-together” chapter , and for me to cover&#xD;
what’s left. I am sure however, that their experience and insight will also help make&#xD;
the other parts of the book (even? ) better.&lt;br&gt;&lt;br&gt;&#xD;
If you are not familiar with the book - you may want to take a look &lt;a href="http://www.manning.com/rotem/rotem_meapch1.pdf"&gt;at&#xD;
the first chapter&lt;/a&gt; and/or some of the published patterns like &lt;a href="../Files/SOAPatterns/Saga.pdf"&gt;Saga&lt;/a&gt;, &lt;a href="http://www.infoq.com/articles/service-firewall"&gt;Service&#xD;
Firewall&lt;/a&gt;, &lt;a href="../Files/SOAPatterns/GridableService.pdf"&gt;Gridable Service&lt;/a&gt;, &lt;a href="../Files/SOAPatterns/EdgeComponent.pdf"&gt;Edge&#xD;
Component&lt;/a&gt; and (a very early draft of) &lt;a href="2006/04/17/SOAPatternsAggregatedReporting.aspx"&gt;Aggregated&#xD;
Reporting&lt;/a&gt; pattern . Also you can take a look at the slides from my &lt;a href="../Files/SOAPatterns.pdf"&gt;"SOA&#xD;
Patterns" presentation&lt;/a&gt; at Dr. Dobb's Architecture &amp;amp; Design world last year,&#xD;
which illustrates some additional patterns&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=fc91ebdb-8ffe-4c85-8187-01873ee66b92"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=fs1PBY6A"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=4HlZMKJ2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=vdvtgxoW"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=etI1qL7Z"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=etI1qL7Z" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=RFKtS6W6"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=RFKtS6W6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=tueoF300"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,fc91ebdb-8ffe-4c85-8187-01873ee66b92.aspx</comments>
      <category>.NET</category>
      <category>Java</category>
      <category>new</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/03/04/SOAPatternsBookStatusUpdate.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=467e864b-d177-4104-ac07-ad0973167d57</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,467e864b-d177-4104-ac07-ad0973167d57.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,467e864b-d177-4104-ac07-ad0973167d57.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=467e864b-d177-4104-ac07-ad0973167d57</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Defining SOA - Part III - Layered System</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,467e864b-d177-4104-ac07-ad0973167d57.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/1Sfecs0Hsco/DefiningSOAPartIIILayeredSystem.aspx</link>
      <pubDate>Sat, 26 Jan 2008 22:49:15 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;This post is part of &lt;a href="2007/11/24/DefiningSOAPartI.aspx"&gt;a&#xD;
series of posts&lt;/a&gt; trying to define SOA as an architectural style. In the previous&#xD;
post I talked about how &lt;a href="2007/12/22/DefiningSOAPartIIClientServer.aspx"&gt;SOA&#xD;
builds on the Client/Server architectural style.&lt;/a&gt; In this post I'll talk about&#xD;
how SOA builds on the architectural style of Layered System.&lt;br&gt;&lt;br&gt;&#xD;
Layered System or Layered architectural style is one of the most basic and widely&#xD;
used architectural styles. Here is a definition of Layered architecture &lt;a href="2005/10/25/ModelingArchitecturalStyles.aspx"&gt;I&#xD;
posted in the past&lt;/a&gt;&lt;br&gt;&lt;blockquote&gt;The layered style is composed of layers (the components) which provides&#xD;
facilities and has a specific roles. The layers have communication paths / dependencies&#xD;
(the connectors).&lt;br&gt;&lt;br&gt;&#xD;
In a layered style a layer has some limitations on how it can communicate with other&#xD;
layers (the constraints). Typically a layered is allowed to call only the layer below&#xD;
it and be called only by the layer above it (but there are variants e.g. a layer can&#xD;
call to any layer below it;  etc. - all is fine as long as the layers communication&#xD;
paths are limited and restricted by some rules)&lt;/blockquote&gt;SOA takes the strict layers&#xD;
definition and restricts the knowledge of one service only to the service interface/contract&#xD;
of the other services. This means the services cannot be aware or care about the internal&#xD;
structure of other services. Services don't mind the internal structure of other services.&#xD;
This helps with introducing the  "boundaries are explicit" tenet  (although,&#xD;
it build on more than just layering)&lt;br&gt;&lt;br&gt;&#xD;
The layered nature of SOA means you can also add additional layers between the services.&#xD;
One very common example is adding a servicebus (e.g. using an ESB or tools like NServiceBus)&#xD;
other examples can include load balancers, firewalls (see&lt;a href="chrome://performancing/content/www.infoq.com/articles/service-firewall"&gt; Service&#xD;
Firewall pattern&lt;/a&gt;) etc. Naturally, When you add intermediary layers  services&#xD;
don't talk to each other directly rather accept the services (such routing , message&#xD;
persistence etc.)  from the intermediary layer.&lt;br&gt;&lt;br&gt;&#xD;
It should be noted, that in the context of SOA the layers are, in most cases, actually&#xD;
tiers. The difference is that tiers provide (potential) physical separation where&#xD;
as layers provide logical separation . When a layer is actually a tier it has extensive&#xD;
implication on the level of trust between the tiers (see my post "&lt;a href="chrome://performancing/content/www.rgoarchitects.com/nblog/2006/08/21/TierIsANaturalBoundary.aspx"&gt;Tier&#xD;
is a natural boundary"&lt;/a&gt; for more details)&lt;br&gt;&lt;br&gt;&#xD;
The next post in the series will talk about the "Pipe and Filters" style  and&#xD;
SOA. This is the first place where the REST architectural style and SOA diverge.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=467e864b-d177-4104-ac07-ad0973167d57"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ndq3qrip"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ncjKEtDu"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=pK2LGmoH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=0UYpeoEN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=0UYpeoEN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=cOt3suVH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=cOt3suVH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=zgIBe0gw"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,467e864b-d177-4104-ac07-ad0973167d57.aspx</comments>
      <category>REST</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/01/26/DefiningSOAPartIIILayeredSystem.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=742bf4dc-b92e-442d-9b3c-fbe66c17d7d6</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,742bf4dc-b92e-442d-9b3c-fbe66c17d7d6.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,742bf4dc-b92e-442d-9b3c-fbe66c17d7d6.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=742bf4dc-b92e-442d-9b3c-fbe66c17d7d6</wfw:commentRss>
      
      <title>SOA definition and the Enterprise SOA</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,742bf4dc-b92e-442d-9b3c-fbe66c17d7d6.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/XMD2jHaLJLM/SOADefinitionAndTheEnterpriseSOA.aspx</link>
      <pubDate>Mon, 07 Jan 2008 21:33:20 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Sam Gentile and myself exchanged a &lt;a href="http://www.rgoarchitects.com/nblog/2007/11/24/DefiningSOAPartI.aspx"&gt;few&lt;/a&gt;&lt;a href="http://samgentile.com/blogs/samgentile/archive/2007/12/27/soa-is-about-business.aspx"&gt;blog&lt;/a&gt;&lt;a href="http://rgoarchitects.com/nblog/2007/12/29/soaisnotaboutbusiness.aspx"&gt;posts &lt;/a&gt;on&#xD;
the definition of SOA, in the &lt;a href="http://samgentile.com/blogs/samgentile/archive/2008/01/01/soa-it-s-an-and-not-an-or.aspx"&gt;latest&#xD;
installment &lt;/a&gt;Sam disagrees with me that SOA should first be looked at in the pure&#xD;
architectural sense without bundling in the business and enterprise aspects.&lt;br&gt;&#xD;
In a nut shell I have two main reasons to prefer looking at SOA at the core as a pure&#xD;
architectural style.&lt;br&gt;&#xD;
The first is the when you bundle in enterprise-wide aspects of implementing SOA you&#xD;
loose out on the option (or the audience) that can use it to solve more local problem&#xD;
(i.e. at the product/solution level) using the same principles that bring the benefits&#xD;
on the enterprise scale.&lt;br&gt;&#xD;
The other reason I have  for separating the concepts is that the business encompassing&#xD;
definitions tend to be fluid, hand waiving ones and cannot be measured for compliance. &#xD;
&lt;br&gt;&#xD;
Consider the definitions Sam quotes from  Thomas Erl's books:&lt;br&gt;&lt;blockquote&gt;"SOA establishes an architectural model that aims to embrace the &lt;strong&gt;efficiency,&#xD;
agility, and productivity of an enterprise&lt;/strong&gt; by positioning services as the&#xD;
primary means through which solution logic is represented in &lt;strong&gt;support of the&#xD;
realization of strategic goals associated&lt;/strong&gt; with service-oriented computing."&#xD;
(emphasis by Sam)"&lt;br&gt;&lt;br&gt;&#xD;
SOA represents a model in which functionality is decomposed into small, distinct units&#xD;
(services), which can be distributed over a network and can be combined together and&#xD;
reused to create &lt;strong&gt;business applications. [3]&lt;/strong&gt;&lt;br&gt;&lt;/blockquote&gt;Now what the hell is that? These are all noble goals but shouldn't this&#xD;
be the goal of any enterprise architecture ? What makes SOA unique in this sense?&lt;br&gt;&#xD;
Also how does these definitions help us build services? what makes a service a service&#xD;
? Why is (or isn't) any web-enabled component a service? &#xD;
&lt;br&gt;&#xD;
Definitions that distance themselves from the architectural roots seems to me like&#xD;
smoke and mirror and contribute to the general confusion around SOA - to the point&#xD;
where even people like Harry Pierson wonder&lt;a href="http://devhawk.net/2008/01/03/Morning+Coffee+134.aspx"&gt; why&#xD;
we should even bother defining it&lt;/a&gt;&lt;br&gt;&lt;br&gt;&#xD;
Personally, I still think it is worth while defining *** ( the architectural style,&#xD;
formerly known as SOA) since as I mentioned earlier it is (in my opinion) a useful&#xD;
architectural style for building distributed systems - whether the distributed system&#xD;
is a solution, a product, a product line or a complete enterprise&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=742bf4dc-b92e-442d-9b3c-fbe66c17d7d6"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=1WlYpqV5"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=LAEp0TiY"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=mZYfT65p"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=3S6viMO7"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=3S6viMO7" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=OkPyXiox"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=OkPyXiox" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=8LCDfZIz"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,742bf4dc-b92e-442d-9b3c-fbe66c17d7d6.aspx</comments>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2008/01/07/SOADefinitionAndTheEnterpriseSOA.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=43d9597a-c291-4db9-aa4d-1e66f071b4f2</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,43d9597a-c291-4db9-aa4d-1e66f071b4f2.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,43d9597a-c291-4db9-aa4d-1e66f071b4f2.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=43d9597a-c291-4db9-aa4d-1e66f071b4f2</wfw:commentRss>
      
      <title>Defining SOA - Part II - Client/Server</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,43d9597a-c291-4db9-aa4d-1e66f071b4f2.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/MgZu9Stv4qI/DefiningSOAPartIIClientServer.aspx</link>
      <pubDate>Sat, 22 Dec 2007 22:13:24 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;In the &lt;a href="2007/11/24/DefiningSOAPartI.aspx"&gt;previous&#xD;
post  on defining SOA&lt;/a&gt; I claimed that SOA is an architectural style building&#xD;
on 4 other architectural styles. The first one of these is Client/Server.&lt;br&gt;&#xD;
Describing client/server is easy - not because I am such a genius (far from it) but&#xD;
it has already been done before numerous times. Let's take a look at the definition&#xD;
from  &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/net_arch_styles.htm#sec_3_4_1"&gt;Roy&#xD;
Fielding  in his famous dissertation&lt;/a&gt; (The link is to chapter 3, &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm"&gt;REST&#xD;
is defined in chapter 5&lt;/a&gt; if you are interested)&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;&lt;p&gt;&#xD;
The client-server style is the most frequently encountered of the architectural styles&#xD;
for network-based applications. A server component, offering a set of services, listens&#xD;
for requests upon those services. A client component, desiring that a service be performed,&#xD;
sends a request to the server via a connector. The server either rejects or performs&#xD;
the request and sends a response back to the client. A variety of client-server systems&#xD;
are surveyed by Sinha [&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/references.htm#ref_123"&gt;123&lt;/a&gt;]&#xD;
and Umar [&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/references.htm#ref_131"&gt;131&lt;/a&gt;].&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Andrews [&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/references.htm#ref_6"&gt;6&lt;/a&gt;]&#xD;
describes client-server components as follows: A client is a triggering process; a&#xD;
server is a reactive process. Clients make requests that trigger reactions from servers.&#xD;
Thus, a client initiates activity at times of its choosing; it often then delays until&#xD;
its request has been serviced. On the other hand, a server waits for requests to be&#xD;
made and then reacts to them. A server is usually a non-terminating process and often&#xD;
provides service to more than one client.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Separation of concerns is the principle behind the client-server constraints. A proper&#xD;
separation of functionality should simplify the server component in order to improve&#xD;
scalability. This simplification usually takes the form of moving all of the user&#xD;
interface functionality into the client component. The separation also allows the&#xD;
two types of components to evolve independently, provided that the interface doesn't&#xD;
change.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The basic form of client-server does not constrain how application state is partitioned&#xD;
between client and server components. It is often referred to by the mechanisms used&#xD;
for the connector implementation, such as remote procedure call [&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/references.htm#ref_23"&gt;23&lt;/a&gt;]&#xD;
or message-oriented middleware [&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/references.htm#ref_131"&gt;131&lt;/a&gt;].&#xD;
&lt;/p&gt;&lt;/blockquote&gt; SOA takes from the Client/Server style the two roles - ie. in each interaction&#xD;
one party is the client (what I call service consumer) and the other is the server&#xD;
(service) which  handles the request coming from the client*. Unlike traditional&#xD;
client/server, the roles are held only for a particular set of interactions - a given&#xD;
interface that the service exposes. In another set of interactions the roles can be&#xD;
reversed and a component that once was a server can now act as a client even working&#xD;
with the very same component that was previously its client.&lt;br&gt;&lt;br&gt;&#xD;
Like REST, SOA takes the constraint of separation of concerns which allow the service&#xD;
and its service consumers to evolve independently (as long as the interface is kept).&lt;br&gt;&#xD;
In order to support this, services should takes care of all its internal state without&#xD;
exposing its internal state or its internal structures outside of the service. This&#xD;
also allows the service to scale behind the interface but for that we also need constraints&#xD;
and capabilities from the next architectural style layered system, which I'll discuss&#xD;
in the next installment on this subject. &#xD;
&lt;br&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
* You can compose SOA with other architectural styles to get different behaviors.&#xD;
E.g. compose SOA and  EDA and you can have the service also push data.This t&#xD;
isn't, however,  something SOA ,manifest in its basic form&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=43d9597a-c291-4db9-aa4d-1e66f071b4f2"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=hPFRFiWY"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=jpmeeign"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=tdLhJg0M"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=9sUAGdMy"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=9sUAGdMy" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=x7yvqO4G"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=x7yvqO4G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=MepXkAfs"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,43d9597a-c291-4db9-aa4d-1e66f071b4f2.aspx</comments>
      <category>REST</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/12/22/DefiningSOAPartIIClientServer.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=be9b9178-2da7-401b-bf95-01ab13fea769</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,be9b9178-2da7-401b-bf95-01ab13fea769.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,be9b9178-2da7-401b-bf95-01ab13fea769.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=be9b9178-2da7-401b-bf95-01ab13fea769</wfw:commentRss>
      
      <title>Defining SOA - Part I</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,be9b9178-2da7-401b-bf95-01ab13fea769.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/5JNwrTIsHxM/DefiningSOAPartI.aspx</link>
      <pubDate>Sat, 24 Nov 2007 18:34:10 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;A few weeks ago I &lt;a href="2007/10/05/WhatIsThatSOAThingyAgain.aspx"&gt;posted&#xD;
a reaction&lt;/a&gt; to a &lt;a href="http://wanderingbarque.com/nonintersecting/2007/10/05/what-is-soa/"&gt;post&#xD;
by Pete Lacey&lt;/a&gt; that asked what is SOA. In a comment to my post Pete said that my&#xD;
definition isn't good since &#xD;
&lt;br&gt;&lt;blockquote&gt;"...even according to your definition, an architectural style contains&#xD;
constraints, and to date neither SOA nor web services have been shown to exhibit any&#xD;
constraints"&lt;/blockquote&gt;The idea behind this series of posts is to try to take a&#xD;
little more formal view at what I think SOA is. It is based on my thinking for the&#xD;
past few weeks but it is also still a work in progress (so any comments are welcome)&lt;br&gt;&lt;br&gt;&#xD;
The way I see it SOA is an architectural style which is derived from the following&#xD;
architectural styles:&lt;br&gt;&lt;ol&gt;&lt;li&gt;&#xD;
Client/Server&lt;/li&gt;&lt;li&gt;&#xD;
Layered System&lt;/li&gt;&lt;li&gt;&#xD;
Pipe and Filters&lt;/li&gt;&lt;li&gt;&#xD;
Distributed Agents&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&#xD;
Note that if you add to the above statelessness, &lt;b&gt;uniformed &lt;/b&gt;pipe and filters&#xD;
and a cache you can get a RESTful SOA. This is not REST as REST itself does not require&#xD;
distributed agent or even pipes and filters (but it does build on client/server and&#xD;
layered system). In other words not all RESTful systems are SOA, you can build SOAs&#xD;
which are not RESTful and you can build RESTful SOAs.&lt;br&gt;&lt;br&gt;&#xD;
The main components of SOA are Service,Message, Contracts and Consumers. Policies&#xD;
also exists but now I tend to think they are optional. The four architectural styles&#xD;
mentioned above affect the definitions of the different components and the way they&#xD;
interact together&lt;br&gt;&lt;br&gt;&#xD;
In the following posts on this subject I'll first take a look at each of the contributing&#xD;
architectural styles and how they affect SOA and later try to provide a definition&#xD;
that builds on them &#xD;
&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=be9b9178-2da7-401b-bf95-01ab13fea769"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=tryhFWPl"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=WRZRw6av"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=rCFLWNJp"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=iFuV3LND"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=iFuV3LND" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=y3PUpcwL"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=y3PUpcwL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=PfOYU6kb"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,be9b9178-2da7-401b-bf95-01ab13fea769.aspx</comments>
      <category>REST</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/11/24/DefiningSOAPartI.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=ce120866-ee4a-45d6-8b35-b829d225e5c6</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,ce120866-ee4a-45d6-8b35-b829d225e5c6.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,ce120866-ee4a-45d6-8b35-b829d225e5c6.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=ce120866-ee4a-45d6-8b35-b829d225e5c6</wfw:commentRss>
      
      <title>An Architectural look at SOA </title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,ce120866-ee4a-45d6-8b35-b829d225e5c6.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/8hrCxg_nua4/AnArchitecturalLookAtSOA.aspx</link>
      <pubDate>Tue, 04 Sep 2007 22:03:45 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;When I begun writing SOA patterns, the&#xD;
first version of chapter 1 was a general introduction to Service Oriented Architecture&#xD;
from the perspective of Software architecture. When the editors saw the patterns chapters&#xD;
they've felt the chapter wasn't focused enough on patterns so I rewrote it untill&#xD;
it finally molded into &lt;a href="http://www.manning.com/rotem/rotem_meapch1.pdf"&gt;the&#xD;
current version&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&#xD;
Nevertheless, I think that the first version has value on its own providing some guidance&#xD;
on the influences on architecture and putting SOA in an architectural context. I will&#xD;
probably edit it a little over the next few days so that it would be standalone (i.e.&#xD;
disconnected from the book). Meanwhile you can download the original version &lt;a href="http://www.rgoarchitects.com/files/archsoa.pdf"&gt;from&#xD;
here&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=ce120866-ee4a-45d6-8b35-b829d225e5c6"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=uuDXc0uM"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ez0VXWVO"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=2ubuqq6o"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=IjgUKzKh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=IjgUKzKh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=LoEv2tJo"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=LoEv2tJo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=N1NA25vS"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,ce120866-ee4a-45d6-8b35-b829d225e5c6.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
      <category>Papers</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/09/04/AnArchitecturalLookAtSOA.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=dba65633-ee5c-44da-a77d-5f854988aeda</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,dba65633-ee5c-44da-a77d-5f854988aeda.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,dba65633-ee5c-44da-a77d-5f854988aeda.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=dba65633-ee5c-44da-a77d-5f854988aeda</wfw:commentRss>
      
      <title>A&amp;D 2007: My Presenations</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,dba65633-ee5c-44da-a77d-5f854988aeda.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/qBKbhscaX9M/AD2007MyPresenations.aspx</link>
      <pubDate>Wed, 01 Aug 2007 20:52:49 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;I won't say anything about my presentations&#xD;
(that's for others to say :) ). The point of this post is just to let you download&#xD;
them. So here they are:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.rgoarchitects.com/files/soapatterns.pdf"&gt;SOA Patterns&lt;/a&gt; (2.14mb)&#xD;
- Takes a look at different strategies (patterns) to solve common SOA pitfalls&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rgoarchitects.com/files/SPAMMED.pdf"&gt;Getting SPAMMED for architecture&lt;/a&gt; (4.56mb)&#xD;
- Takes a look at the activities architects can/should do when they think about software&#xD;
architectures. The presentation also covers architecture in agile projects.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=dba65633-ee5c-44da-a77d-5f854988aeda"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Y9bIj5LS"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=PkhwcW2k"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=GUNMJnlq"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=GSwQKS07"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=GSwQKS07" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=lCMcjMQ4"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=lCMcjMQ4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ZlEBtBDV"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,dba65633-ee5c-44da-a77d-5f854988aeda.aspx</comments>
      <category>.NET</category>
      <category>A&amp;D2007</category>
      <category>Agile</category>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
      <category>SPAMMED Process</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/08/01/AD2007MyPresenations.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=e4943927-7741-4b5b-9abb-98d6f3b34236</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,e4943927-7741-4b5b-9abb-98d6f3b34236.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,e4943927-7741-4b5b-9abb-98d6f3b34236.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e4943927-7741-4b5b-9abb-98d6f3b34236</wfw:commentRss>
      
      <title>SOA Patterns book: status update</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,e4943927-7741-4b5b-9abb-98d6f3b34236.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/DMn9Lw48gCc/SOAPatternsBookStatusUpdate.aspx</link>
      <pubDate>Mon, 23 Jul 2007 09:45:51 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;While I am getting ready to fly to &lt;a href="http://www.sdexpo.com/2007/archdesign/"&gt;A&amp;amp;D&#xD;
world 2007&lt;/a&gt; where I'll present both SOA patterns and the SPAMMED architecture framework,&#xD;
I thought I'd throw in a little update on the &lt;a href="http://www.soapatternsbook.com/"&gt;book &lt;/a&gt;as&#xD;
well. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
I've made a small change to the way chapters 5-7 are organized. They are now grouped&#xD;
under a separate part called "Service Interaction Patterns" (and chapters 2-4 are&#xD;
grouped under "Structural Patterns"). &#xD;
&lt;br&gt;&lt;ul&gt;&lt;li&gt;&#xD;
Chapter 5 is focused on Message Exchange Patterns (MEP): synchronous, asynchronous,&#xD;
events and transactional  - The patterns there are not new for SOA, instead the&#xD;
focus is on the meaning of implementing the usual MEPs under SOA constraints. I sent&#xD;
it to manning early last week so hopefully it would be available on &lt;a href="http://www.manning.com/rotem/"&gt;MEAP &lt;/a&gt;soon. &#xD;
&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Chapter 6 is called "Consumer Interaction patterns" and includesthe UI interaction&#xD;
patterns as well as interaction pattern with other types of consumers. This is the&#xD;
chapter I am currently working on.&lt;br&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Chapter 7 is unchanged for now&lt;/li&gt;&lt;/ul&gt;&#xD;
Lastly,  as you may remember,  I publish online one pattern from each chapter&#xD;
so I'd be happy to get comments on which of the following three patterns (from chapter&#xD;
6) you like  to see on-line: Reservation pattern (making partial commitments),&#xD;
Client/Server/Service (integrating Legacy or thin clients with SOA) , Client/Service&#xD;
(integration Rich clients with SOA) - if you want to vote just send me an email or&#xD;
leave a comment&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=e4943927-7741-4b5b-9abb-98d6f3b34236"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=LpzYXHBs"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=8oRzSJ7B"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=viKdGJj1"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=SPXTYtMv"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=SPXTYtMv" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=xj0VeNUf"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=xj0VeNUf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=uZOLkrXv"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,e4943927-7741-4b5b-9abb-98d6f3b34236.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/07/23/SOAPatternsBookStatusUpdate.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=f18c4e82-81a8-4f9c-9705-e22e26e81836</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,f18c4e82-81a8-4f9c-9705-e22e26e81836.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,f18c4e82-81a8-4f9c-9705-e22e26e81836.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f18c4e82-81a8-4f9c-9705-e22e26e81836</wfw:commentRss>
      <slash:comments>3</slash:comments>
      
      <title>SOA and Cross-Service Transactions</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,f18c4e82-81a8-4f9c-9705-e22e26e81836.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/CRehKwOiMLA/SOAAndCrossServiceTransactions.aspx</link>
      <pubDate>Fri, 13 Jul 2007 20:47:03 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Evan H asked a question about distributed&#xD;
transactions and services in the &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1840652&amp;amp;SiteID=1"&gt;MSDN&#xD;
architecture forum&lt;/a&gt;:&lt;br&gt;&lt;span id="_ctl0_MainContent_PostFlatView"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span&gt;&lt;p&gt;&#xD;
Are distributed transactions (ie.. WS-Transaction) a violation of the "Autonomous"&#xD;
tenant of service orientation?   Yes or No and Why?  Kudos if you can&#xD;
address concurrency and scalability (in an enterprise with multiple interacting services).&#xD;
&lt;/p&gt;&lt;/span&gt;&lt;/blockquote&gt;I answerd this questions back in april when I wrote a couple of&#xD;
posts that explained why cross-service transactions are a bad idea:&lt;a href="PermaLink.aspx?guid=4dd6c5ca-6e25-4e41-a15f-614d3793dc74"&gt;cross&#xD;
service transactions &lt;/a&gt;and &lt;a href="http://www.ddj.com/blog/architectblog/archives/2007/04/some_more_thoug.html"&gt;some&#xD;
more thoughts on cross service transactions&lt;/a&gt;. &#xD;
&lt;br&gt;&#xD;
Roger Sessions also agrees with this view (well, it seems actually, he wrote about&#xD;
it well before I did :) ):&lt;br&gt;&lt;blockquote&gt;&lt;span id="_ctl0_MainContent_PostFlatView"&gt;&lt;span&gt;When the WS-Transaction&#xD;
specification was first proposed, back in 2002, I wrote an article explaining why&#xD;
I thought the idea of allowing true transactions to span services was a bad idea.&#xD;
I published the article in The ObjectWatch Newsletter, #41: &lt;a title="http://www.objectwatch.com/newsletters/issue_41.htm" href="http://www.objectwatch.com/newsletters/issue_41.htm"&gt;http://www.objectwatch.com/newsletters/issue_41.htm&lt;/a&gt;.&#xD;
Nothing since then has changed my mind. Atomic transactions require holding locks,&#xD;
and spanning transactions across services requires allowing a foreign, untrusted service&#xD;
to determine how long you will hold your very precious database locks. Bad idea. Just&#xD;
because IBM and Microsoft agreed on something doesn't make it good!&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;The reason I am bringing this issue back is that Juval&#xD;
Lowy (who wrote the article that triggered my first post on the subject) &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=324141"&gt;has&#xD;
recorded an Arcast with Ron Jabobs&lt;/a&gt;. Where he re-iterated the idea that "Transactions&#xD;
is categoricaly the only viable programming model" and you should strive to use it&#xD;
whenever you can. It seems Juval admits you sometimes need to use &lt;a href="../Files/SOAPatterns/Saga.pdf"&gt;Sagas&lt;/a&gt; (which&#xD;
he called "long running transactions" - you can see in my link why I think that's&#xD;
a wrong name). He also agrees that you can also use a transactionable transport and&#xD;
then only do internal transactions from each service to the transport (a pattern I&#xD;
call "Transactional Service"). However, at the end of the day, he still thinks you&#xD;
should use WS-AtomicTransactions whenever you can.&lt;br&gt;&lt;br&gt;&#xD;
I agree that transactional programming is important. I think it is the simplest programming&#xD;
model (from the developers side). I would probably never write an interaction with&#xD;
a database that is not transactional; I look very favorably at initiatives for in-memory&#xD;
ACI (no Durability) transactions &lt;a href="http://weblogs.asp.net/ralfw/default.aspx"&gt;such&#xD;
as the one Ralf talks about&lt;/a&gt;.  Until we get to Distributed Transactions...&lt;br&gt;&lt;br&gt;&#xD;
First, we should note that transactions are not "the only viable" option.As &lt;a href="http://www.martinfowler.com/bliki/Transactionless.html"&gt;Martin&#xD;
Fowler notes&lt;/a&gt; Ebay seems to be doing fine without distributed transactions. Not&#xD;
only that, they abandoned distributed transaction and went "transactionless"because&#xD;
they needed one simple thing... Scalable performance . &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
In most COM+ scenarios you have a single server or a few internal servers where the&#xD;
distributed transaction happen - and even there you should plan your transactions&#xD;
carefully if you want to get any kind of decent performance. In SOA scenarios the&#xD;
situation is more complicated as the distribution level is expected to be higher (even&#xD;
if you don't involve services from other companies). More distribution means longer&#xD;
times to complete transactions (especially if a participant can flow the transaction&#xD;
and extend it). It also means increasing the chances of failure (see Steve Jones series&#xD;
of posts on &lt;a href="http://service-architecture.blogspot.com/2007/04/five-nines-for-soa-summary.html"&gt;five&#xD;
nines for SOA&lt;/a&gt;). In my opinion, the more distributed components you have the more&#xD;
you want their interaction to be decoupled in time - i.e. the opposite of transactions.&lt;br&gt;&lt;br&gt;&#xD;
Juval also said he doesn't buy the denial of service problem I mentioned (supporting&#xD;
a transaction means you allow locks - if an external party doesn't commit you retain&#xD;
the lock..). Juval said he assumes that a solutions has both authentication and authorization&#xD;
so this shouldn't be an issue. For one, I have seen too many projects where security&#xD;
was something that was neglected or quickly patched in at the latest moment - so I&#xD;
would hardly assume security. Even with security on - you increase your attack surface.&lt;br&gt;&#xD;
But that's just the half of it. Even if all your service consumers have good intentions&#xD;
- you still don't know anything about their code. SOA is not like the "good old days"&#xD;
where you owned the whole application  - this means you cannot trust their security&#xD;
to be ample. Also you don't know anything about their code quality. Services are likely&#xD;
(in the general case) to be deployed on different machines, even if they start co-located.&#xD;
I think that a Service boundary should be treated as a trust boundary just like a &lt;a href="PermaLink,guid,27923d85-25ed-44bb-a5bd-a29d8155d6bc.aspx"&gt;tier&#xD;
boundary&lt;/a&gt;. I strongly believe you should have reduced assumptions on what's on&#xD;
the other side of the service's boundary - transactions are not reduced assumptions&lt;br&gt;&lt;br&gt;&#xD;
SOA and distributed transactions do not go hand in hand - it isn't just autonomy at&#xD;
stake here. It is a problem for performance and scalability and even security period. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
To finish this post - I would also highly recommend looking at Pat Helland's paper &lt;a href="http://www-db.cs.wisc.edu/cidr/cidr2007/papers/cidr07p15.pdf"&gt;"Life&#xD;
Beyond Distributed Transactions: an Apostate's Opinion"&lt;/a&gt; and a post he recently&#xD;
made called  "&lt;a href="http://blogs.msdn.com/pathelland/archive/2007/05/20/soa-and-newton-s-universe.aspx"&gt;SOA&#xD;
and Newton's Universe&lt;/a&gt;", where he explains more eloquently than I ever could why&#xD;
SOA is not a good fit for distributed transactions.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=f18c4e82-81a8-4f9c-9705-e22e26e81836"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=JtfyAigg"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=lDMD20OP"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=HgzUCCb7"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=uflcCzDn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=uflcCzDn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=3DNsnhj3"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=3DNsnhj3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=VJ7xs2rs"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,f18c4e82-81a8-4f9c-9705-e22e26e81836.aspx</comments>
      <category>.NET</category>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/07/13/SOAAndCrossServiceTransactions.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=6d682d1b-03d0-4fb4-87fe-6bb74f532424</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,6d682d1b-03d0-4fb4-87fe-6bb74f532424.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,6d682d1b-03d0-4fb4-87fe-6bb74f532424.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6d682d1b-03d0-4fb4-87fe-6bb74f532424</wfw:commentRss>
      
      <title>My "SOA Patterns" book available on Manning Early Access Program.</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,6d682d1b-03d0-4fb4-87fe-6bb74f532424.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/XjZyApnDEwQ/MySOAPatternsBookAvailableOnManningEarlyAccessProgram.aspx</link>
      <pubDate>Wed, 13 Jun 2007 08:37:18 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;In addition to the drafts of selected patterns&lt;a href="http://www.soapatternsbook.com/"&gt; I&#xD;
publish on my site&lt;/a&gt;, you can now &lt;a href="http://www.manning.com/rotem/"&gt;purchase&#xD;
my book via the Manning Early Access Program (MEAP)&lt;/a&gt;.&lt;br&gt;&lt;a href="http://www.manning.com/about/meap"&gt;MEAP&lt;/a&gt; means you can get chapter drafts&#xD;
as I write them and the complete book when its done (ebook or printed). Here is Manning's&#xD;
explanation:&lt;br&gt;&lt;blockquote&gt;"Buy now through MEAP (Manning Early Access Program) and get early access&#xD;
to the book, chapter by chapter, as soon as they become available. You choose the&#xD;
format - PDF or ThoutReader - or both. By subscribing to MEAP chapters, you get an&#xD;
opportunity to participate in the most sensitive, final piece of the publishing cycle&#xD;
by offering feedback to the author. Reader feedback to the author is welcome in the&#xD;
Author Online forum. As new chapters are released, announcements are made in the MEAP&#xD;
Announcement Forum. After all chapters are released, you will be able to download&#xD;
the complete edited ebook. If you order the print edition, we will ship it to you&#xD;
upon release, direct from the bindery, weeks before it is widely available elsewhere.&lt;/blockquote&gt; By&#xD;
the way, this is probably also a good time to mention that I'll be speaking about&#xD;
quite a few of the patterns in &lt;a href="https://www.cmpevents.com/SDUM7/a.asp?option=C"&gt;Architecture&#xD;
&amp;amp; Design World 2007&lt;/a&gt; which will take place this July. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
There is still a lot of work, but I already like to thank all the people in manning&#xD;
that helped me get this far. especially to Cynthia Kane my editor (hey, maybe now&#xD;
she'll give me more slack :) ) &#xD;
&lt;br&gt;&#xD;
Ok, 'nuff blubbering, back to completing chapter 5... &#xD;
&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=6d682d1b-03d0-4fb4-87fe-6bb74f532424"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=AKWzaovJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ol8dhNGn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Us79MsQl"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=2ZhcB8VX"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=2ZhcB8VX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=h3FglD5c"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=h3FglD5c" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=syjJt0ai"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,6d682d1b-03d0-4fb4-87fe-6bb74f532424.aspx</comments>
      <category>.NET</category>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/06/13/MySOAPatternsBookAvailableOnManningEarlyAccessProgram.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4</wfw:commentRss>
      
      <title>REST and contracts</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/t_Uuzc1EFHE/RESTAndContracts.aspx</link>
      <pubDate>Wed, 06 Jun 2007 09:02:54 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
While&lt;a href="PermaLink,guid,cf96ee70-64db-4053-8318-f4c44a4a5c42.aspx"&gt; I am on the&#xD;
topic of REST&lt;/a&gt;, it is probably a good time to comment on my (first) post on InfoQ&#xD;
"&lt;a href="http://www.infoq.com/news/2007/06/rest-description-language"&gt;Debate: Does&#xD;
REST need a Description Language&lt;/a&gt;" &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
Personally, I think there's merit in Services publishing their message structures&#xD;
in a machine readable format. When a Service has a machine readable contact. generated&#xD;
stubs allows you to make the interaction with less bugs vs. hand crafted interactions.&#xD;
It also makes it easier to test the service itself.&lt;br&gt;&lt;br&gt;&#xD;
I do agree with &lt;a href="http://www.innoq.com/blog/st/2007/05/30/runtime_interface_dependency.html"&gt;Stefan's&#xD;
views on runtime interface dependency&lt;/a&gt; where he said that if a service consumer&#xD;
needs just 20% of the information in a service it shouldn't be forced to deserialize&#xD;
(i.e. know or care about) the whole message.However, I think this is a weakness of&#xD;
tooling not the concept. What if you had a tool that reads the machine readable contract,&#xD;
allow you to pick the 20% you need and generate for you a stub that ignores all the&#xD;
other 80% and "hand pick" the 20% you need. This is what you would personally do yourself&#xD;
anyway, and since the code is generated from the Service's definition it would be&#xD;
more resilient and error-free This is effectively designing a personalized mini-contract&#xD;
from the published general one. It does mean that when that 20% changes you will be&#xD;
affected, but this is something you'd have anyway.&lt;br&gt;&lt;br&gt;&#xD;
I also agree that that the WS-* standards and resulting contract are (and getting&#xD;
more) complicated. Much of this can probably be attributed to the &lt;a href="http://en.wikipedia.org/wiki/Design_by_committee"&gt;"design&#xD;
by committee"&lt;/a&gt; effect. However, there are also some real challenged that the SOA&#xD;
and ROA architectural styles do not address and we still need to solve those. Trying&#xD;
to solve these challenges is, by the way, what prompted me to write my &lt;a href="http://www.soapatternsbook.com/"&gt;SOA&#xD;
patterns book&lt;/a&gt;...&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=bW7ygDYR"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=fjqrSgTF"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=CWC5p4cS"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=pyBGniHi"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=pyBGniHi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Adw2IQXs"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=Adw2IQXs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ibxpC29j"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,9c4a06cc-6e8b-4c43-ac5e-4cdf62400cd4.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/06/06/RESTAndContracts.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9</wfw:commentRss>
      <slash:comments>3</slash:comments>
      
      <title>.NET/Java Interop is a reason for Web-Services</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/MnqjxxF4QjM/NETJavaInteropIsAReasonForWebServices.aspx</link>
      <pubDate>Tue, 29 May 2007 08:12:00 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Udi Dahan writes that "&lt;a href="http://udidahan.weblogs.us/2007/05/28/netjava-interop-is-not-a-reason-for-soa/"&gt;.NET/Java&#xD;
Interop is not a reason for SOA&lt;/a&gt;". Udi writes that companies that  need to&#xD;
integrate two technologies turn to web-services and that &#xD;
&lt;br&gt;&lt;blockquote&gt;"The only problem is that in order for things to work right, they really &lt;i&gt;must&lt;/i&gt; have&#xD;
a chatty interface, and flow transaction context between these “services”, and all&#xD;
the other things I describe as anti-patterns"&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;&#xD;
Udi is right that if you don't rethink and remodel your systems you will (probably)&#xD;
not  have an SOA as you are likely to find your self implementing  anti-patterns&#xD;
such as the ones he mentions. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
However, using Web-services does not automatically mean that you are doing an SOA.&#xD;
If you don't think about moving to SOA you can still opt to use web-services as a&#xD;
remoting  or RPC technology to connect two systems. The advantage over the other&#xD;
proprietary products Udi mentions is that web-services are a standard technology.&#xD;
This will work well or fail is orthogonal to the technology choice. It depends on&#xD;
the architectures of the systems you integrate. If you need to flow transaction between&#xD;
the systems you'd also need that even if you cross-compile one of the applications&#xD;
in the other environment.&lt;br&gt;&lt;br&gt;&#xD;
Another thing I don't agree with is the word &lt;b&gt;must &lt;/b&gt;Udi uses. First, while it&#xD;
is likely that older systems has chatty interfaces it is not a must. The designers&#xD;
of the legacy system may have thought about the consequences of distribution without&#xD;
regard to SOA. Also you can still wrap an existing system with a service contract&#xD;
(using web-services or any other technology) and not get to chatty interfaces etc.&#xD;
However that means that the wrapper should have some substance or business logic inside&#xD;
it to mask the old system's behavior this is especially important  if you are&#xD;
thinking about moving to SOA and you take into consideration that the business will&#xD;
not just halt and wait there until you are done. You have to think about interim solutions,&#xD;
such interim solutions can include wrapping a legacy system with an Edge Component&#xD;
and a SOA facade (a pattern I call Legacy Bridge) while you move in the grader direction&#xD;
of a full blown SOA.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=IEgCjwMm"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=9l1b7Cs4"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=0Vf57hgG"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=cO9i9IZK"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=cO9i9IZK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=rH0tG74y"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=rH0tG74y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=CjTTthqm"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,a213e5a6-bc4d-4dc7-905e-de4c3f7d4bf9.aspx</comments>
      <category>.NET</category>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/05/29/NETJavaInteropIsAReasonForWebServices.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=cf7b44ed-08f2-49ae-a6f7-ac319c15b88d</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,cf7b44ed-08f2-49ae-a6f7-ac319c15b88d.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,cf7b44ed-08f2-49ae-a6f7-ac319c15b88d.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=cf7b44ed-08f2-49ae-a6f7-ac319c15b88d</wfw:commentRss>
      
      <title>SOA Patterns : The Saga interaction pattern</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,cf7b44ed-08f2-49ae-a6f7-ac319c15b88d.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/HblAlXl6BHs/SOAPatternsTheSagaInteractionPattern.aspx</link>
      <pubDate>Mon, 28 May 2007 22:54:22 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;It has been awhile since I last published&#xD;
a pattern draft - but I guess it is better late than never.&lt;br&gt;&#xD;
The saga pattern deals with manginc complex interactions between services without&#xD;
the use of atomic transactions, which as I mentioned in the past are not a good idea&#xD;
(see "&lt;a href="http://www.ddj.com/blog/architectblog/archives/2007/04/transactions_be.html"&gt;Transactions&#xD;
between services? No, No, No!&lt;/a&gt;" and "&lt;a href="http://www.ddj.com/blog/architectblog/archives/2007/04/some_more_thoug.html"&gt;Some&#xD;
more thoughts on Cross-service transactions&lt;/a&gt;" ) &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
You can download the draft for the Saga pattern from &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/saga.pdf"&gt;here&lt;/a&gt;. &#xD;
&lt;br&gt;&#xD;
I'll also add a link to it from the &lt;a href="http://www.soapatternsbook"&gt;SOA Patterns&#xD;
book &lt;/a&gt;section (where you can also &lt;a href="http://www.rgoarchitects.com/soapatterns"&gt;download &lt;/a&gt;the&#xD;
other pattern drafts I published)&lt;br&gt;&lt;br&gt;&#xD;
By the way, I am not happy with the current  sketch (the pattern illustration)&#xD;
in this pattern, so it will probably change in later drafts. I would be happy to hear&#xD;
any suggestions you have for improving it.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=cf7b44ed-08f2-49ae-a6f7-ac319c15b88d"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=DPTC1vVv"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=XywouObW"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=6zy7lx3H"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=UGrLWmDj"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=UGrLWmDj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=M30PMeg0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=M30PMeg0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=RBffnxkV"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,cf7b44ed-08f2-49ae-a6f7-ac319c15b88d.aspx</comments>
      <category>Everything</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/05/28/SOAPatternsTheSagaInteractionPattern.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=4604b7b4-8dd7-4fc4-aef6-67286940b93a</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,4604b7b4-8dd7-4fc4-aef6-67286940b93a.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,4604b7b4-8dd7-4fc4-aef6-67286940b93a.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4604b7b4-8dd7-4fc4-aef6-67286940b93a</wfw:commentRss>
      
      <title>Truth in a distributed world</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,4604b7b4-8dd7-4fc4-aef6-67286940b93a.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/3uSUfJvZ4Hg/TruthInADistributedWorld.aspx</link>
      <pubDate>Tue, 15 May 2007 07:16:24 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;Pat Helland is back in Microsoft (after&#xD;
a two years vacation in Amazon)  and more importantly he also restarted blogging.&#xD;
I only met him in person a few times - but he is definitely one of the few persons&#xD;
really worth listening to - especially when it comes to distributed computing. Not&#xD;
only does he make interesting observations he is also capable of explaining them in&#xD;
a crisp and interesting manner.  Indeed, it didn't take too long (his second&#xD;
post) before he blogged some valuable content. The post is called &lt;a href="http://blogs.msdn.com/pathelland/archive/2007/05/15/memories-guesses-and-apologies.aspx"&gt;Memories,&#xD;
guesses and apologies&lt;/a&gt; (go read it).&lt;br&gt;&lt;br&gt;&#xD;
Pat talks about how the notion of time in a distributed environment is subjective&#xD;
and you can really know what happened before what and what we can do about it (I really&#xD;
think you should  just go read it :) ). &#xD;
&lt;br&gt;&#xD;
Another related aspect of the phenomena Pat mentioned is that taking a snapshot in&#xD;
time, the chances of having a single unified truth in a distributed system degrade&#xD;
in a proportional manner to the system's load. I  had a chance to work on a few&#xD;
systems where some of the sites had either occasionally connected or connected over &#xD;
low bandwidth networks. This situation makes the whole notion of guessing the state&#xD;
and compensating and/or apologizing for wrong conclusions much more explicit than&#xD;
in always connected high bandwidth system. Nevertheless, latency still exists even&#xD;
in connected systems and and you should really be weary of assuming a universal truth&#xD;
- unless you can stop the businesses  long enough to allow complete synchronization. &#xD;
&lt;br&gt;&#xD;
As I mentioned a few days ago, &lt;a href="http://www.rgoarchitects.com/blog/PermaLink,guid,4dd6c5ca-6e25-4e41-a15f-614d3793dc74.aspx"&gt;we&#xD;
can't afford to have cross-service transactions&lt;/a&gt; (I also think we can't afford&#xD;
too many distributed transaction in non-SOA architectures, but this is a especially&#xD;
true for SOA) which makes things even worse in this sense. One thing we can do in&#xD;
an SOA to achieve distributed consensus is to run a Saga. Saga, which is a long running&#xD;
conversation between services, is probably one of the most important interaction patterns&#xD;
for SOA. &#xD;
&lt;br&gt;&#xD;
You know what? instead of trying to explain it here in a haste i'll just publish the&#xD;
pattern draft - I'll try to do that before the end of the week.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=4604b7b4-8dd7-4fc4-aef6-67286940b93a"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=wgyuFeD0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=WvkcKU2l"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=zvZDKyHA"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=kXpeYpZM"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=kXpeYpZM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=O8g6pkD0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=O8g6pkD0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=dBpgTrgn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,4604b7b4-8dd7-4fc4-aef6-67286940b93a.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/05/15/TruthInADistributedWorld.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=3cb1e4c6-234a-47cb-8e82-ed1090d2528d</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,3cb1e4c6-234a-47cb-8e82-ed1090d2528d.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,3cb1e4c6-234a-47cb-8e82-ed1090d2528d.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3cb1e4c6-234a-47cb-8e82-ed1090d2528d</wfw:commentRss>
      
      <title>My article on BI &amp; SOA  in MSDN</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,3cb1e4c6-234a-47cb-8e82-ed1090d2528d.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/pEimgk4WgIc/MyArticleOnBISOAInMSDN.aspx</link>
      <pubDate>Mon, 30 Apr 2007 18:34:19 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;An article I wrote on Business Intelligence&#xD;
(BI) and Service Oriented Architecture (SOA) has just been published on MSDN.&lt;br&gt;&#xD;
You can find it &lt;a href="http://msdn2.microsoft.com/en-us/library/bb419307.aspx"&gt;here &lt;/a&gt;http://msdn2.microsoft.com/en-us/library/bb419307.aspx.&lt;br&gt;&lt;br&gt;&#xD;
The article explains the SOA &amp;amp; BI mismatch and how to bridge it by adding EDA&#xD;
to SOA. (I bloged about it here before, but the article is more ordered and complete)&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=3cb1e4c6-234a-47cb-8e82-ed1090d2528d"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=2nJyJs29"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=aa8ROJss"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=IQh5OvfS"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=WJ5HS3P7"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=WJ5HS3P7" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=4nElIfpk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=4nElIfpk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=tKvoVkBl"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,3cb1e4c6-234a-47cb-8e82-ed1090d2528d.aspx</comments>
      <category>.NET</category>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/04/30/MyArticleOnBISOAInMSDN.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=9c1ed83d-7fb0-49a4-a748-66dcbe070853</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,9c1ed83d-7fb0-49a4-a748-66dcbe070853.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,9c1ed83d-7fb0-49a4-a748-66dcbe070853.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9c1ed83d-7fb0-49a4-a748-66dcbe070853</wfw:commentRss>
      
      <title>Architecture &amp; Design World 2007</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,9c1ed83d-7fb0-49a4-a748-66dcbe070853.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/0R9q-Ys2kdU/ArchitectureDesignWorld2007.aspx</link>
      <pubDate>Thu, 26 Apr 2007 19:00:47 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I'll be presenting a  90 minute class on &lt;a href="http://www.soapatternsbook.com/"&gt;SOA&#xD;
Patterns&lt;/a&gt; on the upcoming &lt;a href="http://www.sdexpo.com"&gt;Architecture &amp;amp;&#xD;
Design world 2007 &lt;/a&gt;- which will take place in Chicago on July 24-27th.&lt;br&gt;&#xD;
If any of you happen to be there, I'd be very happy if you drop by and say hello :)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=9c1ed83d-7fb0-49a4-a748-66dcbe070853"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=2IWQTrKw"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=FUEdKw4V"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=C4YUqER1"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=sieVt5wm"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=sieVt5wm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=FND7ddTR"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=FND7ddTR" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=KCyLgNyl"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,9c1ed83d-7fb0-49a4-a748-66dcbe070853.aspx</comments>
      <category>Everything</category>
      <category>General</category>
      <category>SOA Patterns</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/04/26/ArchitectureDesignWorld2007.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=4dd6c5ca-6e25-4e41-a15f-614d3793dc74</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,4dd6c5ca-6e25-4e41-a15f-614d3793dc74.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,4dd6c5ca-6e25-4e41-a15f-614d3793dc74.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4dd6c5ca-6e25-4e41-a15f-614d3793dc74</wfw:commentRss>
      
      <title>Cross-Service Transactions </title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,4dd6c5ca-6e25-4e41-a15f-614d3793dc74.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/D1PnHeWhYvk/CrossServiceTransactions.aspx</link>
      <pubDate>Tue, 17 Apr 2007 12:58:15 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
After seeing Juval Lowy's article on &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/05/Foundations/default.aspx"&gt;WCF&#xD;
transaction propagation&lt;/a&gt; in the May issue of MSDN magazine. I posted  " &lt;a href="http://www.ddj.com/blog/architectblog/archives/2007/04/transactions_be.html"&gt;Transactions&#xD;
Between Services? No, No, No!&lt;/a&gt; " in my &lt;a href="http://www.ddj.com/dept/architect"&gt;DDJ&#xD;
blog&lt;/a&gt;. I've got a few comments which I thought warrant a post in their own-right.&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The previous post was triggered by an article that promoted flowing transactions (i.e.&#xD;
you perform a transaction against one or two services and then one of the services&#xD;
calls an additional service and it joins the transaction). It is important to say&#xD;
that I think transactions between services should be discouraged regardless of automating&#xD;
extension of transactions. Transaction propaqgation just makes the matters worse. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
There might still be some edge case where you have to have an atomic transaction from&#xD;
a service consumer to the service. I think that in the vast majority of SOA implementations&#xD;
you shouldn't do that and I would think real hard about the other options before allowing&#xD;
it in my architecture.In general  I think cross-service transactions are an antipattern&#xD;
(and that's the way you'd find them documented in my &lt;a href="http://www.soapatternsbook.com"&gt;SOA&#xD;
patterns book&lt;/a&gt; :) )&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One of the comments I received began with: &#xD;
&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
"Cross service transactions are a sure way to introduce coupling and performance problems&#xD;
into your SOA." I'm not sure I agree with that thought. Logically speaking, cross&#xD;
service transactions are a must. The question is how to implement them. There are&#xD;
two mechanisms we can use for implementing TXs: (1) ACID TXs; (2) Long-running TXs.&#xD;
The latter is preferable for the cases Arnon is talking about (large geographical&#xD;
distances, multiple trust authorities, and distinct execution environments). ACID&#xD;
TXs are more suitable for what Guy has mentioned (DeleteCustomer service invokes the&#xD;
DeleteCustomerOrder service internally). I agree with Arnon the a-synchronicity is&#xD;
preferable, but we all have encountered use-cases where ACID-ness is required from&#xD;
a business requirement level... [snipped] &#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
One minor point in regard to this comment is that I don't like the term long running&#xD;
transaction - there is a long running interactions between services and I think the&#xD;
term SAGA describes them better. Sagas are made of a series of business activities&#xD;
that flow back and forth between services to realize a larger business process. Note&#xD;
that these interactions doesn't necessarily have transaction-like behavior. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
which brings me to the more important point of looking at the statement "Logically&#xD;
speaking, cross service transactions are a must". I don't think so. For instance,&#xD;
if a service that manages the inventory in a warehouse receives a request for some&#xD;
items and later a cancelation of that request. The first request can trigger the inventory&#xD;
service to order some more items from a supplier. Whether or not the cancellation&#xD;
would cause a cancellation of the order of the supplier depends on the business rules&#xD;
of the inventory service for inventory levels for the items ordered. it might also&#xD;
depend on whether or not the items have already been received etc. The cancellation&#xD;
(the "abort") of the original request does not have to translate to an abort (or compensation)&#xD;
on the request receiver. Furthermore if the service communications model is based&#xD;
on the push model (e.g. using EDA with SOA) the cancellation notice would just be&#xD;
propagated without regard to the inventory service -. It is the inventory service's&#xD;
responsibility to understand the ramifications of this event and act accordingly.&#xD;
Even the example given in the comment 'DeleteCustomer service invokes the DeleteCustomerOrder&#xD;
service internally" is not a good candidate from ACID transactions (there's also a&#xD;
problem of service granularity here - I'll talk about it later). Since when the customer&#xD;
service decides to delete a comment and request the Orders service to delete orders&#xD;
- there's a reasonable chance that some of the orders are already paid for but not&#xD;
delivered. In this case the customer cannot really delete the customer until all the&#xD;
paid orders are resolved. Or maybe the order service is a facade to a night batch&#xD;
that does the actual deletion. - I know I am just fantasizing with these examples&#xD;
but the point is that the customer service has no knowledge on the order service or&#xD;
the inventory service above except the messages supported in their contract. To assume&#xD;
something about the internal behavior is problematic. Even if you know about the internal&#xD;
structure on the onset, the whole idea of SOA is that the services can evolve independently&#xD;
from each other... &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
Another thought triggered by the example in the comment originated by the granularity&#xD;
of the services (DeleteCustomer service vs. a Customer Service that also supports&#xD;
deleting customers) is that we should be really conscious to the difference between&#xD;
other architectures like 3-tier client/server and SOA. SOA is actually more distributed&#xD;
than 3-tier - we cross a distribution boundary every time we pass a message from a&#xD;
service to a service and not just when we move a massage from a client-tier to an&#xD;
application server. We add this distribution to gain advantages in flexibility and&#xD;
agility. However, we should note that this is a weakness of SOA (considering for example,&#xD;
that Martin Fowler's &lt;a href="http://www.ddj.com/showArticle.jhtml?articleID=184414966"&gt;first&#xD;
law of distributed object design&lt;/a&gt; is" Don't distribute your objects!") means we&#xD;
should really pay attention to the way services interact with each other. &#xD;
&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
The granularity of services - having a lot of fine grained services means there will&#xD;
be a lot of interactions over the wire (even if you don't go out to the network you&#xD;
still have to serialize/deserialize, follow the security policy etc.) rather than&#xD;
internal interactions that much faster &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The Granularity of messages - The same considerations should also guide us to try&#xD;
to create larger and fewer messages. for the example above . Instead of a DeleteCustomerOrder&#xD;
message maybe something like an UpdateCustomersOrders message that can hold a list&#xD;
of customers and orders and the status changes or . by the way this would also support&#xD;
off-line clients better since they can accumulate changes. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The assumptions we can make on the other service's availability, performance, internal&#xD;
structure, the trust we have for it etc. - We should try to minimize the assumptions&#xD;
we make and concentrate on what can be inferred from the contract. Remember that policies&#xD;
can change externally so the business logic within a service cannot count on them&#xD;
being constant. this brings us back to the issue of transaction. every cross-wire&#xD;
interaction increases the chances of failure - in transactions one failure invalidates&#xD;
all the transaction is invalidate. every cross-wire interaction within a transaction&#xD;
increases the length of time we lock internal resources (even if we do trust all the&#xD;
involved parties) - especially if that transaction can extend itself automatically.&#xD;
Also as I've mentioned in the previous post the transactions also open the door for&#xD;
denial of service attacks. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
If we want to reap the benefits that are sold under the SOA moniker, like flexibility&#xD;
and agility, we really have to pay attention to this extra distribution and design&#xD;
our services differently than we would components in a 3-tier architecture - but hey,&#xD;
that's why they pay us the big bucks, right ? :) &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I should probably also add  that building SOAs is not a goal in itself. We can&#xD;
build perfectly good solutions using other architectures - but if we find that we&#xD;
do need SOA (or any other architecture for that matter) we have to pay attention to&#xD;
the way we implement it to both keep its benefits and not harm other quality attributes&#xD;
like performance, security etc.. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=4dd6c5ca-6e25-4e41-a15f-614d3793dc74"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=yGyT7lhV"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=8SGnewxH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=12LtUzsP"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=yf2iJRxu"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=yf2iJRxu" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=lMCrsdue"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=lMCrsdue" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=INYCBi5j"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,4dd6c5ca-6e25-4e41-a15f-614d3793dc74.aspx</comments>
      <category>.NET</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/04/17/CrossServiceTransactions.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=f60279fb-2b0d-41fe-b04a-203073a8c4fa</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,f60279fb-2b0d-41fe-b04a-203073a8c4fa.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,f60279fb-2b0d-41fe-b04a-203073a8c4fa.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f60279fb-2b0d-41fe-b04a-203073a8c4fa</wfw:commentRss>
      
      <title>SOA Patterns: Edge Component Pattern - updated</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,f60279fb-2b0d-41fe-b04a-203073a8c4fa.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/RgaEgOTHJzA/SOAPatternsEdgeComponentPatternUpdated.aspx</link>
      <pubDate>Thu, 22 Mar 2007 21:32:49 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I've updated the draft for the &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/EdgeComponent.pdf"&gt;Edge&#xD;
Component Pattern &lt;/a&gt;to a more legible version (thanks to Cynthia Cane my editor&#xD;
@ manning).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The Edge component pattern solves the following dilemma:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;strong&gt;How do we allow the business aspects of the service, technological concerns&#xD;
and other cross-&lt;br&gt;&#xD;
cutting concerns like security, logging etc. to evolve in their own pace and independently&#xD;
of &#xD;
&lt;br&gt;&#xD;
each other?&lt;/strong&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=f60279fb-2b0d-41fe-b04a-203073a8c4fa"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=uOtgn1H2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=QeJx8xr4"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=c7H7jBrN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=0pvjgS4K"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=0pvjgS4K" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=44WrUFAe"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=44WrUFAe" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=XD8X7wa9"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,f60279fb-2b0d-41fe-b04a-203073a8c4fa.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/03/22/SOAPatternsEdgeComponentPatternUpdated.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=8b06add2-8e25-4678-9ad1-5edc88ad9f93</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,8b06add2-8e25-4678-9ad1-5edc88ad9f93.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,8b06add2-8e25-4678-9ad1-5edc88ad9f93.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=8b06add2-8e25-4678-9ad1-5edc88ad9f93</wfw:commentRss>
      
      <title>SOA Patterns: Service Firewall pattern (and a quick status update about the book)</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,8b06add2-8e25-4678-9ad1-5edc88ad9f93.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/sxiOFsGKEeg/SOAPatternsServiceFirewallPatternAndAQuickStatusUpdateAboutTheBook.aspx</link>
      <pubDate>Fri, 16 Mar 2007 09:52:25 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I was going to try to explain why it took me so long since I've posted the last pattern&#xD;
draft on-line when I saw that a couple of my fellow Manning authors already did that.&#xD;
See Roy Osherov's "&lt;a href="http://weblogs.asp.net/rosherove/archive/2007/03/13/writing-a-book-is-like-developing-software.aspx#comments"&gt;Writing&#xD;
a book is like developing Software&lt;/a&gt;" and Fabrice Marguerie's "&lt;a href="http://linqinaction.net/blogs/main/archive/2007/03/13/my-writing-experience.aspx"&gt;My&#xD;
Writing Experience&lt;/a&gt;". I have similar experience here -there are a few commonalities&#xD;
for software writing and it seems that the counter measures of shorter iterations,&#xD;
refactorings (which I guess writers know as rephrasing) and increased inspections&#xD;
seem to work here as well. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Finally, I am back to writing new stuff and I am completing Chapter 4 now. Chapter&#xD;
4  deals with SOA security pattern, and I've decided to release the "Service&#xD;
Firewall" pattern as free draft. Note that it is a &lt;strong&gt;draft&lt;/strong&gt; and it can&#xD;
change by the time it gets to publication for example the &lt;a href="http://www.rgoarchitects.com/Files/SoaPatterns/edgecomponent.pdf"&gt;Edge&#xD;
Component&lt;/a&gt;, which I published a few months ago already went through some extensive&#xD;
rewrite (maybe I'll post the updated draft..) &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The Service Firewall helps deal with malicious "service consumers" and protect the&#xD;
services from several types of attack including for example XDoS (XML Denial of Service),&#xD;
malicious content, preventing leaking private information from the service etc. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can download the draft for  Service Firewall  pattern  from &lt;a href="http://www.rgoarchitects.com/Files/SoaPatterns/servicefirewall.pdf"&gt;here&lt;/a&gt; . &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=8b06add2-8e25-4678-9ad1-5edc88ad9f93"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=7q78SKOY"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=EjHDZOgl"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=29b3O9qe"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=R2uedEjN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=R2uedEjN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=yEr1asjU"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=yEr1asjU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=zHT7fRau"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,8b06add2-8e25-4678-9ad1-5edc88ad9f93.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/03/16/SOAPatternsServiceFirewallPatternAndAQuickStatusUpdateAboutTheBook.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=52db6aae-8acd-4b74-ae3c-c27f0aefc822</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,52db6aae-8acd-4b74-ae3c-c27f0aefc822.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,52db6aae-8acd-4b74-ae3c-c27f0aefc822.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=52db6aae-8acd-4b74-ae3c-c27f0aefc822</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Problems with SOA Vocabulary?</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,52db6aae-8acd-4b74-ae3c-c27f0aefc822.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/THYNqTPBjtg/ProblemsWithSOAVocabulary.aspx</link>
      <pubDate>Sun, 11 Feb 2007 20:25:41 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Udi &lt;a href="http://udidahan.weblogs.us/archives/375"&gt;has some comments&lt;/a&gt; on my&#xD;
SOA definition. Udi says that the definition I provided does not support  the&#xD;
notion of publish/subscribe using topics for services. My answer to this is yes and&#xD;
no :)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
First thing first, I never said (or at least I never meant to say) that contracts&#xD;
are limited to only incoming messages. Contracts contain incoming and outgoing messages.  &#xD;
I probably should have stated it more clearly though.&lt;br&gt;&#xD;
Udi says “Contract: Who owns the message type being published? The publisher or the&#xD;
subscriber? Common SOA knowledge would say that the message belongs to the contract&#xD;
of the service that receives it” &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
I don’t know who is “Common SOA knowledge”. In my opinion, this thinking is a wrong&#xD;
“even” for request/reply. The reply message belongs to the service the sends the reply&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
Regarding Endpoints – if the subscribers go to a topic as in “ServiceName\TopicName&#xD;
“ then yes I would call that an Endpoint since this is a well known address consumers&#xD;
(subscribers) go to find messages published by a service&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
Regarding consumers Udi says “ Is the publishing service “using” the subscriber when&#xD;
it publishes a message? I don’t think so, and the subscriber definitely isn’t using&#xD;
the publisher at that point either. So, we’ve got some inter-service message-based&#xD;
communication going on and it isn’t clear if we even have a service consumer. In fact,&#xD;
if all a service ever did was subscribe to some topics, and publish messages on other&#xD;
topics, it looks like we’d have very loose-coupling but be straying from the common&#xD;
SOA wisdom.”&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
Maybe that’s just semantics but I don’t see why the subscriber isn’t using the publisher-&#xD;
The publisher publishes a message on a topic this is part of its offering. The subscriber&#xD;
chooses to consume that information and maybe do some stuff with that – possibly publishing&#xD;
some other messages. That’s a “using” relationship to me.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
Nevertheless - SOA is not a synonym for "Distributed system" so there are cases when&#xD;
distributed components that communicates through messages aren’t SOA. For example&#xD;
publish/Subscribe using topics where the topics are common and shared between components&#xD;
so that multiple services can publish on the same topic does not, in my opinion, fall&#xD;
under the definition of SOA . This doesn’t say that this is a bad architecture in&#xD;
any way – but it isn’t SOA either. &#xD;
&lt;br&gt;&#xD;
As I said in the “What is SOA posts” for an architecture to be SOA you need autonomous&#xD;
components , that publish and accepts messages defined in contracts, delivered at&#xD;
an endpoint and governed by policies to service consumers – no more, but no less either.&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=52db6aae-8acd-4b74-ae3c-c27f0aefc822"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=7vOynqXU"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=b7ZNSm2N"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=vjiQEA5r"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=32al0ttC"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=32al0ttC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=AfZmeM9o"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=AfZmeM9o" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=jbhDO5XS"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,52db6aae-8acd-4b74-ae3c-c27f0aefc822.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/02/11/ProblemsWithSOAVocabulary.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=59adeef6-aa5a-4d6d-a699-3975d4688349</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,59adeef6-aa5a-4d6d-a699-3975d4688349.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,59adeef6-aa5a-4d6d-a699-3975d4688349.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=59adeef6-aa5a-4d6d-a699-3975d4688349</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>What is SOA anyway?</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,59adeef6-aa5a-4d6d-a699-3975d4688349.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/BMYFzDxcTA0/WhatIsSOAAnyway.aspx</link>
      <pubDate>Fri, 09 Feb 2007 06:50:40 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I've been talking about SOA for a while now it's finally time to (try to) properly&#xD;
define it&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I've publised this as a 5 posts on my DDJ blog and I thought it was good enough to&#xD;
be publised as a single whitepaper:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
"&lt;font face="Calibri" color="#000000" size="3"&gt;Service Oriented Architecture or SOA&#xD;
for short has been with us for quite a &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;while.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Yefim&#xD;
V. Natiz, a Gartner’s analyst, first &lt;/font&gt;&lt;a href="http://www.gartner.com/resources/114300/114358/114358.pd"&gt;&lt;font face="Calibri" size="3"&gt;talked&#xD;
about SOA back &lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;in 1996&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" color="#000000" size="3"&gt;.&#xD;
However it seems that only in the recent year or so SOA has matured enough for &lt;u&gt;real &lt;/u&gt;systems&#xD;
based on the SOA concepts to start to appear – or has it?&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;There&#xD;
is so much hype and misconceptions surrounding SOA that we first have to clear them&#xD;
all up before we can explain what SOA is – let alone identify who really uses it...."&#xD;
(&lt;a href="http://www.rgoarchitects.com/Files/SOADefined.pdf"&gt;Download full PDF (670K))&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Calibri" color="#000000" size="3"&gt;You can see additional presentations&#xD;
and papers I wrote &lt;a href="http://www.rgoarchitects.com/Papers"&gt;here&lt;/a&gt;&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=59adeef6-aa5a-4d6d-a699-3975d4688349"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=nlg0KVl6"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=TPegDDi0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=cwJ4QQxC"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=FpWOUE8P"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=FpWOUE8P" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=5yyjNgAV"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=5yyjNgAV" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=el1GeO2K"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,59adeef6-aa5a-4d6d-a699-3975d4688349.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/02/09/WhatIsSOAAnyway.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=ea83f65e-f80e-4a66-92b5-495e326cb228</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,ea83f65e-f80e-4a66-92b5-495e326cb228.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,ea83f65e-f80e-4a66-92b5-495e326cb228.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=ea83f65e-f80e-4a66-92b5-495e326cb228</wfw:commentRss>
      <slash:comments>3</slash:comments>
      
      <title>SOA and BI Impedance Mismatch </title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,ea83f65e-f80e-4a66-92b5-495e326cb228.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/40p1q-G8oZY/SOAAndBIImpedanceMismatch.aspx</link>
      <pubDate>Sun, 07 Jan 2007 23:02:07 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;!-- &lt;div class="general-text"&gt;By  Arnon Rotem-Gal-Oz --&gt;&#xD;
        &lt;!-- &lt;div class="posted"&gt;Posted: December 21, 2006 03:48 PM&lt;/div&gt; --&gt;&#xD;
        &lt;p&gt;&#xD;
[based on a few posts from my &lt;a href="http://www.ddj.com/dept/architect"&gt;DDJ blog&lt;/a&gt;]&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Implementing Business Intelligence (BI) solution on top of Service Oriented Architecture&#xD;
(SOA) is not a simple feat. A recent &lt;a href="http://www.ddj.com/dept/architect/196700985"&gt;survey&#xD;
by Ventana Research&lt;/a&gt; shows that "...only one-third of respondents reported they&#xD;
believe their internal IT personnel have the knowledge and skills to implement BI&#xD;
services.". There's a good reason for that since there an inherent impedance mismatch&#xD;
between BI and SOA which takes some effort to overcome. The purpose of this paper&#xD;
is to look to explain the problem as well as look at the possible solutions. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Service-Oriented Architecture is about autonomous loosely coupled components. These&#xD;
traits gives you lots of benefits such as greater flexibility and agility but it also&#xD;
means that services have private data. Data that you don't want to expose to the outside&#xD;
as exposing it will decrease autonomy and increase coupling. This is why services&#xD;
only expose data and processes via contracts rather then exposing their internal structure. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
That is all fine until you start to think about business intelligence. The cornerstone&#xD;
of any business intelligence initiative is gathering, collecting and consolidating&#xD;
data from all over the place. Once you have the data, you can use tools to analyze&#xD;
it, data mine it, slice, splice, aggregate, and whatnot. Traditionally BI builds on&#xD;
ETL (Extract, Transfer, Load) which goes directly to the database of the involved&#xD;
sources. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And here lies the problem: On the one hand we have services that want to keep their&#xD;
data private, and on the other we have a datamart or warehouse that wants that data&#xD;
badly. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What are our options? &#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
If you go with traditional ETL, you introduce coupling into your service. &#xD;
&lt;br&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
If you only rely on contracts that were constructed for business processes you may&#xD;
be missing out on important data. &#xD;
&lt;br&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
If you build a specific contract that exposes "all" the data you are back at the point-to-point&#xD;
integration -- solving point-to-point integration is one of the reason we want SOA&#xD;
in the first place. &#xD;
&lt;br&gt;&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
The second option seems to be the most reasonable choice of the three -- but it also&#xD;
has several problems. One problem is that the BI needs to know about all the contracts.&#xD;
The second was already mentioned -- important data might be missing. The third problem&#xD;
is that the BI system need to fetch data from the services which means it may miss&#xD;
out on data in the intervals between request. On the other hand, too frequent requests&#xD;
and you can congest your network easily as well as cause DOS on your own services. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Clearly we need a fourth option &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a id="more" name="more"&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In my opinion, the best way to tackle BI in SOA is to add publication messages into&#xD;
the contract. By "publication messages", I mean that the service will publish its&#xD;
state either in a periodic manner or per event to anyone who listening. This is a&#xD;
service communication pattern which I call "Inversion of Communications" since it&#xD;
reverse the request/reply communication style which is common for SOA. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To make the solution complete, you can add additional requests/reply or request/reaction&#xD;
messages to allow consumers to retrieve initial snapshots. Following this approach,&#xD;
you get an event stream of the changes within the service in a manner that is not&#xD;
specific for the BI. In fact, having other services react on the event stream can&#xD;
increase the overall loose coupling in the system - for instance by caching results&#xD;
of other services &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Why is this better than the other three approaches? For one , you can get a good picture&#xD;
of what happens within the service. However the contract is not specific for the BI&#xD;
and can be used by other services to cache the service state (thus increasing their&#xD;
own autonomy), for reporting (you can see an early draft of the aggregated reporting&#xD;
pattern), and for BI purposes. By working against a steady stream of events, the BI&#xD;
platforms can Analise treands, keep history and get the complete picture they need. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The approach above is sometimes referred to as &lt;a href="http://en.wikipedia.org/wiki/Event_Driven_Architecture"&gt;"Event&#xD;
Driven Architecture"&lt;/a&gt; (EDA) and while I (and others) see EDA as another facet of&#xD;
SOA, not everyone agrees. Gartner, for instance, sees EDA as another paradigm and&#xD;
SOA just for request/reply, or client/server. Recently, however, they published a&#xD;
paper that calls the approach described here as &lt;a href="http://mediaproducts.gartner.com/reprints/oracle/141940.html"&gt;"Advanced&#xD;
SOA"&lt;/a&gt;. I tend to agree more with the "advanced SOA" definition and don't see a&#xD;
contradiction with EDA and the SOA definitions. We are still using the same components&#xD;
and the same relations only adding an additional message exchange pattern into our&#xD;
toolbox. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A note on implementation: If you are implementing SOA over an ESB that is &lt;a href="http://www-128.ibm.com/developerworks/library/ws-soa-eda-esb/index.html"&gt;rather&#xD;
easy to implement&lt;/a&gt; as most ESBs support publishing events out of the box. Using&#xD;
the WS* stack of protocols, you have &lt;a href="http://docs.oasis-open.org/wsn/wsn-ws_base_notification-1.3-spec-os.pdf"&gt;WS-BaseNotification&lt;/a&gt;, &lt;a href="http://docs.oasis-open.org/wsn/wsn-ws_brokered_notification-1.3-spec-os.pdf"&gt;WS-BrokeredNotification&lt;/a&gt; and &lt;a href="http://docs.oasis-open.org/wsn/wsn-ws_topics-1.3-spec-os.pdf"&gt;WS-Topic&lt;/a&gt; set&#xD;
of standards. If you are on the REST camp, then I guess you will need to implement&#xD;
publish/subscribe by yourself. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once you have event streams on the network, The BI components grab that data scrub&#xD;
it as much as they like and push it to their datamarts and data warehouses. However,&#xD;
event steams can also enable much more complex and interesting analysis of real time&#xD;
events and real time trend data using complex event processing (&lt;a href="http://www.complexevents.com/"&gt;CEP&lt;/a&gt;)&#xD;
tools to get real-time business activity monitoring (&lt;a href="http://en.wikipedia.org/wiki/Business_activity_monitoring"&gt;BAM&lt;/a&gt;) &#xD;
&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can also get post as as a presentation down loadable from the &lt;a href="http://www.rgoarchitects.com/papers"&gt;papers&#xD;
section on my site&lt;/a&gt; or directly from &lt;a href="http://www.rgoarchitects.com/files/bi&amp;amp;soa.ppt"&gt;here&lt;/a&gt;.&#xD;
(The download is about 3MB.) &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=ea83f65e-f80e-4a66-92b5-495e326cb228"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=0Ieyv2X0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=jtY9bkXa"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=oOnvkP7V"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=GWtSTu23"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=GWtSTu23" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=NVjl0DQO"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=NVjl0DQO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=fLig0R7x"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,ea83f65e-f80e-4a66-92b5-495e326cb228.aspx</comments>
      <category>Everything</category>
      <category>General</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2007/01/07/SOAAndBIImpedanceMismatch.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=12b3a4da-bdcf-461d-b372-002b21722bba</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,12b3a4da-bdcf-461d-b372-002b21722bba.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,12b3a4da-bdcf-461d-b372-002b21722bba.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=12b3a4da-bdcf-461d-b372-002b21722bba</wfw:commentRss>
      <title>SOA Patterns - Gridable Service</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,12b3a4da-bdcf-461d-b372-002b21722bba.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/AHbKdqEzp7w/SOAPatternsGridableService.aspx</link>
      <pubDate>Fri, 15 Dec 2006 10:50:47 GMT</pubDate>
      <description>&lt;font color=#000000 size=3&gt; 
&lt;p class=body style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;font face="Times New Roman"&gt;One unique aspect of SOA vs. other architecture styles
like Object Orientation , Client/Server or even 3-Tier architecture is that it is
built for highly distributed systems. Each and every service is a sub-system in itself
it can run on its own machine and be located everywhere in the world . Many times,
the service itself needs to be distributed in its own right. One reason to use distributed
computing inside the service is computational intensive tasks. &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=body style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=body style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;font face="Times New Roman"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;One of my
recent projects was the&amp;nbsp;development of a&amp;nbsp; biometric platform.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The
platform can be used for many usage scenarios. A simple scenario is an access control
systems - e.g.&amp;nbsp;authorize entrance into a secure building or area. This is a relatively
simple scenario as you usually only have to deal with few thousands of people and
as a person requests entry she also declares who she is (e.g. using an RFID card with
her ID). In these cases you can go to the database, lookup the appropriate record
, run the biometric algorithm or algorithms and verify the person is who she says
she is. However the same platform also has to work for other, much more demanding
and computing intensive scenarios. For example consider a forensics scenario where
you have a fingerprint collected at a crime scene, in this case you don’t know who
the person you are looking for is, and you have to run your search on basically all
the database which can contain millions of records. Keep in mind that when you match
a biometric template&lt;/font&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.rgoarchitects.com/blog/EditEntry.aspx#_ftn1" name=_ftnref1&gt;&lt;span class=MsoFootnoteReference&gt;&lt;span style="mso-special-character: footnote"&gt;&lt;span class=MsoFootnoteReference&gt;&lt;span style="FONT-SIZE: 11pt; COLOR: black; FONT-FAMILY: 'Times New Roman','serif'; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-ansi-language: EN-US; mso-fareast-language: EN-US"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;font face="Times New Roman"&gt;1]
you calculate the probability of a match (based on the internal structure of the template)
and&amp;nbsp; that each template weights about a one kilobyte you quickly realize that
this can be quite a CPU intensive task.&lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=body style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;font face="Times New Roman"&gt;Sometimes when you develop you SOAs you will have algorithmic
tasks or other computational heavy tasks such as the one mentioned above and the question
is&lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;div style="mso-element: footnote-list"&gt;
&lt;/font&gt;&amp;nbsp;&gt;
&lt;p class=Pattern style="MARGIN: 0cm 0cm 0pt 36pt"&gt;
&lt;strong&gt;&lt;font face="Times New Roman" color=#000000 size=3&gt;How can a Service handle&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;computational
heavy tasks in a&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;scalable manner?&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Times New Roman" size=3&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Times New Roman" size=3&gt;You can get the full pattern from &lt;/font&gt;&lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/GridableService.pdf"&gt;&lt;font face="Times New Roman" size=3&gt;here&lt;/font&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Times New Roman" size=3&gt;[This is an early draft of one of the&amp;nbsp;Performance,
Scalability and availability&amp;nbsp;Patterns from my &lt;/font&gt;&lt;a href="http://www.rgoarchitects.com/blog/ct.ashx?id=5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5&amp;amp;url=http%3a%2f%2fwww.rgoarchitects.com%2fblog%2fPermaLink%2cguid%2c6629af8d-faa6-4d29-b8b7-9c5edeae2777.aspx" ?&gt;&lt;font face="Times New Roman" color=#003399 size=3&gt;SOA
Patterns book&lt;/font&gt;&lt;/a&gt;&lt;font face="Times New Roman" size=3&gt;]&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr align=left width="33%" size=1&gt;
&lt;div id=ftn1 style="mso-element: footnote"&gt;
&lt;p class=MsoFootnoteText style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;font face=Times size=2&gt;[1] you can think of biometric template as a signature or
a hash that represents the biometric sample. The template is smaller than the sample
but contains enough information to identify the original.&lt;/font&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p class=CALLOUT style="MARGIN: 0cm 0cm 0pt 72pt"&gt;
&lt;font face="Times New Roman" color=#000000&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=body style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;o:p&gt;
&lt;font face=Times color=#000000 size=3&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=12b3a4da-bdcf-461d-b372-002b21722bba" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=pgWWlaAk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=AUmFTL5i"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=RUuMQEp3"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=cDJjwDEO"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=cDJjwDEO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=fnmU1F4G"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=fnmU1F4G" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=fC4rTsud"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,12b3a4da-bdcf-461d-b372-002b21722bba.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2006/12/15/SOAPatternsGridableService.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=e186a866-3ac9-4a4e-9412-79b2213043af</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,e186a866-3ac9-4a4e-9412-79b2213043af.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,e186a866-3ac9-4a4e-9412-79b2213043af.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e186a866-3ac9-4a4e-9412-79b2213043af</wfw:commentRss>
      
      <title>New section - SOA Patterns</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,e186a866-3ac9-4a4e-9412-79b2213043af.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/RNUOhpk4mz0/NewSectionSOAPatterns.aspx</link>
      <pubDate>Tue, 05 Dec 2006 08:16:10 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I've added a section called &lt;a href="http://www.rgoarchitects.com/SOAPatterns"&gt;SOA&#xD;
Patterns&lt;/a&gt; on the site while holds the current draft for the table of contents of&#xD;
the SOA Patterns book I am writing. The section lists the problem each pattern addresses&#xD;
as well as links to published patterns. Also, you can  use this to monitor&#xD;
my progress (patterns that already have their problem written down already have drafts;&#xD;
the others are in-progress or not started).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I am currently working on chapter 4: Security &amp;amp; Manageability patterns (not counting&#xD;
delays mentioned in the previous &lt;a href="http://www.rgoarchitects.com/blog/PermaLink,guid,d1fe2c0c-4dfb-4559-903f-52b2e55363ad.aspx"&gt;post&lt;/a&gt;).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Also, as I think I've already mentioned, I'll make public at least one pattern per&#xD;
month, if you are interested in a specific pattern in particular (from those which&#xD;
are ready - now chapters 2&amp;amp;3) &lt;a href="mailto:soa@rgoarchitects.com"&gt;drop me a&#xD;
note &lt;/a&gt;and I'll publish the one that gets the most votes&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=e186a866-3ac9-4a4e-9412-79b2213043af"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ZChNGCMj"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=LXnMkZvV"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=5rHsrNWq"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=lWysSyaE"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=lWysSyaE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=Qua67hzv"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=Qua67hzv" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=jjvblTKH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,e186a866-3ac9-4a4e-9412-79b2213043af.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2006/12/05/NewSectionSOAPatterns.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=d1fe2c0c-4dfb-4559-903f-52b2e55363ad</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,d1fe2c0c-4dfb-4559-903f-52b2e55363ad.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,d1fe2c0c-4dfb-4559-903f-52b2e55363ad.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d1fe2c0c-4dfb-4559-903f-52b2e55363ad</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Need your help</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,d1fe2c0c-4dfb-4559-903f-52b2e55363ad.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/raH8vjBqBGI/NeedYourHelp.aspx</link>
      <pubDate>Fri, 01 Dec 2006 21:29:43 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"&gt;&#xD;
          &lt;font face="Calibri" color="#000000" size="3"&gt;My editors at &lt;a href="http://www.manning.com/"&gt;manning &lt;/a&gt;think&#xD;
that my &lt;a href="http://www.manning.com/rotem/free.html"&gt;chapter 1 &lt;/a&gt;of the SOA&#xD;
patterns book is not good enough.&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"&gt;&#xD;
          &lt;font face="Calibri" color="#000000" size="3"&gt;They basically say that the chapter&#xD;
talks about too much theory vs. the other chapters which contain much more down-to-earth&#xD;
stuff (e.g. &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/EdgeComponent.pdf"&gt;Edge&#xD;
Pattern&lt;/a&gt;, &lt;a href="http://www.rgoarchitects.com/blog/PermaLink,guid,808ce30a-dbc8-4a70-8c3c-ca4c6808acf0.aspx"&gt;Aggregated&#xD;
Reporting Pattern&lt;/a&gt;, &lt;a href="http://www.rgoarchitects.com/blog/PermaLink,guid,2c543bc9-e119-426c-8a2a-cc516b29954e.aspx"&gt;Decoupled&#xD;
Invocation Pattern &lt;/a&gt;). Also they’ve said that I spend too many pages explaining&#xD;
what architecture is or taking about distributed system before I get to SOA – which&#xD;
is the topic of the book.&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"&gt;&#xD;
          &lt;font size="3"&gt;&#xD;
            &lt;font color="#000000"&gt;&#xD;
              &lt;font face="Calibri"&gt;The way I see it, understanding&#xD;
architecture and distributed systems is essential to understanding SOA (from the development&#xD;
side i.e. when you want to design and build services). For example the discussion&#xD;
on quality attributes explains how you can use scenarios to find architectural requirements&#xD;
(and each pattern then has a section on relevant scenarios to help you find if the&#xD;
pattern is applicable to your needs)&lt;/font&gt;&#xD;
            &lt;/font&gt;&#xD;
          &lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"&gt;&#xD;
          &lt;font face="Calibri" color="#000000" size="3"&gt;I would be very interested in hearing&#xD;
what you have to say (either as comments here or emails to me) about the Chapter’s&#xD;
structure and content (considering most of the books will be patterns like the Edge&#xD;
pattern)&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"&gt;&#xD;
          &lt;font face="Calibri" color="#000000" size="3"&gt;Thanks in advance&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=d1fe2c0c-4dfb-4559-903f-52b2e55363ad"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=qj76ZjWN"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=YUzzdcsC"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=X9juCuon"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=7ePwmlz5"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=7ePwmlz5" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ZlAJJnpU"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=ZlAJJnpU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=5pjmUGuC"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,d1fe2c0c-4dfb-4559-903f-52b2e55363ad.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2006/12/01/NeedYourHelp.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5</wfw:commentRss>
      
      <title>SOA Patterns - Edge Component</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/hH2mYSjMRwk/SOAPatternsEdgeComponent.aspx</link>
      <pubDate>Wed, 15 Nov 2006 21:33:22 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p class="body" style="MARGIN: 0cm 0cm 0pt"&gt;&#xD;
The business rationale behind going on the SOA road is increasing the alignment of&#xD;
the business and IT, so we divide the business into a bunch of business services and&#xD;
everything is just fine. However the minute we start diving into the SOA implementation&#xD;
details we are swamped by a horde of technologies, cross-cutting concerns (auditing,&#xD;
security, etc.) and whatnot. &#xD;
&lt;/p&gt;&#xD;
        &lt;p class="body" style="MARGIN: 0cm 0cm 0pt"&gt;&#xD;
For example, in one project I was involved with, we implemented an SOA over a messaging&#xD;
middleware (Tibco's Rendezvous). Just when everything was fine and dandy - along came&#xD;
another project which could potentially use few of the services. Well, almost, it&#xD;
needed a slightly different contract and it also used completely different wire protocol&#xD;
- WSE 3.0 (Microsoft interim solution for the WS-* stack before Windows Communication&#xD;
Foundation). And that's just one simple example - cross cutting concerns and implementation&#xD;
details are everywhere. The question is then: &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p class="body" style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 0cm"&gt;&#xD;
          &lt;strong&gt;How can you handle cross cutting concerns like multiple technologies, protocols,&#xD;
changing policies etc. while keeping the service's focuses on its core concerns -&#xD;
i.e. the business logic.&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can get the full pattern from &lt;a href="http://www.rgoarchitects.com/Files/SOAPatterns/EdgeComponent.pdf"&gt;here&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
[This is an early draft of one of the Service Structural Patterns from my &lt;a href="http://www.rgoarchitects.com/blog/PermaLink,guid,6629af8d-faa6-4d29-b8b7-9c5edeae2777.aspx"&gt;SOA&#xD;
Patterns book&lt;/a&gt;] &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=ESVHT3ve"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=hYf4qtQM"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=FPI6jf83"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=RySWTYnd"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=RySWTYnd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=QK2hNm4Y"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=QK2hNm4Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=URa1kgVt"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,5f2dabfe-03a2-4f5d-807f-f1658d6ecdb5.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2006/11/15/SOAPatternsEdgeComponent.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=6629af8d-faa6-4d29-b8b7-9c5edeae2777</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,6629af8d-faa6-4d29-b8b7-9c5edeae2777.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,6629af8d-faa6-4d29-b8b7-9c5edeae2777.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6629af8d-faa6-4d29-b8b7-9c5edeae2777</wfw:commentRss>
      
      <title>SOA Patterns - First chapter draft </title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,6629af8d-faa6-4d29-b8b7-9c5edeae2777.aspx</guid>
      <link>http://feedproxy.google.com/~r/SOAPatterns/~3/9u4vBMgmhpY/SOAPatternsFirstChapterDraft.aspx</link>
      <pubDate>Mon, 30 Oct 2006 19:05:57 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
The draft for the first chapter of my SOA Patterns book is available on-line from &lt;a href="http://www.manning.com/"&gt;Manning&#xD;
Publications Co.&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The first chapter talks about  software architecture and the inputs&#xD;
the architect can/should use to design one (emphasizing Quality Attributes);&#xD;
Explains the challenges of distributed systems and takes a look at the SOA from an&#xD;
architectural perspective.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can download the chapter from &lt;a href="http://www.manning.com/rotem/free.html"&gt;here&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Any comments are welcome (you can also leave your comments at &lt;a href="mailto:soa@rgoarchitects.com"&gt;soa@rgoarchitects.com&lt;/a&gt;) &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=6629af8d-faa6-4d29-b8b7-9c5edeae2777"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=SxHJJOBk"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=9jnUVidt"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=hBOvoknH"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=E2y2NH2f"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=E2y2NH2f" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=NdVtKMx0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?i=NdVtKMx0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SOAPatterns?a=eOjV0LAE"&gt;&lt;img src="http://feeds.feedburner.com/~f/SOAPatterns?d=1552" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,6629af8d-faa6-4d29-b8b7-9c5edeae2777.aspx</comments>
      <category>Everything</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    <feedburner:origLink>http://www.rgoarchitects.com/nblog/2006/10/30/SOAPatternsFirstChapterDraft.aspx</feedburner:origLink></item>
  </channel>
</rss>
