TAP Implementation Issues: Final Comment: TAP and UWS, sync and async
Tom McGlynn
Thomas.A.McGlynn at nasa.gov
Fri Nov 6 10:19:56 PST 2009
Hi Guy,
You're absolutely right that what I said doesn't work!
I'll still be doing essentially what I said, but I'm taking advantage of
the fact that my Web interface is simply a wrapper around a CLI
interface, and the CLI interface isn't subject to HTTP timeouts.
[That's true for SkyView too, so I could do the same there.] So this
has been valuable for me, since it will help me build my implementation
more cleanly, but it's not going to work generally and this last
exchange was a waste of everyone else's time. Thanks for setting me
straight.
With egg on face I am respectfully yours,
Tom
Guy Rixon wrote:
> Tom,
>
> your suggested implementation has massive, inherent problems: it loses
> most of the benefits of a asynchronous interface!
>
> By depending on a synchronous HTTP endpoint to run the query, your
> implementation breaks any time that synchronous thing times out, and it
> breaks if the network connection with the synchronous thing drops. In
> those cases, your UWS has no way to regain control of the query, even if
> the DB part is still running it. The UWS has to resubmit the query.
>
> The whole point of UWS is /not / to depend on a synchronous
> HTTP-connection for long-running jobs.
>
> You can build synchronous TAP as a wrapper around a UWS (Pat D. has done
> so) but it doesn't work the other way around.
>
> Guy
>
>
> On 6 Nov 2009, at 17:33, Tom McGlynn wrote:
>
>> Hi Guy,
>>
>> I'm not sure there is a big area of disagreement here. In terms of
>> the text that users write and get back in the TAP asynchronous
>> interface I'm not suggesting a that a single byte needs to be changed.
>> It's all in what tasks are doing the processing. I've put in some
>> text that I hope clarifies what I was saying below in context.
>>
>> Tom
>>
>> Guy Rixon wrote:
>>> Tom,
>>> whenever you use UWS in a service definition, you have to say what
>>> parameters it takes when setting up a job and the work done by that
>>> job. That's the "application of the UWS pattern" to use the terms
>>> from the UWS standard.
>>
>> I'm not sure I understand this. While there is talk of JDL and such
>> in the UWS standard, I don't see any requirements that show it
>> actually being used in any way. So while a given UWS implementation
>> might restrict parameters being used, I don't see how that is done
>> within the UWS protocol itself.
>>
>>> The UWS specification is supposed to be reusable between
>>> applications; hence the U in the title. Therefore, it can't specify
>>> the application- specific parameters.
>>>
>>
>> Right. I'm not suggesting that. What I'm saying is that it's easy to
>> write a UWS that can handle any parameters -- as indeed you suggest
>> you have done already below.
>>
>>> It's possible to specify a UWS-conforming service for more than one
>>> application. CEA does this. The modern interface of this kind is
>>> called UWS-PA ("UWS for parameterized applications") and its fore-
>>> runner (which is SOAPy) is the Common Execution Connector. In these
>>> kind of services, the applications are pluggable.
>> Sounds like the kind of thing I was looking at. I suggested in the
>> original message that this has likely come up in earlier discussions.
>>
>>> AstroGrid DSA/Catalogue has had a CEC interface for years. It uses a
>>> generic CEC implementation and passes the requests through to an
>>> ADQL- query application plugged inside it.
>>> The downside of generalizing a job-control service in this way is
>>> complication and divergence from the synchronous case. TAP/UWS is
>>> quite like asynchronous TAP: you do an asynchronous query by POSTing
>>> the same parameters you could use for a synchronous query. If you
>>> try to use CEC or UWS-PA to start a TAP query then you have a
>>> different interface. Because that interface is more general, it's
>>> not as simple, either to implement in a service or to call from a
>>> client.
>> Here's where I think I'm getting a little lost. My suggestion is the
>> that I have a UWS service running above TAP that is simply a proxy for
>> the TAP synchronous service. So by definition, they could not get
>> disassociated. I'm getting the sense that for you, the UWS service
>> needs to know about the parameters it's going to pass along to
>> whatever it calls when it does a run. However, as far as I can see a
>> UWS service can be entirely agnostic about parameters. It can simply
>> take whatever parameters the user specifies and pass it along, leaving
>> it to the underlying synchronous call to handle validity. In fact,
>> for TAP that's pretty much the case since the names of the parameters
>> used in TAP are not bounded.
>>
>>
>>> I think that the current boundary between TAP and UWS is just where
>>> we need it for the simplest implementations.
>>
>> I'm not so much concerned with boundaries as in the sense in which UWS
>> is instantiated. Let me give a concrete example. I have a TAP
>> service with a base URL of http://tap/, so http://tap/sync is the
>> synchronous access point and http://tap/async is the async access point.
>>
>> What happens when someone references the later URL? In my current
>> implementation, a TAP servlet starts up, notes that I'm using an
>> asynchronous request and calls the appropriate methods and classes
>> that TAP has defined for this. If I had multiple asynchronous
>> services these would likely be in a nice little UWS library. All is
>> copacetic: UWS is a layer within TAP. It works fine but TAP and the
>> UWS layer are pretty tightly coupled.
>>
>> What I think I'm going to do when I get back from the IVOA is a bit
>> different. When I invoke http://tap/async I start a servlet whose
>> only knowledge of TAP is that there is a synchronous service at
>> http://tap/sync. It knows nothing of the internals of TAP and is
>> completely independent of it. At some point the user does a
>> http://tap/async/id/phase?phase=run and this UWS service takes the
>> parameters that the user has specified for this job and invokes the
>> http://tap/sync URL with those parameters. The results get saved
>> somehow and whenever the user sends the appropriate URL the results
>> are sent back. The only thing the UWS service ever knows about TAP
>> is the base URL. Everything else is supplied by the user.
>>
>> Why do I like this better? Well it makes the TAP code simpler. It
>> makes it easy for me to provide UWS functionality to all of my web
>> services. E.g., I'd have a UWS interface to SkyView by simply
>> changing the syncrhonous URL. And if UWS changes so that, e.g.,
>> there's now a security resource, I can plug it in without any change
>> whatsoever to my TAP servlet. For me it will be a big win.
>>
>> I'm not suggesting that this implementation be required. It would be
>> fine to keep things coupled in one TAP implementation. However if the
>> paradigm (and here I mean it in its literal sense of exemplar) is a
>> UWS service runs on top of a TAP service then the way to describe the
>> relationship between TAP and UWS changes. In particular I think it
>> then makes a lot more sense to simply say that a UWS service can be
>> used to provide asynchronous access to a TAP service. The standard
>> can require that if we decide async access is mandatory (as I think
>> we have). So the TAP document becomes simpler -- and far less tightly
>> coupled with the UWS document.
>>
>>> Cheers,
>>> Guy
>>> On 6 Nov 2009, at 15:33, Tom McGlynn wrote:
>>>> I'm sure everyone will be happy to see the word 'Final' in the title...
>>>>
>>>> In the past couple of days I've gotten the UWS asynchronous
>>>> implementation of TAP working (though doubtless still bug-ridden).
>>>>
>>>> When I read and implemented the TAP and UWS standard I had the sense
>>>> of UWS as being a layer within TAP. In retrospect I think it would
>>>> have been better (for my implementation at least), if I had
>>>> distinguished them more clearly.
>>>>
>>>> Suppose we think of UWS not as an interface layer but as the
>>>> definition of how to build an asynchronous proxies. UWS becomes a
>>>> service definition, not an access protocol. The proxy accepts and
>>>> caches input parameters from the users, starts the underlying
>>>> request when told to, caches the response and sends it back to the
>>>> user when requested. [I haven't followed the discussions of UWS
>>>> earlier in the Grid list, so my apologies if I just discovering
>>>> what everyone already knows....]
>>>>
>>>> If I think of things this way, then I can implement UWS completely
>>>> independently of the underlying application. Indeed the binding to
>>>> the underlying application could be dynamic: I can provide a UWS
>>>> layer over any number of distinct synchronous applications. I
>>>> don't need to know anything about what parameters they use, just
>>>> some root URL. The one piece of the specification that might
>>>> cause problems is the desire to support multiple outputs as well as
>>>> a single result. That's not at issue in TAP, but even this could
>>>> easily be handled by returning a list of the outputs -- which is
>>>> what UWS does now anyway.
>>>>
>>>> UWS is not described this way in its standards document: it is shown
>>>> as a layer within some bigger application, not as a separable
>>>> entity. Similarly TAP shows the asynchronous interface tightly
>>>> coupled within the rest of the TAP.
>>>>
>>>> In this new view, the TAP document would say very little about the
>>>> asynchronous interface. TAP itself would be synchronous, but if we
>>>> want asynchronous access to be mandatory then the requirement is
>>>> that a TAP implementation must specify a corresponding UWS service
>>>> through which the TAP implementation can be invoked. We could
>>>> still have a TAP service that is only available asynchronously: we
>>>> allow that this TAP service is not directly callable: Only the
>>>> associated UWS service can access it. I'm not trying to take sides
>>>> here in the sync/async wars.
>>>>
>>>> Changes to the UWS document would be rather more subtle, noting that
>>>> the interface can implemented without reference to the underlying
>>>> implementation, and perhaps explicitly supporting the kind of
>>>> dynamic association with the underlying synchronous service
>>>> mentioned above. Maybe provide a convenience resource to get the
>>>> output in the single output case (rather than having to parse the
>>>> output list).
>>>>
>>>> The advantage had we taken this approach before, is that it largely
>>>> decouples TAP and UWS. The TAP standard is shorter and simpler.
>>>> The UWS standard is largely unchanged. We can change UWS in the
>>>> future without worrying about any impact on TAP.
>>>>
>>>> This is probably a bridge too far in terms of the TAP standard. For
>>>> UWS it's really a change in tone more than content -- hints to the
>>>> user -- so perhaps it is doable were it to be thought a good idea.
>>>> Regardless, I do anticipate revising my own implementation to use
>>>> this approach after the Interop.
>>>>
>>>> Tom McGlynn
>
More information about the dal
mailing list