Guide on Asynchronous processing¶
Asynchronous function calls can be queued up using the following route:
$ curl --data "message" http://gateway:8080/async-function/{function_name}
Summary of modes for calling functions via API Gateway:
Mode | Method | URL | Body | Headers | Query string |
---|---|---|---|---|---|
Synchronous | POST | http://gateway:8080/function/{function_name} | Yes | Yes | Yes |
Synchronous | GET | http://gateway:8080/function/{function_name} | Yes | Yes | Yes |
Asynchronous | POST | http://gateway:8080/async-function/{function_name} | Yes | Yes | Yes #369 |
Asynchronous | GET | Not supported | - | - | - |
Note: This work was originally carried out under PR #131.
Logical flow for synchronous functions:
Why use Asynchronous processing?¶
-
Enable longer time-outs
-
Process work whenever resources are available rather than immediately
-
Consume a large batch of work within a few seconds and let it process at its own pace
How does async work?¶
Here is a conceptual diagram
You can also use asynchronous calls with a callback URL
The reference implementation for asychronous processing uses NATS Streaming, but you are free to extend OpenFaaS and write your own queue-worker.
The asynchronous stack is now built-in by default. Previously it was an optional configuration.
Call a function¶
Functions do not need to be modified to work asynchronously, just use this alternate route:
http://gateway:8080/async-function/{function_name}
If you want the function to call another function or a different endpoint when it is finished then pass the X-Callback-Url
header. This is optional.
$ curl http://gateway:8080/async-function/{function_name} --data-binary @sample.json -H "X-Callback-Url: http://gateway:8080/function/send2slack"
You can also use the following site to setup a public endpoint for testing HTTP callbacks: requestb.in
Extend function timeouts¶
Functions have three timeouts configurable by environmental variables expressed in seconds:
HTTP:
- read_timeout
- write_timeout
Hard timeout:
- exec_timeout
To make use of these just add them to your Dockerfile when needed as ENV variables.