In the past months I’ve been throwing ideas back and forth with some of my friends and we’re slowly realizing that “Service Oriented Architecture” doesn’t really exist.

The term “Service Oriented Architecture” implies that there is something special about architecture when it comes to service orientation, Web services, XML, loose coupling and all the wonderful blessings of the past 5 years in this wave. But if you look at it, there really isn’t much special about the good, old, proven architectural principles once you throw services into the picture.

I’ll try to explain what I mean. There are five pillars of software architecture (this deserves more elaboration, but I will keep it short for now):

·        Edges: Everything that talks about how the network edge of a software system is shaped, designed, and implemented. SOAP, WSDL, WS-*, IIOP, RMI, DCOM are at home here, along with API and message design and ideas about coupling, versioning, and interoperability.

·        Protocols: Which information do you exchange between two layers of a system or between systems and how is that communication shaped? What are the communication patterns, what are the rules of communication? There are low-level protocols that are technically motivated, there are high-level protocols that are about punting business documents around. Whether you render a security token as a binary thing in DCOM or as an angle brackets thing is an edge concern. The fact that you do and when and in which context is a protocol thing. Each protocol can theoretically be implemented on any type of edge. If you were completely insane, you could implement TCP on top of SOAP and WS-Addressing and some other transport.

·        Runtimes: How do you implement a protocol? You pick an appropriate runtime, existing class or function libraries, and a programming language. That’s an architectural decision, really. There are good reasons why people pick C#, Java, Visual Basic, or FORTRAN, and not all of them are purely technical. Technically, the choice of a runtime and language is orthogonal to the choice of a protocol and the edge technology/design. That’s why I list it as another pillar. You could choose to do everything in Itanium assembly language and start from scratch. Theoretically, nothing stops you from doing that, it’s just not very pragmatic.

·        Control Flow: For a protocol to work and really for any program to work, you need concepts like uni- and bidirectional communication and their flavors such as datagrams, sockets, and queues, which support communication styles such as monologues, dialogues, multicast, or broadcast. You need to ideas like parallelization and synchronization, and iterations and sequences. All of these are abstract ideas. You can implement those on any runtime. They are not dependent on a special edge. They support protocols, but don’t require them. Another pillar.

·        State: This is why we write software (most of it, at least). We write software to transform a system from one state to the next. Press the trigger button and a monster in Halo turns into a meatloaf, and you score. Send a message to a banking system and $100.000 change owners. Keeping track of state, keeping it isolated, current, and consistent or things to consider. Is it ok to have it far away or do you need it close by? Do you cache, and replicate it for the purpose? Is it reference data or business data? Consolidated, preprocessed, or raw? How many concurrent clients have access to the data and how do you deal with the concurrency? All these are questions that have to do with state, and only state. None of this is depends on having a special technology that is being talked through way up above at the edge.

Service orientation only speaks about the edge. Its tenets are about loose coupling, about independent evolution and versioning of contracts, and about technology-agnostic metadata exchange. All this is important to make systems interoperate better and to create systems where the effects of changes to one of its parts to any other part are minimized.

But none of the SO tenets really speaks about architecture [Sidenote: The “autonomy” is about autonomous development teams and not about autonomous computing]. When you look at what’s being advertised as “serviced oriented architecture”, you see either the marketing-glorified repackaging of Ethernet, TCP/IP, and LDAP (“Enterprise Service Bus”), or architectural blueprints that looks strikingly similar to things that people have been doing for a long time with DCE, CORBA, J2EE, COM, or mainframe technologies. What’s different now is that it is easier, cheaper and likely more productive to create bridges between systems. And even that comes at a significant price at this point. Realistically, the (web) services stacks yet have to catch up with these “proprietary” stacks in terms of reliability, security, and performance.

There is Service Orientation – and that’s good. There is appropriate architecture for a problem solution – and that’s good too. These are two things. Combining the two is excellent. But “Service Oriented Architecture” is not an isolated practice. I’ve started to use “SO/A” to make clear that I mean architecture that benefits from service orientation.

I understand that there is an additional architectural tier of “service orientation” that sits at the business/technology boundary. On that meta-level, there could indeed be something like “service oriented architecture” along the lines of the service convergence that Rafal, Pat and myself were discussing on stage at TechEd Europe last year. But when I see or hear SOA discussed, people speak mostly about technology and software architecture. In that context, selling “SOA” as a completely new software architecture school does not (no longer) make sense to me.

Or am I missing something?

Wednesday, May 04, 2005 5:34:44 PM UTC
Very nice post. Terms like architecture and design are broad topics. To me, SOA is a set of architectural patterns and best practices. In the same way that layering an application is an architectural pattern/practice, I consider adding a service layer as another pattern.

We can look at SOA from two architectural aspects: Application/Solution Architecture and Enterprise Architecture.

In the context of an application, SOA is talking about the application opting in to publish an explicit list of services. To me this has an impact on the design, for example it is telling me that I shouldn’t publish all of my classes to the whole world by marking them as ‘public’ (one could argue that this is a design issue but I think we are learning from the experiences like COM). It is also telling me that I don’t have to invest too much on designing reusable classes (to other applications) as my class won’t be accessible from other applications anyway.

In the context of enterprise architecture, it has an impact on cross-cutting features like transactions, security, etc. For example we need to change our expectation level as we may not get a two-phase commit feature when using SOA, or we may not be able to share security context and hence use Single Sign-On. So again we need a set of best practices and patterns when designing and architecting a service-oriented enterprise.

What do you think?
Wednesday, May 04, 2005 7:06:21 PM UTC
Great post but I struggled with this trying to understand this completely. I'm not convinced that any architecture really exists in the true sense of the word.

I can accept the premise that sound architecture principles and approaches should be applied regardless of the "orientation" of your architecture. However, I think something may be missing here by looking at this from too narrow a build and technology focus. In my mind, SOA implies that you have rebalanced the forces that act on the set of good architecture principles (remember that principles exist in dynamic tension) to ensure that your business/technology boundary is SO.

Indeed at the lower levels of the architecture stack the base concepts of SO have been around as good practices for years. However, we as an industry haven't been applying these base concepts consistently or properly across solutions so it's somewhat academic. If calling them SOA means that people now pay attention to them and somehow feel better about using them, then that's reason enough for me to accept that SOA exists.

I agree with the last paragraph, a lot of people use "SOA" as a label for the engineering componenets of "SO" that you talk about. SOA is not really about that.
Friday, May 06, 2005 11:25:47 PM UTC
I would tend to agree that there is no one single Service Oriented Architecture -- rather, there are many Service Oriented architectural styles. Based on the comments made in your post do you think it is appropriate to say that REST is an architectural style that is based on Service Orientation? And, is it possible that what people have been referring to as SOA (namely the use of a service bureau in discovering/coordinating services) is another architectural style that is based on Service Orientation -- if so, does that architecural style just need a better name?
Monday, May 09, 2005 9:38:14 PM UTC
http://www.from9till2.com/PermaLink.aspx?guid=2354684e-5c70-4e69-b711-5097be3b57af
Monday, May 16, 2005 11:45:27 AM UTC
Clemens, I feel uncomfortable with your description of the five pillars of software architecture. I think that you are mixing two differents level of abstraction. I suggest that you divide the 5 pillars in two groups. The first group are the well known 'layering principles' for organizing distributed software applications:

1. Edges: Everything that talks about how the LAYER edge of a software system. This is the public interface of the layer. The best practices being to assume an idiot will use your interface and design it accordingly.
2. Protocols: Which information do you exchange between layers of a system and how is that communication shaped? Protocols tend to pass data around.
3. Layers: The behaviour (state-machine) that is implemented using RUNTIME, CONTROL FLOW and STATE. Layers provide services. The services are described using protocols and edges. Layer are logical representation of state-machine. They are not equivalent to tier which are a physical infrastructure. Multiple layers can run on a physical tier.

This is what I understand as being Service Oriented Architecture (SOA). Is it a new architecture paradigm. No. This is why I think a better name should be Service Oriented Programming (SOP).

The second group which contain RUNTIME, CONTROL FLOW and STATE is the layer implementation. At this time the best practices is to use Object Oriented Programming (OOP) to implement the layer behaviour.

Having said that, why is it so difficult to have a clear definition for SOP? Mostly because the only experience that we have so far with distributed programming is to try to apply OOP concept. Result so far prove that this approach can work but not on a large scale system that require deep asynchronous orchestration. OOP presume that collaboration between objects will be done synchronously. This is where SOP is totally different than OOP. SOP presume that collaboration between layers will be done asynchronously.

Clemens, I will be at TechEd 2005 as one of the staff for the ARCHITECTURE track cabana. I will be happy to discuss further about the five pillars of software architecture.
Saturday, May 21, 2005 4:44:10 AM UTC
Great post that hopefully starts people to realise that SOA is something that exists already for a long time. Only with different technology. There numerous large companies that have a message bus system like tibco or MQ for integrating systems. Proven, very scalable and reliable by the way. Also your email server is already a service, not based on soap but pop3 and smtp. In my opinion SOA is not something related to SOAP and webservices but rather a concept for offering/sharing functionality with other systems.
Leendert Versluijs
Wednesday, July 13, 2005 12:26:33 AM UTC
Some problems I experience with SOA:
1. SOA is the reinvented dll hell. Not only as consumer you are stuck, but also as provider.
2. SOA lacks the ability to provide a gui (they will be created over and over again).
3. The contract (often XSD) a not able to contain business rules, there is no alternative but copying businessrules from service to gui (over and over again). The business rules go beyond the reach of the owner.
4. If you don't want to embed too much knowledge of the service, it's very hard to create a good user (gui) experience with complex services

So, SOA components are only usable for very stable parts of you system otherwise it is somekind of virus (a service has dependencies everywhere) and any change will be killing.
Colin
Wednesday, July 27, 2005 10:59:23 AM UTC
yup - quality distributed systems are quality distributed systems, does the technology stack focus of 'soa' not hinder the adoption of its broader principles?
Thursday, September 01, 2005 1:51:55 AM UTC
Come try our site!
Comments are closed.