Hi,

   Here is the humble experience of our team ; we have been exposing a
bunch of web services for about two years :

* SOAP and REST services are versionned via
  ** the endpoint url : sample
http://mycompany.com/services/UserProfileService/1.0/
  ** the namespace of XML entities  : sample
http://mycompany.com/userprofile/v1_0/
  ** SOAP action : sample http://mycompany.com/userprofile/v1_0/get

* Even if many famous XML APIs (Amazon, Google, etc) use date
versioning (e.g. 2009-04-03), we are happy with number versioning (
e.g. 2.3 ) because :
  ** it is easier to remember a number than a date.
  ** number versioning is self explanatory. We use minor version
change when we add elements, enumerated values, etc ; we use major
version change for data structure refactoring. Minor changes can most
of the time be applied with simple package name renaming in the
consumer code.

* We versioned namespaces with "_" instead of "." because a while ago,
CXF wsdl2java tool truncated the package name after the first point.
Not sure it is still the case, we should have proposed a patch, shame
on us :-)

* We initially tried to have different version life cycles for sub
schemas of our data structures (user v2.3 aggregates user.webprofile
v1.0 + user.cellphoneprofile v1.6, etc) but it has not proven to be
efficient for our reality because :
  ** we did not reuse a XSD for anything else than our web service
(i.e. one XSD is used by exactly one WSDL)
  ** consumers were confused when they upgraded minor versions. We
could not say "search and replace all the packages x.y.z.1_0 by
x.y.z.1_1" ; instead, we had to say "change this package to ... and
this package to and this other package to ..." :-(

* We never used routing relying on "SOAP action" nor on "XML
namespace" ; all the routing is done on the endpoint URL.

* On the server side, we implemented service business logic versioning with :
   ** business logic located in the implementation of the latest
version of the service
   ** java bean to java bean mapping to adapt to older versions of a
given service
   ** mapping frameworks like Dozer have not proven to be useful, we
now prefer hand coded mapping (
'userV13.setLastName(userV21.getLastName()) ...' ).

* We failed to remove old versions of the services, our consumers did
not upgrade. It causes a bit more work on the provider side but less
on the consumer side. Even if some will say SOA heresy, is it that bad
? Consumers are quite happy with it :-)

* OK, we admit it, we don't know who are our consumers, especially for
REST services authenticated by internet users credentials. Still a SOA
heresy but still the sign that some consumers feel our services are
useful :-)

* We use per operation and per version JMX monitoring. It tells us
prehistoric versions are still very famous :-)

*  According to Hyperic HQ, we have 8.000 requests per minute and per
server on our web WS application without major issues ; bean to bean
mapping processing is very cheap, we never see it when we generate
thread dump with the great jstack tool.

* URL based versioning helps to get monitoring and audit with simple
greps on access logs.

   We hope this feedback helps,

   Michael and Cyrille

--
Michael Figuière mfigui...@xebia.fr
Cyrille Le Clerc clecl...@xebia.fr


On Mon, Dec 14, 2009 at 12:41 PM, Sergey Beryozkin
<sbery...@progress.com> wrote:
>
> Hi,
>
> Apologies for a late reply, I was planning to reply for a while :-)
> As far as approaches toward versioning SOAP services are concerned, see [1] 
> which Oliver also referenced in the other email and which is being used in 
> production and also check [2] for some general information.
> [3] captures some good advice on how to deal with versioing restful services, 
> some of it may apply to SOAP services too.
>
> It is also may make sense to explicitly require or at least recommend the 
> consumers to ignore unrecognized tags, provided that the breaking change is 
> signalled by a namespace change. It may let you avoid the 'noise' (frequent 
> namespace change) when the schemas get updated with the tags which don't 
> affect the existing consumers, example, an element called "book" has a new 
> element "category" added which should not affect the consumers knowing about 
> the book/name only. This is called a forward compatibility. See Versioning in 
> [4] for example (though Web3s is defunct now at least publicly).
>
> Likewise, a service provider should typically ensure a backward 
> compatibility, that is newer services should continue accept the requests 
> from older clients.
>
> For the same reason (that is, to avoid the 'noise' but at the code level), 
> I'd recommend just to have a single complex type in every resource method 
> signature on input/output. If the policy is to ensure the code gets changed 
> even with a minor update then you can 'enforce' the failure at runtime by 
> enabling the strict schema validation.
>
> It much depends on what exactly you would like to achieve. In the end of the 
> day you can always count on CXF :-) in that it offers a numebr of options for 
> having a single class servicing multiple clients, see [5] for some info. 
> Example, you can use XML stream readers/writers for both JAXRS and JAXRS 
> services and utilize multiple jaxws: and jaxrs: endpoints referncing the same 
> bean but using different readers/writers or filters or (jaxb) provider 
> instances, etc
>
> hope it helps, Sergey
>
> [1] http://blogs.iona.com/sos/20070410-WSDL-Versioning-Best-Practise.pdf
> [2] http://www.w3.org/TR/2007/REC-wsdl20-primer-20070626/#adv-versioning
> [3] 
> http://www.25hoursaday.com/weblog/2007/05/08/RESTWebPlatformsAndVersioning.aspx
> [4] http://dev.live.com/livedata/web3s.htm#_Toc165288982
> [5] 
> http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-CustomizingJAXBXMLandJSONinputandoutput
>
> ----- Original Message ----- From: "Pydipati, Karuna" <kpydip...@stubhub.com>
> To: <users@cxf.apache.org>
> Sent: Thursday, December 03, 2009 6:56 PM
> Subject: Versioning of web services?
>
>
> Is there any good strategies out there to do versioning of web services?
> Does CXF recommends/supports any such versioning strategies? Is there
> any difference in versioning between REST versus SOAP services? Also, if
> I am doing a *dual* publishing (publishing SOAP and REST from same
> interface methods), how to achieve versioning of SOAP/REST concurrently?
> Any documentation on CXF site? Thanks in advance.
>
>
> Regards
>
> Karuna Pydipati
>
> StubHub/eBay - Platform & Services
>
> Phone: (415)222-8752
>
> Email: kpydip...@ebay.com <mailto:kpydip...@ebay.com>
>
>
>
>
>

Reply via email to