Deploying functions to Nex is just as easy as deploying services. The pattern is the same for both WebAssembly and JavaScript type functions.
With Nex functions you can specify a list of trigger subjects (which can include wildcards) used to activate them. So let's say you've deployed a calculator service, you may have chosen calc.*
as the trigger subject. This
means that when a message comes in on a subject like calc.add
, your function will be called. It will be passed the subject calc.add
and
the payload supplied on the core NATS message.
If your function returns a payload, and you used a request (instead of publish) to trigger the function, that return payload will be supplied as the response body.
While the subject trigger mechanism is incredibly flexible and powerful, we are actively thinking of additional ways we might be able to trigger functions, such as pull consumers on streams, watchers on K/V or object stores, etc.
Let's deploy our JavaScript function. We're going to use the trigger subject js.echo
so we can differentiate from the WebAssembly function.
Issue the following command (your path to the JavaScript file will likely be different):
$ nex devrun /home/kevin/echofunction.js --trigger_subject=js.echo
Reusing existing issuer account key: /home/kevin/.nex/issuer.nk
Reusing existing publisher xkey: /home/kevin/.nex/publisher.xk
🚀 Workload 'echofunctionjs' accepted. You can now refer to this workload with ID: cmjud7n52omhlsa377cg on node NC7PXV2DLGXC4LTVM7W7MXYL3WVQFA345IFKJOMYA5ZDZMACLZ53NIIL
Let's make sure the function is alive and can be triggered on the right subject:
$ nats req js.echo 'heya'
09:40:33 Sending request on "js.echo"
09:40:33 Received with rtt 2.600724ms
"heya"
And let's make sure the workload is visible on the node (your node ID will be different):
$ nex node info NC7PXV2DLGXC4LTVM7W7MXYL3WVQFA345IFKJOMYA5ZDZMACLZ53NIIL
NEX Node Information
Node: NC7PXV2DLGXC4LTVM7W7MXYL3WVQFA345IFKJOMYA5ZDZMACLZ53NIIL
Xkey: XDKZMOZKVBXSY3YXPIXEFKGPML75PLD7APFHZ474EOCILZDQGPZSXJNZ
Version: 0.0.1
Uptime: 2m26s
Tags: nex.arch=amd64, nex.cpucount=8, nex.os=linux, simple=true
Memory in kB:
Free: 32,354,208
Available: 55,985,740
Total: 63,883,232
Workloads:
Id: cmjud7n52omhlsa377cg
Healthy: true
Runtime: 2m26s
Name: echofunctionjs
Description: Workload published in devmode
Everything's working as intended. Great!
Now let's deploy our WebAssembly function. If you didn't build yours locally, there's a downloadable echofunction.wasm
in the examples
folder
in the Github repository.
Deploying this file works the same way as deploying the JavaScript function:
$ nex devrun ../examples/wasm/echofunction/echofunction.wasm --trigger_subject=wasm.echo
Reusing existing issuer account key: /home/kevin/.nex/issuer.nk
Reusing existing publisher xkey: /home/kevin/.nex/publisher.xk
🚀 Workload 'echofunctionwasm' accepted. You can now refer to this workload with ID: cmjudmn52omhlsa377d0 on node NC7PXV2DLGXC4LTVM7W7MXYL3WVQFA345IFKJOMYA5ZDZMACLZ53NIIL
Now we should be able to trigger the function on the wasm.echo
subject:
$ nats req wasm.echo 'hello'
09:45:24 Sending request on "wasm.echo"
09:45:24 Received with rtt 42.867014ms
hellowasm.echo
As expected, we got the payload concatenated with the trigger subject wasm.echo
. We should be able to run the nats node info
command again and see
both of our function workloads:
$ nex node info NC7PXV2DLGXC4LTVM7W7MXYL3WVQFA345IFKJOMYA5ZDZMACLZ53NIIL
NEX Node Information
Node: NC7PXV2DLGXC4LTVM7W7MXYL3WVQFA345IFKJOMYA5ZDZMACLZ53NIIL
Xkey: XDKZMOZKVBXSY3YXPIXEFKGPML75PLD7APFHZ474EOCILZDQGPZSXJNZ
Version: 0.0.1
Uptime: 7m31s
Tags: nex.arch=amd64, nex.cpucount=8, nex.os=linux, simple=true
Memory in kB:
Free: 32,280,180
Available: 56,018,344
Total: 63,883,232
Workloads:
Id: cmjud7n52omhlsa377cg
Healthy: true
Runtime: 7m31s
Name: echofunctionjs
Description: Workload published in devmode
Id: cmjudmn52omhlsa377d0
Healthy: true
Runtime: 6m31s
Name: echofunctionwasm
Description: Workload published in devmode
Congratulations, you've now used Nex to deploy full services compiled as static binaries, JavaScript functions, and WebAssembly functions. Deploying your applications as a combination of services and functions with Nex is fast, easy, and sets you up to joyfully deploy distributed applications.