- From: Amelia A Lewis <alewis@tibco.com>
- Date: Fri, 09 Jan 2004 12:58:01 -0500
- To: David Booth <dbooth@w3.org>
- Cc: www-ws-desc@w3.org, Jacek Kopecky <jacek.kopecky@systinet.com>, Paul Downey <paul.downey@bt.com>
On Jan 9, 2004, at 12:06 PM, David Booth wrote:
> Does that help clarify what I meant?
Yes. But you won't like my response, I suspect.
Acknowledging that the WSDL 2+3 hack may be necessary is effectively
equivalent to suggesting that single-interface per service is broken.
Which, of course, is my position.
I think that we have a responsibility, in designing WSDL, to keep in
mind the requirements of languages that are going to use WSDL as a
building block. In fact, I believe that most of the arguments for
single-interface per service were of precisely this category.
Given single-interface per service, a web services registry/catalog API
can have expect to create certain APIs (note that I'm being broader
than UDDI/ebXML registry here, because I know of at least one other
product that can act in this function, and because I am doubtful that
either of those high-profile APIs are particularly mature, at this
point).
In the following, I'm going to use type(qname) syntax to indicate WSDL
components. So, interface(foo:bar) indicates the interface with
attribute bar in a WSDL with a targetNamespace attribute associated
with prefix foo. Otherwise, I'm going to use a rather chatty
pseudocode format.
User: give me service(*:*) implementing interface(foo:bar). API is
designed to return a list/collection/array, since this is known to be
likely to have multiple hits.
Registry: joe:service, fred:service, erik:service
User: [chooses fred:service, based on some heuristic or at random] give
me endpoints for service(joe:service). Again, the API expects and thus
permits multiple returns (you can guess where I'm going with this
already, no?).
Registry: endpointA location=http://fred/service, endpointB
location=http://fred/service/mgt
User: [has an oddity to cope with: service shows two endpoints on a
single server, which is odd, but maybe doesn't notice, and has (some
percentage) chance of choosing endpointB] constructs message for
interface(foo:bar) and sends it to endpointB.
Service: fault: operation not supported
User: Huh?
Suppose that this becomes widespread. The API is already frozen, so we
can't supply a parameter to the registry in our endpoint request (give
me endpoints for service(joe:service) implementing interface(foo:bar)).
So the user tries to verify before use.
User: give me interface(*:*) implemented by service(joe:service)
Registry (option 1): fault: invalid state. This happens if the
registry permits multiple registries, but is trained to return a single
interface when asked what interface a service implements.
Registry (option 2): foo:bar, foo:baz. This happens after reports of
problems. The registry adjusts the API to return a list. If this can
happen, though, then the registry API can change to allow an interface
parameter to be passed together with the request for endpoints. In
other words, the registry ignores the WSDL requirement that each
service implement a single interface.
Registry (option 3): fault: no service(joe:service) known. This
happens after reports of problems with option 1, when the registry
decides to do validation of attempted registries. It now detects the
conflict, and following the direction indicated in the WSDL
specification, it does not permit a single service to implement
multiple interfaces.
In short: the WSD WG and the current WSDL specification are not
currently "neutral" on the issue of the WSDL 2+3 hack. The
specification, by requiring a single interface per service, offers that
as a guideline (perhaps one could argue it is a guarantee?) to
languages building on top of it. An indication in the tutorial which
is tantamount to "oh, we didn't really mean it; here's a workaround
that allows you to use the name of the service as a means of relating
disparate interfaces to one another" is effectively undermining the
single-interface per service requirement. Any processor which may have
to deal with more than one WSDL at a time must, in effect, ignore the
single-interface per service requirement. OR it must implement that
restriction. By pointing out how it is possible to work around the
restriction, we are effectively encouraging the creation of two
mutually non-interoperable domains for service descriptions. In one
domain, single-interface per service is checked only within a single
WSDL (and its imports). It is, in short, useless for the purpose which
I understood it to be created: to allow service discovery and
categorization. In the other, it remains useful for service discovery,
because when a service attempts to register itself with multiple
interfaces by the mechanism of splitting itself into multiple
deployment WSDLs, it is rejected (in fact, interop in this area is
further fragmented, because some are likely to drop the service
altogether for invalidity, while others will refuse to accept the
second registry, and still others will regard the second registry as
replacing the first).
If other groups (did this solution originate in the architecture
group?) need a way of associating endpoints implementing different
interfaces with one another, because their conception of a service
permits multiple interfaces, then we need to either question our
restriction, or we need to introduce a means of creating this
association.
<association>
<serviceReference name="qname" role="qname" />{2,}
</association>
association might need to have a name attribute as well; it effectively
becomes the equivalent of a WSDL 1.1 service (or the wider conception
of a web service that includes endpoints implementing multiple
interfaces). This would permit the single interface restriction to
remain, while creating a means for developers to say "these things go
together, okay?" (the role attribute is questionable, actually; where
is it defined? But maybe it wouldn't be necessary?)
Amy!
Received on Friday, 9 January 2004 13:00:25 UTC