14.2.4. Long-running API requests
Some HTTP API requests to NextGIS Web, such as raster layer creation, need
processing a lot of data. Thus, they may require some time to proceed. But HTTP
isn’t designed to handle requests which last for minutes or hours. The
lunkwill
extension helps to cope with this kind of requests.
The extension acts as a proxy between an uWSGI application and a client and
allows to avoid long-lasting connections while a request proceeds. It requires
the proprietary lunkwill
add-on which integrates into uWSGI stack as a
sidecar mule.
A typical conversation with lunkwill
extension enabled looks like the
following:
> POST /api/resource/
> X-Lunkwill: suggest
>
> (JSON payload)
< 201 Created
< Content-Type: application/vnd.lunkwill.request-summary+json; charset=utf-8
<
< {
< "id": "92f6317d-c2e9-4c47-a6dd-b87898d9f8f4",
< "status": "processing",
< "delay_ms": 50,
< "retry_ms": 2000
< }
The client adds X-Lunkwill
HTTP header with suggest
value, which
indicates that the client supports the extension. The extension intercepts
requests with the header and returns its ID and status with the specific
MIME-type application/vnd.lunkwill.request-summary+json
. If there’s no
lunkwill
extension, the header will be ignored and the request will be
processed as usual.
Then the client should ask for a request summary in delay_ms
microseconds
and the server will return the current status. And repeat until status changes.
If there aren’t such summary requests, the server will eventually cancel the
request.
> GET /api/lunkwill/92f6317d-c2e9-4c47-a6dd-b87898d9f8f4/summary
< 200 OK
< Content-Type: application/vnd.lunkwill.request-summary+json; charset=utf-8
<
< {
< "id": "92f6317d-c2e9-4c47-a6dd-b87898d9f8f4",
< "status": "processing",
< "delay_ms": 200,
< "retry_ms": 2000
< }
Besides delay_ms
attribute, the server advertises retry_ms
attribute
which should be used as a retry delay if a summary request fails (network
connectivity problems etc.).
As the request completes, it’ll have ready
status:
> GET /api/lunkwill/92f6317d-c2e9-4c47-a6dd-b87898d9f8f4/summary
< 200 OK
< Content-Type: application/vnd.lunkwill.request-summary+json; charset=utf-8
<
< {
< "id": "92f6317d-c2e9-4c47-a6dd-b87898d9f8f4",
< "status": "ready",
< "delay_ms": 4000,
< "retry_ms": 2000
< }
After that the client must request the response:
> GET /api/lunkwill/92f6317d-c2e9-4c47-a6dd-b87898d9f8f4/response
< 201 OK
< Content-Type: application/json
<
< {
< "id": 82,
< "parent": {
< "id": 0
< }
< }
This response matches the original NextGIS Web response as if it was processed
without lunkwill
extension.