New-age Transactional Systems - Not Your Grandpa's OLTP
John Hugg discusses high volume transaction processing applications with high and low frequency profiles, and how VoltDB can be used for that purpose.
The content has been bookmarked!
There was an error bookmarking this content! Please retry.
Posted by Boris Lublinsky on Jun 17, 2009
W3C has just released W3C Candidate Recommendation SOAP over Java Message Service 1.0 which specifies how SOAP (both SOAP 1.1 and SOAP 1.2) should bind to a messaging system that supports the Java Message Service (JMS). The main purpose of this recommendation:
... is to ensure interoperability between the implementations of different Web services vendors. It should also enable customers to implement their own Web services for part of their infrastructure, and to have this interoperate with vendor provided Web services.
The specification consists of two major parts: SOAP/JMS underlying protocol binding - required by conformant implementations - and WSDL (both 1.1 and 2.0) usage for SOAP/JMS binding - optional for conformant implementations.
SOAP Underlying Transport Binding defines the rules by which SOAP messages are sent and received using the Java Message Service. SOAP/JMS underlying protocol binding covers which JMS features/properties are "visible" at the SOAP format level and which JMS calls have to be made to support them, the message content, including how properties and headers, such as priority, soapAction and targetService, should be handled, and connecting details to the JMS service.
The specification generalizes the connection to a service destination through the soapjms:lookupVariant, which specifies the technique used for looking up the given destination name. The only lookupVariant required by the specification is JNDI-based - jms-variant: jndi. The rest of the connection properties - soapjms:destinationName, soapjms:jndiConnectionFactoryName, soapjms:jndiInitialContextFactory, soapjms:jndiURL and soapjms:jndiContextParameterType - are there to support JNDI-based lookupVariant. In the case of non-JNDI lookup, it is up to the implementer to do the appropriate mapping.
The specification also introduces a set of SOAP parameters, allowing to expose JMS-specific message headers. This includes soapjms:deliveryMode, soapjms:timeToLive, soapjms:priority, soapjms:replyToName and soapjms:topicReplyToName. The last two seem to be completely out of place because they belong to WS-Addressing not the base SOAP definition.
Additional flexibility is provided by defining SOAP specific JMS message properties:
The specification also discusses JMS message types, security concerns and message exchange patterns.
The second section of the specification describes how WSDL can be used to indicate the use and control the operation of JMS binding.
In the case of WSDL 1.1, the specification defines the following extensions:
- The transport attribute of the wsdl11soap11:binding element gets a new URL reflecting a JMS transport.
- Allows use of SOAPAction header, even though it is explicitly disallowed by WSDL specification.
- Defines how to set various properties to control the behavior (connection parameters, runtime setting) of the binding.
- Locates the service using a JMS URI.
And in the case of WSDL 2.0 the extensions are as following:
- The wsoap:protocol attribute of the binding element gets a new URL reflecting a JMS transport.
- Defines how to set various properties to control the behavior (connection parameters, runtime setting) of the binding.
- Locates the service using a JMS URI.
Although SOAP over HTTP allows for interoperable messaging implementations, in many mission-critical systems that need to achieve zero down time and zero data loss, messaging can be a more appropriate underlying transportation support. As a result, many Web Services implementations, in both Java and .NET, provide proprietary support for SOAP over messaging. From this point of view, a specification for SOAP binding to messaging was long overdue.
On another hand, the specification for mapping SOAP to JMS does not seem to provide a solution to the specification’s goal "... ensure interoperability between the implementations of different Web services vendors". First of all, it binds SOAP to JMS, which alone leaves out .NET and/or mainframe implementations. Also, it ties SOAP to JNDI, which can create interoperability issues even within a single enterprise - typically multiple different application server clusters have their own JNDIs. Finally, unless Advanced Message Queuing Protocol (AMQP) is used, there is no on the wire interoperability between messaging implementations from different vendors.
i find this spec in a few ways out-of-sync with reality (and some of these issues have also been mentioned in the original posting):
- it essentially (only) standardises the interface between a webservice stack and a JMS provider
- making the WSDL binding optional is a weird decision, as this is the most visible impact of the spec: a way to write portable WSDLs that define SOAP/JMS endpoints
- it is ridiculously late: everyone needing a reliable SOAP transport has long used the numerous vendor-specific implementations of SOAP/JMS
- and then again it's the upstream specs that are even later: there is yet no standard way in Java (i.e. via JAX-WS) to expose or consume SOAP/JMS webservices.
cheers,
gerald
www.gerald-loeffler.net
For request/response pattern, I can't see anything in this spec which talks about how Service implementations indicate that if a problem occurs in the processing a request, whether they want the message de-queue operation to still be acknowledged and a fault sent to the response queue or whether they actually don't want the de-queue to NOT be ack'd and have the request message put back on the request queue for subsequent re-delivery (eg. because of a temporary downstream system glitch). I guess this is related to Gerald's point in that the spec doesn't address the programming model for implementing SOAP-JMS providers and consumers? Paul Done
John Hugg discusses high volume transaction processing applications with high and low frequency profiles, and how VoltDB can be used for that purpose.
Kevlin Henney examines code samples to see what can be learned from them starting from the premise that one won’t write great code unless he knows how to read it.
Jason Ayers share the observations he made watching a team of developers collaborating in real time on the same code base, pushing XP, pair programming and continuous integration to their extremes.
Michael Snoyman presents Yesod, a web framework written in Haskell and containing a web server, templating, ORM, libraries (templating, gravatar, etc.).
Richard Kreuter and Kyle Banker on how to avoid classical RDBMS transactional systems by using compensation mechanisms, transactional messaging or transactional procedures.
Attila Szegedi talks about performance tuning Java and Scala programs at Twitter: how to approach GC problems, the importance of asynchronous I/O, when to use MySQL/Cassandra/Redis, and much more.
One category of risk that project teams need to ensure they address is business value failure – delivering a product that fails to provide value for the business investor.
InfoQ spoke to the authors of Software Systems Architecture on a couple of new topics, the System Context viewpoint and Agile, which have been added to the second edition.
2 comments
Watch Thread Reply