部署 Nex 函数

将函数部署到 Nex 的操作与部署服务一样简单。无论是 WebAssembly 类型的函数还是 JavaScript 类型的函数,其模式都是一样的。

函数触发器

使用 Nex 函数时,您可以指定一组触发主题(可以包含通配符),用于激活这些函数。例如,假设您已经部署了一个计算器服务,您可能选择了 calc.* 作为触发主题。这意味着当一个主题为 calc.add 的消息进入时,您的函数将会被调用。该函数会接收到主题名 calc.add 和 core NATS 消息中提供的有效载荷。

如果您的函数返回了有效载荷,并且您是通过 request(而不是 publish)来触发该函数,那么返回的有效载荷将会作为响应体提供。

虽然主题触发机制非常灵活且功能强大,但我们也在积极思考其他可能的触发方式,例如流上的拉取型消费者、键值存储/对象存储上的观察者等。

部署 JavaScript 函数

让我们部署我们的 JavaScript 函数。我们将使用触发主题 js.echo,以便与 WebAssembly 函数区分开来。 执行以下命令(您的 JavaScript 文件路径可能会有所不同):

$ 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

让我们确认一下该函数是否正常运行,并且可以在正确的主题上被触发:

$ nats req js.echo 'heya' 09:40:33 Sending request on "js.echo" 09:40:33 Received with rtt 2.600724ms "heya"

同时,让我们确认一下该工作负载是否在节点上可见(您的节点 ID 可能不同):

$ 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

一切运行正常,太棒了!

部署 WebAssembly 函数

现在让我们部署我们的 WebAssembly 函数。如果您没有在本地构建自己的函数到 .wasm,可以在 Github 仓库examples 文件夹中下载一个名为 echofunction.wasm 的文件。

部署这个文件的方式与刚才部署 JavaScript 函数一样:

$ 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

现在我们应该能够通过 wasm.echo 主题触发该函数:

$ nats req wasm.echo 'hello' 09:45:24 Sending request on "wasm.echo" 09:45:24 Received with rtt 42.867014ms hellowasm.echo

正如预期的那样,我们得到了与触发主题 wasm.echo 连接在一起的有效载荷。我们可以再次运行 nats node info 命令,并看到我们的两个函数工作负载:

$ 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

恭喜您,您现在已经学会使用 Nex 部署完整的服务(编译为静态二进制文件)、JavaScript 函数、WebAssembly 函数啦。使用 Nex 将您的应用程序部署为服务与函数的组合既快速又简单,并为您愉快地部署分布式应用程序做好了准备。