Skip to content
Snippets Groups Projects
Commit fc2733a2 authored by Alex Ellis's avatar Alex Ellis Committed by GitHub
Browse files

Create chaining_functions.md

parent 096bede3
No related branches found
No related tags found
No related merge requests found
# Chaining OpenFaaS functions
We will discuss client-side piping, server-side piping and the "function director" pattern.
## Client-side piping
The easiest way to chain functions is to do it on the client-side via your application code or a `curl`.
Here is an example:
We pipe a string or file into the markdown function, then pipe it into a Slack function
```
$ curl -d "# test" localhost:8080/function/markdown | \
curl localhost:8080/function/slack --data-binary -
```
You could also do this via code, or through the `faas-cli`:
```
$ echo "test" | faas-cli invoke --name markdown | \
faas-cli invoke --name slack
```
## Server-side access via gateway
On the server side you can access any other function by calling it on the gateway over HTTP.
### Function A calls B
Let's say we have two functions:
* geolocatecity - gives a city name for a lat/lon combo in JSON format
* findiss - finds the location of the International Space Station then pretty-prints the city name by using the `geolocatecity` function
findiss Python 2.7 handler:
```
import requests
def get_space_station_location():
return {"lat": 0.51112, "lon": -0.1234}
def handler(st):
location = get_space_station_location()
r = requests.post("http://gateway:8080/function/geolocatecity", location)
print("The ISS is over the following city: " + r.content)
```
### Function Director pattern
In the Function Director pattern - we create a "wrapper function" which pipes the result of function call A into function call B then returns the value to the caller. This saves on bandwidth and latency vs. client-side piping:
Take our previous example:
```
$ curl -d "# test" localhost:8080/function/markdown | \
curl localhost:8080/function/slack --data-binary -
```
markdown2slack Python 2.7 handler:
```
import requests
def handler(req):
markdown = requests.post("http://gateway:8080/function/markdown", req)
slack_result = requests.post("http://gateway:8080/function/slack", markdown.content)
print("Slack result: " + str(slack_result.status_code))
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment