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

screen shot 2017-10-26 at 15 55 19

You can also use asynchronous calls with a callback URL

screen shot 2017-10-26 at 15 55 06

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.

Function watchdog reference