You can now evaluate asynchronous functions with FaaS backed by the NATS Streaming server.
- Checkout the branch and build the image: functions/gateway:latest-dev
$ git clone https://github.com/alexellis/faas
$ git checkout update_async
Optionally also build the branch:
$ ./build.sh
- Deploy the stack
$ docker stack rm func
$ ./deploy_extended.sh
You'll now see the familiar gateway at http://localhost:8080
Next check the health of the functions - make sure they all have at least 1 replica running
$ docker service ls
Next invoke one of the functions in the sample stack:
$ curl localhost:8080/function/func_markdown/ -d "## Testing"
<h2>Testing</h2>
The response will be returned to the terminal
- Now invoke it asynchronously:
$ curl -v localhost:8080/async-function/func_markdown/ -d "## Testing"
< HTTP/1.1 202 Accepted
You won't see a response here - just a status 202 to say that the gateway accepted your request.
To try out any of the other functions you can replace "function" in the route with "async-function".
- Check the logs of the queue worker
$ docker service logs -f func_queue-worker
func_queue-worker.1.s23hrotlqllx@moby | Listening on [faas-request], clientID=[faas-worker-e2534c0ea217], qgroup=[faas] durable=[]
func_queue-worker.1.s23hrotlqllx@moby | [#1] Received on [faas-request]: 'sequence:1 subject:"faas-request" data:"{\"Header\":{\"Accept\":[\"*/*\"],\"Content-Length\":[\"10\"],\"Content-Type\":[\"application/x-www-form-urlencoded\"],\"User-Agent\":[\"curl/7.43.0\"]},\"Body\":\"IyMgVGVzdGluZw==\",\"Method\":\"POST\",\"CallbackURL\":{\"Scheme\":\"\",\"Opaque\":\"\",\"User\":null,\"Host\":\"\",\"Path\":\"\",\"RawPath\":\"\",\"ForceQuery\":false,\"RawQuery\":\"\",\"Fragment\":\"\"},\"QueryString\":\"\",\"Function\":\"func_markdown\"}" timestamp:1499942388625813443 '
func_queue-worker.1.s23hrotlqllx@moby | Request for func_markdown.
func_queue-worker.1.s23hrotlqllx@moby | <h2>Testing</h2>
func_queue-worker.1.s23hrotlqllx@moby |
func_queue-worker.1.s23hrotlqllx@moby |
func_queue-worker.1.s23hrotlqllx@moby | 200 OK <nil>
You should see the request and response from your calls appearing above.
- Provide a callback-URL
Now head over to https://requestb.in and create a new request bin.
Recall your earlier curl statement, and modify it to pass an additional header:
$ curl -v localhost:8080/async-function/func_hubstats/ -d "alexellis2" -H "X-Callback-Url: https://requestb.in/1e1vqgd1"
Now refresh your Request Bin page. You should see that FaaS called into it after completing the task.
- Scale the queue-worker
$ docker service scale func_queue-worker=3
Now use a loop to invoke the function - passing in an integer each time so we can easily identify the request.
You will see that each request is picked up by a separate worker in a round-robbin fashion.
$ for i in {0..20} ; do echo $i && curl localhost:8080/async-function/func_markdown/ -d $i ; done
Check the logs again:
func_queue-worker.3.u0egkphip73n@moby | <p>2</p>
func_queue-worker.1.s23hrotlqllx@moby | <p>0</p>
func_queue-worker.2.qfmmizq0pheh@moby | <p>1</p>
func_queue-worker.2.qfmmizq0pheh@moby | <p>4</p>
func_queue-worker.3.u0egkphip73n@moby | <p>5</p>
func_queue-worker.1.s23hrotlqllx@moby | <p>3</p>
...
The work was not processed in the order that it was queued - this is perfectly normal. The queue is being depleted by three separate workers.